From dad6836f73e3905920f8a0a77c3c531789aa8678 Mon Sep 17 00:00:00 2001 From: Stefan Niedermann Date: Fri, 11 Jun 2021 11:05:17 +0200 Subject: [PATCH] Use ExecutorServices for running threaded tasks Signed-off-by: Stefan Niedermann --- .../owncloud/notes/edit/BaseNoteFragment.java | 23 ++++++++++--------- .../notes/edit/NotePreviewFragment.java | 8 +++---- .../importaccount/ImportAccountActivity.java | 8 +++++-- .../owncloud/notes/main/MainActivity.java | 16 ++++++++----- .../owncloud/notes/main/MainViewModel.java | 16 ++++++++----- .../main/MultiSelectedActionModeCallback.java | 15 ++++++------ .../ManageAccountsViewModel.java | 11 +++++---- .../migration/Migration_18_19.java | 8 +++++-- .../notes/widget/notelist/NoteListWidget.java | 5 +++- .../NoteListWidgetConfigurationActivity.java | 13 +++++++---- .../widget/singlenote/SingleNoteWidget.java | 6 ++++- ...SingleNoteWidgetConfigurationActivity.java | 4 ++-- .../markwon/span/InterceptedURLSpan.java | 7 ++++-- 13 files changed, 87 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java index 0a2713eb..fb46af6c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/BaseNoteFragment.java @@ -33,6 +33,8 @@ import com.nextcloud.android.sso.model.SingleSignOnAccount; import java.util.ArrayList; import java.util.Calendar; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import it.niedermann.android.util.ColorUtil; import it.niedermann.owncloud.notes.R; @@ -62,6 +64,7 @@ import static java.lang.Boolean.TRUE; public abstract class BaseNoteFragment extends BrandedFragment implements CategoryDialogListener, EditTitleListener { private static final String TAG = BaseNoteFragment.class.getSimpleName(); + protected final ExecutorService executor = Executors.newCachedThreadPool(); protected static final int MENU_ID_PIN = -1; public static final String PARAM_NOTE_ID = "noteId"; @@ -98,7 +101,7 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - new Thread(() -> { + executor.submit(() -> { try { SingleSignOnAccount ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext().getApplicationContext()); this.localAccount = repo.getAccountByName(ssoAccount.name); @@ -143,7 +146,7 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { e.printStackTrace(); } - }).start(); + }); setHasOptionsMenu(true); } @@ -214,13 +217,13 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == R.id.menu_cancel) { - new Thread(() -> { + executor.submit(() -> { if (originalNote == null) { repo.deleteNoteAndSync(localAccount, note.getId()); } else { repo.updateNoteAndSync(localAccount, originalNote, null, null, null); } - }).start(); + }); listener.close(); return true; } else if (itemId == R.id.menu_delete) { @@ -239,11 +242,9 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego showEditTitleDialog(); return true; } else if (itemId == R.id.menu_move) { - new Thread(() -> { - AccountPickerDialogFragment - .newInstance(new ArrayList<>(repo.getAccounts()), note.getAccountId()) - .show(requireActivity().getSupportFragmentManager(), BaseNoteFragment.class.getSimpleName()); - }).start(); + executor.submit(() -> AccountPickerDialogFragment + .newInstance(new ArrayList<>(repo.getAccounts()), note.getAccountId()) + .show(requireActivity().getSupportFragmentManager(), BaseNoteFragment.class.getSimpleName())); return true; } else if (itemId == R.id.menu_share) { ShareUtil.openShareDialog(requireContext(), note.getTitle(), note.getContent()); @@ -366,10 +367,10 @@ public abstract class BaseNoteFragment extends BrandedFragment implements Catego public void onTitleEdited(String newTitle) { titleModified = true; note.setTitle(newTitle); - new Thread(() -> { + executor.submit(() -> { note = repo.updateNoteAndSync(localAccount, note, note.getContent(), newTitle, null); requireActivity().runOnUiThread(() -> listener.onNoteUpdated(note)); - }).start(); + }); } public void moveNote(Account account) { diff --git a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java index f1626149..f15d0e59 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/edit/NotePreviewFragment.java @@ -155,22 +155,22 @@ public class NotePreviewFragment extends SearchableBaseNoteFragment implements O public void onRefresh() { if (noteLoaded && repo.isSyncPossible() && SSOUtil.isConfigured(getContext())) { binding.swiperefreshlayout.setRefreshing(true); - new Thread(() -> { + executor.submit(() -> { try { final Account account = repo.getAccountByName(SingleAccountHelper.getCurrentSingleSignOnAccount(requireContext()).name); - repo.addCallbackPull(account, () -> new Thread(() -> { + repo.addCallbackPull(account, () -> executor.submit(() -> { note = repo.getNoteById(note.getId()); changedText = note.getContent(); requireActivity().runOnUiThread(() -> { binding.singleNoteContent.setMarkdownString(note.getContent()); binding.swiperefreshlayout.setRefreshing(false); }); - }).start()); + })); repo.scheduleSync(account, false); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { e.printStackTrace(); } - }).start(); + }); } else { binding.swiperefreshlayout.setRefreshing(false); Toast.makeText(requireContext(), getString(R.string.error_sync, getString(R.string.error_no_network)), Toast.LENGTH_LONG).show(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java index 2abbd82d..2e78af2c 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/importaccount/ImportAccountActivity.java @@ -21,6 +21,8 @@ import com.nextcloud.android.sso.helper.SingleAccountHelper; import com.nextcloud.android.sso.ui.UiExceptionManager; import java.net.HttpURLConnection; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.branding.BrandingUtil; @@ -39,6 +41,8 @@ public class ImportAccountActivity extends AppCompatActivity { private static final String TAG = ImportAccountActivity.class.getSimpleName(); public static final int REQUEST_CODE_IMPORT_ACCOUNT = 1; + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + private ImportAccountViewModel importAccountViewModel; private ActivityImportAccountBinding binding; @@ -86,7 +90,7 @@ public class ImportAccountActivity extends AppCompatActivity { runOnUiThread(() -> binding.progressCircular.setVisibility(View.VISIBLE)); SingleAccountHelper.setCurrentAccount(getApplicationContext(), ssoAccount.name); - new Thread(() -> { + executor.submit(() -> { Log.i(TAG, "Added account: " + "name:" + ssoAccount.name + ", " + ssoAccount.url + ", userId" + ssoAccount.userId); try { Log.i(TAG, "Loading capabilities for " + ssoAccount.name); @@ -140,7 +144,7 @@ public class ImportAccountActivity extends AppCompatActivity { } }); } - }).start(); + }); }); } catch (AccountImportCancelledException e) { restoreCleanState(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java index 9ab3c81f..517904b2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainActivity.java @@ -49,6 +49,8 @@ import com.nextcloud.android.sso.helper.SingleAccountHelper; import java.net.HttpURLConnection; import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.R; @@ -104,6 +106,8 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A private static final String TAG = MainActivity.class.getSimpleName(); + protected final ExecutorService executor = Executors.newCachedThreadPool(); + protected MainViewModel mainViewModel; private CategoryViewModel categoryViewModel; @@ -164,14 +168,14 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A if (count == 0) { startActivityForResult(new Intent(this, ImportAccountActivity.class), ImportAccountActivity.REQUEST_CODE_IMPORT_ACCOUNT); } else { - new Thread(() -> { + executor.submit(() -> { try { final Account account = mainViewModel.getLocalAccountByAccountName(SingleAccountHelper.getCurrentSingleSignOnAccount(getApplicationContext()).name); runOnUiThread(() -> mainViewModel.postCurrentAccount(account)); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { runOnUiThread(() -> ExceptionDialogFragment.newInstance(e).show(getSupportFragmentManager(), ExceptionDialogFragment.class.getSimpleName())); } - }).start(); + }); } }); @@ -649,7 +653,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A try { AccountImporter.onActivityResult(requestCode, resultCode, data, this, (ssoAccount) -> { CapabilitiesWorker.update(this); - new Thread(() -> { + executor.submit(() -> { Log.i(TAG, "Added account: " + "name:" + ssoAccount.name + ", " + ssoAccount.url + ", userId" + ssoAccount.userId); try { Log.i(TAG, "Refreshing capabilities for " + ssoAccount.name); @@ -658,11 +662,11 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A mainViewModel.addAccount(ssoAccount.url, ssoAccount.userId, ssoAccount.name, capabilities, displayName, new IResponseCallback() { @Override public void onSuccess(Account result) { - new Thread(() -> { + executor.submit(() -> { Log.i(TAG, capabilities.toString()); final Account a = mainViewModel.getLocalAccountByAccountName(ssoAccount.name); runOnUiThread(() -> mainViewModel.postCurrentAccount(a)); - }).start(); + }); } @Override @@ -691,7 +695,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A }); } } - }).start(); + }); }); } catch (AccountImportCancelledException e) { Log.i(TAG, "AccountImport has been cancelled."); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java index 9497d69f..716bbd79 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MainViewModel.java @@ -26,6 +26,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.stream.Collectors; import it.niedermann.owncloud.notes.BuildConfig; @@ -67,6 +69,8 @@ public class MainViewModel extends AndroidViewModel { private static final String TAG = MainViewModel.class.getSimpleName(); + private final ExecutorService executor = Executors.newCachedThreadPool(); + private final SavedStateHandle state; private static final String KEY_CURRENT_ACCOUNT = "currentAccount"; @@ -391,7 +395,7 @@ public class MainViewModel extends AndroidViewModel { * Updates the network status if necessary and pulls the latest {@link Capabilities} of the given {@param localAccount} */ public void synchronizeCapabilities(@NonNull Account localAccount, @NonNull IResponseCallback callback) { - new Thread(() -> { + executor.submit(() -> { if (!repo.isSyncPossible()) { repo.updateNetworkStatus(); } @@ -428,14 +432,14 @@ public class MainViewModel extends AndroidViewModel { callback.onError(new NetworkErrorException("Sync is not possible, because network is not connected.")); } } - }, "SYNC_CAPABILITIES").start(); + }, "SYNC_CAPABILITIES"); } /** * Updates the network status if necessary and pulls the latest notes of the given {@param localAccount} */ public void synchronizeNotes(@NonNull Account currentAccount, @NonNull IResponseCallback callback) { - new Thread(() -> { + executor.submit(() -> { Log.v(TAG, "[synchronize] - currentAccount: " + currentAccount.getAccountName()); if (!repo.isSyncPossible()) { repo.updateNetworkStatus(); @@ -450,7 +454,7 @@ public class MainViewModel extends AndroidViewModel { callback.onError(new NetworkErrorException("Sync is not possible, because network is not connected.")); } } - }, "SYNC_NOTES").start(); + }, "SYNC_NOTES"); } public LiveData getSyncStatus() { @@ -554,12 +558,12 @@ public class MainViewModel extends AndroidViewModel { } else { Log.v(TAG, "[getNote] - currentAccount: " + currentAccount.getAccountName()); final MutableLiveData> notes = new MutableLiveData<>(); - new Thread(() -> notes.postValue( + executor.submit(() -> notes.postValue( ids .stream() .map(repo::getNoteById) .collect(Collectors.toList()) - )).start(); + )); return notes; } }); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java b/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java index fa9bb879..cb51cdfc 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/main/MultiSelectedActionModeCallback.java @@ -21,6 +21,8 @@ import com.google.android.material.snackbar.Snackbar; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.accountpicker.AccountPickerDialogFragment; @@ -32,6 +34,7 @@ import it.niedermann.owncloud.notes.shared.util.ShareUtil; public class MultiSelectedActionModeCallback implements Callback { + private final ExecutorService executor = Executors.newSingleThreadExecutor(); @ColorInt private final int colorAccent; @NonNull @@ -125,11 +128,9 @@ public class MultiSelectedActionModeCallback implements Callback { final LiveData currentAccount$ = mainViewModel.getCurrentAccount(); currentAccount$.observe(lifecycleOwner, account -> { currentAccount$.removeObservers(lifecycleOwner); - new Thread(() -> { - AccountPickerDialogFragment - .newInstance(new ArrayList<>(mainViewModel.getAccounts()), account.getId()) - .show(fragmentManager, AccountPickerDialogFragment.class.getSimpleName()); - }).start(); + executor.submit(() -> AccountPickerDialogFragment + .newInstance(new ArrayList<>(mainViewModel.getAccounts()), account.getId()) + .show(fragmentManager, AccountPickerDialogFragment.class.getSimpleName())); }); return true; } else if (itemId == R.id.menu_share) { @@ -139,7 +140,7 @@ public class MultiSelectedActionModeCallback implements Callback { } tracker.clearSelection(); - new Thread(() -> { + executor.submit(() -> { if (selection.size() == 1) { final Note note = mainViewModel.getFullNote(selection.get(0)); ShareUtil.openShareDialog(context, note.getTitle(), note.getContent()); @@ -148,7 +149,7 @@ public class MultiSelectedActionModeCallback implements Callback { context.getResources().getQuantityString(R.plurals.share_multiple, selection.size(), selection.size()), mainViewModel.collectNoteContents(selection)); } - }).start(); + }); return true; } else if (itemId == R.id.menu_category) {// TODO detect whether all selected notes do have the same category - in this case preselect it final LiveData accountLiveData = mainViewModel.getCurrentAccount(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java index 2ee45cf8..ce88f2c2 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/manageaccounts/ManageAccountsViewModel.java @@ -13,8 +13,9 @@ import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; import com.nextcloud.android.sso.helper.SingleAccountHelper; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; -import it.niedermann.owncloud.notes.persistence.NotesDatabase; import it.niedermann.owncloud.notes.persistence.NotesRepository; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.shared.model.IResponseCallback; @@ -23,7 +24,7 @@ import static androidx.lifecycle.Transformations.distinctUntilChanged; public class ManageAccountsViewModel extends AndroidViewModel { - private static final String TAG = ManageAccountsViewModel.class.getSimpleName(); + private final ExecutorService executor = Executors.newCachedThreadPool(); @NonNull private final NotesRepository repo; @@ -46,7 +47,7 @@ public class ManageAccountsViewModel extends AndroidViewModel { } public void deleteAccount(@NonNull Account account, @NonNull Context context) { - new Thread(() -> { + executor.submit(() -> { final List accounts = repo.getAccounts(); for (int i = 0; i < accounts.size(); i++) { if (accounts.get(i).getId() == account.getId()) { @@ -61,7 +62,7 @@ public class ManageAccountsViewModel extends AndroidViewModel { break; } } - }).start(); + }); } public void selectAccount(@Nullable Account account, @NonNull Context context) { @@ -69,6 +70,6 @@ public class ManageAccountsViewModel extends AndroidViewModel { } public void countUnsynchronizedNotes(long accountId, @NonNull IResponseCallback callback) { - new Thread(() -> callback.onSuccess(repo.countUnsynchronizedNotes(accountId))).start(); + executor.submit(() -> callback.onSuccess(repo.countUnsynchronizedNotes(accountId))); } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_18_19.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_18_19.java index 343f9e81..576e2204 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_18_19.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/migration/Migration_18_19.java @@ -9,9 +9,13 @@ import androidx.sqlite.db.SupportSQLiteDatabase; import com.bumptech.glide.Glide; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + public class Migration_18_19 extends Migration { private static final String TAG = Migration_18_19.class.getSimpleName(); + private final ExecutorService executor = Executors.newSingleThreadExecutor(); @NonNull private final Context context; @@ -27,9 +31,9 @@ public class Migration_18_19 extends Migration { */ @Override public void migrate(@NonNull SupportSQLiteDatabase db) { - new Thread(() -> { + executor.submit(() -> { Log.i(TAG, "Clearing Glide disk cache"); Glide.get(context.getApplicationContext()).clearDiskCache(); - }).start(); + }); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java index 7cc84de3..8825ad98 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java @@ -11,6 +11,8 @@ import android.util.Log; import android.widget.RemoteViews; import java.util.NoSuchElementException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.persistence.NotesRepository; @@ -18,6 +20,7 @@ import it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData; public class NoteListWidget extends AppWidgetProvider { private static final String TAG = NoteListWidget.class.getSimpleName(); + private final ExecutorService executor = Executors.newCachedThreadPool(); static void updateAppWidget(Context context, AppWidgetManager awm, int[] appWidgetIds) { final NotesRepository repo = NotesRepository.getInstance(context); @@ -83,7 +86,7 @@ public class NoteListWidget extends AppWidgetProvider { final NotesRepository repo = NotesRepository.getInstance(context); for (int appWidgetId : appWidgetIds) { - new Thread(() -> repo.removeNoteListWidget(appWidgetId)).start(); + executor.submit(() -> repo.removeNoteListWidget(appWidgetId)); } } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java index a750ee1e..3d7122da 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java @@ -14,6 +14,9 @@ import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundExce import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; import com.nextcloud.android.sso.helper.SingleAccountHelper; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; @@ -34,6 +37,8 @@ import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType. public class NoteListWidgetConfigurationActivity extends LockedActivity { private static final String TAG = Activity.class.getSimpleName(); + private final ExecutorService executor = Executors.newCachedThreadPool(); + private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; private Account localAccount = null; @@ -104,7 +109,7 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { data.setAccountId(localAccount.getId()); data.setThemeMode(NotesApplication.getAppTheme(getApplicationContext()).getModeId()); - new Thread(() -> { + executor.submit(() -> { repo.createOrUpdateNoteListWidgetData(data); final Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, getApplicationContext(), NoteListWidget.class) @@ -112,7 +117,7 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { setResult(RESULT_OK, updateIntent); getApplicationContext().sendBroadcast(updateIntent); finish(); - }).start(); + }); } public void onIconClick(NavigationItem item) { @@ -122,7 +127,7 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { binding.recyclerView.setAdapter(adapterCategories); - new Thread(() -> { + executor.submit(() -> { try { this.localAccount = repo.getAccountByName(SingleAccountHelper.getCurrentSingleSignOnAccount(this).name); } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { @@ -133,7 +138,7 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { finish(); } runOnUiThread(() -> viewModel.getAdapterCategories(localAccount.getId()).observe(this, (navigationItems) -> adapterCategories.setItems(navigationItems))); - }).start(); + }); } @Override diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.java index e208603a..106b9f93 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.java @@ -10,6 +10,9 @@ import android.net.Uri; import android.util.Log; import android.widget.RemoteViews; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import it.niedermann.owncloud.notes.R; import it.niedermann.owncloud.notes.edit.BaseNoteFragment; import it.niedermann.owncloud.notes.edit.EditNoteActivity; @@ -19,6 +22,7 @@ import it.niedermann.owncloud.notes.persistence.entity.SingleNoteWidgetData; public class SingleNoteWidget extends AppWidgetProvider { private static final String TAG = SingleNoteWidget.class.getSimpleName(); + private final ExecutorService executor = Executors.newCachedThreadPool(); static void updateAppWidget(Context context, AppWidgetManager awm, int[] appWidgetIds) { final Intent templateIntent = new Intent(context, EditNoteActivity.class); @@ -69,7 +73,7 @@ public class SingleNoteWidget extends AppWidgetProvider { final NotesRepository repo = NotesRepository.getInstance(context); for (int appWidgetId : appWidgetIds) { - new Thread(() -> repo.removeSingleNoteWidget(appWidgetId)).start(); + executor.submit(() -> repo.removeSingleNoteWidget(appWidgetId)); } super.onDeleted(context, appWidgetIds); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetConfigurationActivity.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetConfigurationActivity.java index eb06201a..a487e669 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetConfigurationActivity.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetConfigurationActivity.java @@ -52,7 +52,7 @@ public class SingleNoteWidgetConfigurationActivity extends MainActivity { int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - new Thread(() -> { + executor.submit(() -> { try { mainViewModel.createOrUpdateSingleNoteWidgetData( new SingleNoteWidgetData( @@ -71,6 +71,6 @@ public class SingleNoteWidgetConfigurationActivity extends MainActivity { } catch (SQLException e) { Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); } - }).start(); + }); } } diff --git a/markdown/src/main/java/it/niedermann/android/markdown/markwon/span/InterceptedURLSpan.java b/markdown/src/main/java/it/niedermann/android/markdown/markwon/span/InterceptedURLSpan.java index d6c57659..35c456e0 100644 --- a/markdown/src/main/java/it/niedermann/android/markdown/markwon/span/InterceptedURLSpan.java +++ b/markdown/src/main/java/it/niedermann/android/markdown/markwon/span/InterceptedURLSpan.java @@ -7,6 +7,8 @@ import android.view.View; import androidx.annotation.NonNull; import java.util.Collection; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.function.Function; public class InterceptedURLSpan extends URLSpan { @@ -14,6 +16,7 @@ public class InterceptedURLSpan extends URLSpan { private static final String TAG = InterceptedURLSpan.class.getSimpleName(); @NonNull private final Collection> onLinkClickCallbacks; + private final ExecutorService executor = Executors.newCachedThreadPool(); public InterceptedURLSpan(@NonNull Collection> onLinkClickCallbacks, String url) { super(url); @@ -23,7 +26,7 @@ public class InterceptedURLSpan extends URLSpan { @Override public void onClick(View widget) { if (onLinkClickCallbacks.size() > 0) { - new Thread(() -> { + executor.submit(() -> { for (Function callback : onLinkClickCallbacks) { try { if (callback.apply(getURL())) { @@ -34,7 +37,7 @@ public class InterceptedURLSpan extends URLSpan { } } super.onClick(widget); - }).start(); + }); } else { super.onClick(widget); }