diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-01-02 18:08:48 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-01-02 18:08:48 +0300 |
commit | d35ec5c80e1529453065927bebc34e091cb4261f (patch) | |
tree | 420827e2c865b4eeca1c6d2027fe1dbec66c2b47 /app/src/main/java/it/niedermann/owncloud/notes/widget | |
parent | 69d383f9f87e1207850ffdc27c0fd406c8901cf5 (diff) |
Move more database queries away from the main thread
Diffstat (limited to 'app/src/main/java/it/niedermann/owncloud/notes/widget')
6 files changed, 235 insertions, 189 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListViewModel.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListViewModel.java new file mode 100644 index 00000000..09af033c --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListViewModel.java @@ -0,0 +1,68 @@ +package it.niedermann.owncloud.notes.widget.notelist; + +import android.app.Application; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; + +import java.util.ArrayList; +import java.util.List; + +import it.niedermann.owncloud.notes.R; +import it.niedermann.owncloud.notes.main.MainActivity; +import it.niedermann.owncloud.notes.main.navigation.NavigationAdapter; +import it.niedermann.owncloud.notes.main.navigation.NavigationItem; +import it.niedermann.owncloud.notes.persistence.NotesDatabase; + +import static androidx.lifecycle.Transformations.distinctUntilChanged; +import static androidx.lifecycle.Transformations.map; +import static androidx.lifecycle.Transformations.switchMap; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES; +import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT; +import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.convertToCategoryNavigationItem; + +public class NoteListViewModel extends AndroidViewModel { + + private static final String TAG = NoteListViewModel.class.getSimpleName(); + + @NonNull + private final NotesDatabase db; + + public NoteListViewModel(@NonNull Application application) { + super(application); + this.db = NotesDatabase.getInstance(application); + } + + public LiveData<List<NavigationItem>> getAdapterCategories(Long accountId) { + return distinctUntilChanged( + switchMap(distinctUntilChanged(db.getNoteDao().countLiveData(accountId)), (count) -> { + Log.v(TAG, "[getAdapterCategories] countLiveData: " + count); + return switchMap(distinctUntilChanged(db.getNoteDao().getFavoritesCountLiveData(accountId)), (favoritesCount) -> { + Log.v(TAG, "[getAdapterCategories] getFavoritesCountLiveData: " + favoritesCount); + return map(distinctUntilChanged(db.getNoteDao().getCategoriesLiveData(accountId)), fromDatabase -> { + final List<NavigationItem.CategoryNavigationItem> categories = convertToCategoryNavigationItem(getApplication(), fromDatabase); + + final List<NavigationItem> items = new ArrayList<>(fromDatabase.size() + 3); + items.add(new NavigationItem(MainActivity.ADAPTER_KEY_RECENT, getApplication().getString(R.string.label_all_notes), count, R.drawable.ic_access_time_grey600_24dp, RECENT)); + items.add(new NavigationItem(MainActivity.ADAPTER_KEY_STARRED, getApplication().getString(R.string.label_favorites), favoritesCount, R.drawable.ic_star_yellow_24dp, FAVORITES)); + + if (categories.size() > 2 && categories.get(2).label.isEmpty()) { + items.add(new NavigationItem(MainActivity.ADAPTER_KEY_UNCATEGORIZED, "", null, NavigationAdapter.ICON_NOFOLDER)); + } + + for (NavigationItem item : categories) { + final int slashIndex = item.label.indexOf('/'); + + item.label = slashIndex < 0 ? item.label : item.label.substring(0, slashIndex); + item.id = "category:" + item.label; + items.add(item); + } + return items; + }); + }); + }) + ); + } +} 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 6b6d5050..77c11ac6 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 @@ -38,94 +38,95 @@ public class NoteListWidget extends AppWidgetProvider { static void updateAppWidget(Context context, AppWidgetManager awm, int[] appWidgetIds) { final NotesDatabase db = NotesDatabase.getInstance(context); - RemoteViews views; - DarkModeSetting darkTheme; - for (int appWidgetId : appWidgetIds) { - final NotesListWidgetData data = db.getWidgetNotesListDao().getNoteListWidgetData(appWidgetId); - if (data != null) { - final Account localAccount = db.getAccountDao().getAccount(data.getAccountId()); - - String category = data.getCategory(); - - darkTheme = DarkModeSetting.fromModeID(data.getThemeMode()); - - Intent serviceIntent = new Intent(context, NoteListWidgetService.class); - serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); - - // Launch application when user taps the header icon or app title - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setComponent(new ComponentName(context.getPackageName(), - MainActivity.class.getName())); - - // Open the main app if the user taps the widget header - PendingIntent openAppI = PendingIntent.getActivity(context, PENDING_INTENT_OPEN_APP_RQ, - intent, - PendingIntent.FLAG_UPDATE_CURRENT); - - // Launch create note activity if user taps "+" icon on header - PendingIntent newNoteI = PendingIntent.getActivity(context, (PENDING_INTENT_NEW_NOTE_RQ + appWidgetId), - new Intent(context, EditNoteActivity.class).putExtra(PARAM_CATEGORY, - data.getMode() == MODE_DISPLAY_STARRED - ? new NavigationCategory(ENavigationCategoryType.FAVORITES) - : new NavigationCategory(localAccount.getId(), category)), - PendingIntent.FLAG_UPDATE_CURRENT); - - PendingIntent templatePI = PendingIntent.getActivity(context, PENDING_INTENT_EDIT_NOTE_RQ, - new Intent(context, EditNoteActivity.class), - PendingIntent.FLAG_UPDATE_CURRENT); - - Log.v(TAG, "-- data - " + data); - - if (NotesApplication.isDarkThemeActive(context, darkTheme)) { - views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list_dark); - views.setTextViewText(R.id.widget_note_list_title_tv_dark, getWidgetTitle(context, data.getMode(), category)); - views.setOnClickPendingIntent(R.id.widget_note_header_icon_dark, openAppI); - views.setOnClickPendingIntent(R.id.widget_note_list_title_tv_dark, openAppI); - views.setOnClickPendingIntent(R.id.widget_note_list_create_icon_dark, newNoteI); - views.setPendingIntentTemplate(R.id.note_list_widget_lv_dark, templatePI); - views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv_dark, serviceIntent); - views.setEmptyView(R.id.note_list_widget_lv_dark, R.id.widget_note_list_placeholder_tv_dark); - awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv_dark); - if (BrandingUtil.isBrandingEnabled(context)) { - views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", localAccount.getColor()); - views.setInt(R.id.widget_note_header_icon_dark, "setColorFilter", localAccount.getTextColor()); - views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", localAccount.getTextColor()); - views.setTextColor(R.id.widget_note_list_title_tv_dark, localAccount.getTextColor()); + new Thread(() -> { + RemoteViews views; + DarkModeSetting darkTheme; + final NotesListWidgetData data = db.getWidgetNotesListDao().getNoteListWidgetData(appWidgetId); + if (data != null) { + final Account localAccount = db.getAccountDao().getAccount(data.getAccountId()); + + String category = data.getCategory(); + + darkTheme = DarkModeSetting.fromModeID(data.getThemeMode()); + + Intent serviceIntent = new Intent(context, NoteListWidgetService.class); + serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); + + // Launch application when user taps the header icon or app title + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setComponent(new ComponentName(context.getPackageName(), + MainActivity.class.getName())); + + // Open the main app if the user taps the widget header + PendingIntent openAppI = PendingIntent.getActivity(context, PENDING_INTENT_OPEN_APP_RQ, + intent, + PendingIntent.FLAG_UPDATE_CURRENT); + + // Launch create note activity if user taps "+" icon on header + PendingIntent newNoteI = PendingIntent.getActivity(context, (PENDING_INTENT_NEW_NOTE_RQ + appWidgetId), + new Intent(context, EditNoteActivity.class).putExtra(PARAM_CATEGORY, + data.getMode() == MODE_DISPLAY_STARRED + ? new NavigationCategory(ENavigationCategoryType.FAVORITES) + : new NavigationCategory(localAccount.getId(), category)), + PendingIntent.FLAG_UPDATE_CURRENT); + + PendingIntent templatePI = PendingIntent.getActivity(context, PENDING_INTENT_EDIT_NOTE_RQ, + new Intent(context, EditNoteActivity.class), + PendingIntent.FLAG_UPDATE_CURRENT); + + Log.v(TAG, "-- data - " + data); + + if (NotesApplication.isDarkThemeActive(context, darkTheme)) { + views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list_dark); + views.setTextViewText(R.id.widget_note_list_title_tv_dark, getWidgetTitle(context, data.getMode(), category)); + views.setOnClickPendingIntent(R.id.widget_note_header_icon_dark, openAppI); + views.setOnClickPendingIntent(R.id.widget_note_list_title_tv_dark, openAppI); + views.setOnClickPendingIntent(R.id.widget_note_list_create_icon_dark, newNoteI); + views.setPendingIntentTemplate(R.id.note_list_widget_lv_dark, templatePI); + views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv_dark, serviceIntent); + views.setEmptyView(R.id.note_list_widget_lv_dark, R.id.widget_note_list_placeholder_tv_dark); + awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv_dark); + if (BrandingUtil.isBrandingEnabled(context)) { + views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", localAccount.getColor()); + views.setInt(R.id.widget_note_header_icon_dark, "setColorFilter", localAccount.getTextColor()); + views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", localAccount.getTextColor()); + views.setTextColor(R.id.widget_note_list_title_tv_dark, localAccount.getTextColor()); + } else { + views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand)); + views.setInt(R.id.widget_note_header_icon_dark, "setColorFilter", Color.WHITE); + views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", Color.WHITE); + views.setTextColor(R.id.widget_note_list_title_tv_dark, Color.WHITE); + } } else { - views.setInt(R.id.widget_note_header_dark, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand)); - views.setInt(R.id.widget_note_header_icon_dark, "setColorFilter", Color.WHITE); - views.setInt(R.id.widget_note_list_create_icon_dark, "setColorFilter", Color.WHITE); - views.setTextColor(R.id.widget_note_list_title_tv_dark, Color.WHITE); + views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list); + views.setTextViewText(R.id.widget_note_list_title_tv, getWidgetTitle(context, data.getMode(), category)); + views.setOnClickPendingIntent(R.id.widget_note_header_icon, openAppI); + views.setOnClickPendingIntent(R.id.widget_note_list_title_tv, openAppI); + views.setOnClickPendingIntent(R.id.widget_note_list_create_icon, newNoteI); + views.setPendingIntentTemplate(R.id.note_list_widget_lv, templatePI); + views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv, serviceIntent); + views.setEmptyView(R.id.note_list_widget_lv, R.id.widget_note_list_placeholder_tv); + awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv); + if (BrandingUtil.isBrandingEnabled(context)) { + views.setInt(R.id.widget_note_header, "setBackgroundColor", localAccount.getColor()); + views.setInt(R.id.widget_note_header_icon, "setColorFilter", localAccount.getTextColor()); + views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", localAccount.getTextColor()); + views.setTextColor(R.id.widget_note_list_title_tv, localAccount.getTextColor()); + } else { + views.setInt(R.id.widget_note_header, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand)); + views.setInt(R.id.widget_note_header_icon, "setColorFilter", Color.WHITE); + views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", Color.WHITE); + views.setTextColor(R.id.widget_note_list_title_tv, Color.WHITE); + } } + + awm.updateAppWidget(appWidgetId, views); } else { - views = new RemoteViews(context.getPackageName(), R.layout.widget_note_list); - views.setTextViewText(R.id.widget_note_list_title_tv, getWidgetTitle(context, data.getMode(), category)); - views.setOnClickPendingIntent(R.id.widget_note_header_icon, openAppI); - views.setOnClickPendingIntent(R.id.widget_note_list_title_tv, openAppI); - views.setOnClickPendingIntent(R.id.widget_note_list_create_icon, newNoteI); - views.setPendingIntentTemplate(R.id.note_list_widget_lv, templatePI); - views.setRemoteAdapter(appWidgetId, R.id.note_list_widget_lv, serviceIntent); - views.setEmptyView(R.id.note_list_widget_lv, R.id.widget_note_list_placeholder_tv); - awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.note_list_widget_lv); - if (BrandingUtil.isBrandingEnabled(context)) { - views.setInt(R.id.widget_note_header, "setBackgroundColor", localAccount.getColor()); - views.setInt(R.id.widget_note_header_icon, "setColorFilter", localAccount.getTextColor()); - views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", localAccount.getTextColor()); - views.setTextColor(R.id.widget_note_list_title_tv, localAccount.getTextColor()); - } else { - views.setInt(R.id.widget_note_header, "setBackgroundColor", context.getResources().getColor(R.color.defaultBrand)); - views.setInt(R.id.widget_note_header_icon, "setColorFilter", Color.WHITE); - views.setInt(R.id.widget_note_list_create_icon, "setColorFilter", Color.WHITE); - views.setTextColor(R.id.widget_note_list_title_tv, Color.WHITE); - } + Log.i(TAG, "onUpdate has been triggered before the user finished configuring the widget"); } - - awm.updateAppWidget(appWidgetId, views); - } else { - Log.i(TAG, "onUpdate has been triggered before the user finished configuring the widget"); - } + }).start(); } } @@ -163,7 +164,7 @@ public class NoteListWidget extends AppWidgetProvider { final NotesDatabase db = NotesDatabase.getInstance(context); for (int appWidgetId : appWidgetIds) { - db.getWidgetNotesListDao().removeNoteListWidget(appWidgetId); + new Thread(() -> db.getWidgetNotesListDao().removeNoteListWidget(appWidgetId)).start(); } } 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 eb251a9c..70d5bf4d 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 @@ -8,6 +8,7 @@ import android.util.Log; import android.widget.Toast; import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -15,13 +16,10 @@ import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundExce import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; import com.nextcloud.android.sso.helper.SingleAccountHelper; -import java.util.ArrayList; -import java.util.List; - import it.niedermann.owncloud.notes.LockedActivity; import it.niedermann.owncloud.notes.NotesApplication; import it.niedermann.owncloud.notes.R; -import it.niedermann.owncloud.notes.main.MainActivity; +import it.niedermann.owncloud.notes.databinding.ActivityNoteListConfigurationBinding; import it.niedermann.owncloud.notes.main.navigation.NavigationAdapter; import it.niedermann.owncloud.notes.main.navigation.NavigationClickListener; import it.niedermann.owncloud.notes.main.navigation.NavigationItem; @@ -29,14 +27,10 @@ import it.niedermann.owncloud.notes.persistence.NotesDatabase; import it.niedermann.owncloud.notes.persistence.entity.Account; import it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData; -import static androidx.lifecycle.Transformations.distinctUntilChanged; -import static androidx.lifecycle.Transformations.map; import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_ALL; import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_CATEGORY; import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetData.MODE_DISPLAY_STARRED; -import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.FAVORITES; import static it.niedermann.owncloud.notes.shared.model.ENavigationCategoryType.RECENT; -import static it.niedermann.owncloud.notes.shared.util.DisplayUtils.convertToCategoryNavigationItem; public class NoteListWidgetConfigurationActivity extends LockedActivity { @@ -46,6 +40,8 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { private Account localAccount = null; + private ActivityNoteListConfigurationBinding binding; + private NoteListViewModel viewModel; private NavigationAdapter adapterCategories; private NotesDatabase db = null; @@ -56,16 +52,6 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { setContentView(R.layout.activity_note_list_configuration); db = NotesDatabase.getInstance(this); - try { - this.localAccount = db.getAccountDao().getLocalAccountByAccountName(SingleAccountHelper.getCurrentSingleSignOnAccount(this).name); - } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { - e.printStackTrace(); - Toast.makeText(this, R.string.widget_not_logged_in, Toast.LENGTH_LONG).show(); - // TODO Present user with app login screen - Log.w(TAG, "onCreate: user not logged in"); - finish(); - return; - } final Bundle extras = getIntent().getExtras(); if (extras != null) { @@ -78,9 +64,9 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { finish(); } - RecyclerView recyclerView; - RecyclerView.LayoutManager layoutManager; - + viewModel = new ViewModelProvider(this).get(NoteListViewModel.class); + binding = ActivityNoteListConfigurationBinding.inflate(getLayoutInflater()); + binding.recyclerView.setAdapter(adapterCategories); adapterCategories = new NavigationAdapter(this, new NavigationClickListener() { @Override public void onItemClick(NavigationItem item) { @@ -120,14 +106,15 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { data.setAccountId(localAccount.getId()); data.setThemeMode(NotesApplication.getAppTheme(getApplicationContext()).getModeId()); - db.getWidgetNotesListDao().createOrUpdateNoteListWidgetData(data); + new Thread(() -> { + db.getWidgetNotesListDao().createOrUpdateNoteListWidgetData(data); - Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, - getApplicationContext(), NoteListWidget.class); - updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - setResult(RESULT_OK, updateIntent); - getApplicationContext().sendBroadcast(updateIntent); - finish(); + final Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, getApplicationContext(), NoteListWidget.class) + .putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + setResult(RESULT_OK, updateIntent); + getApplicationContext().sendBroadcast(updateIntent); + finish(); + }).start(); } public void onIconClick(NavigationItem item) { @@ -135,32 +122,18 @@ public class NoteListWidgetConfigurationActivity extends LockedActivity { } }); - recyclerView = findViewById(R.id.recycler_view); - recyclerView.setHasFixedSize(true); - layoutManager = new LinearLayoutManager(this); - recyclerView.setLayoutManager(layoutManager); - recyclerView.setAdapter(adapterCategories); - distinctUntilChanged( - map(db.getNoteDao().getCategoriesLiveData(localAccount.getId()), fromDatabase -> { - List<NavigationItem.CategoryNavigationItem> categories = convertToCategoryNavigationItem(NoteListWidgetConfigurationActivity.this, fromDatabase); - - ArrayList<NavigationItem> items = new ArrayList<>(fromDatabase.size() + 3); - items.add(new NavigationItem(MainActivity.ADAPTER_KEY_RECENT, getString(R.string.label_all_notes), db.getNoteDao().count(localAccount.getId()), R.drawable.ic_access_time_grey600_24dp, RECENT)); - items.add(new NavigationItem(MainActivity.ADAPTER_KEY_STARRED, getString(R.string.label_favorites), db.getNoteDao().getFavoritesCount(localAccount.getId()), R.drawable.ic_star_yellow_24dp, FAVORITES)); - - if (categories.size() > 2 && categories.get(2).label.isEmpty()) { - items.add(new NavigationItem(MainActivity.ADAPTER_KEY_UNCATEGORIZED, "", null, NavigationAdapter.ICON_NOFOLDER)); - } - - for (NavigationItem item : categories) { - int slashIndex = item.label.indexOf('/'); - - item.label = slashIndex < 0 ? item.label : item.label.substring(0, slashIndex); - item.id = "category:" + item.label; - items.add(item); - } - return items; - })).observe(this, (navigationItems) -> adapterCategories.setItems(navigationItems)); + new Thread(() -> { + try { + this.localAccount = db.getAccountDao().getLocalAccountByAccountName(SingleAccountHelper.getCurrentSingleSignOnAccount(this).name); + } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { + e.printStackTrace(); + Toast.makeText(this, R.string.widget_not_logged_in, Toast.LENGTH_LONG).show(); + // TODO Present user with app login screen + Log.w(TAG, "onCreate: user not logged in"); + 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/notelist/NoteListWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java index 5b200f8f..72a69b18 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java @@ -5,6 +5,8 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.widget.RemoteViews; import android.widget.RemoteViewsService; @@ -29,26 +31,30 @@ import static it.niedermann.owncloud.notes.persistence.entity.NotesListWidgetDat public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFactory { private static final String TAG = NoteListWidgetFactory.class.getSimpleName(); + private final NotesDatabase db; + private final int appWidgetId; private final Context context; - private final NotesListWidgetData data; - private final boolean darkTheme; - private NotesDatabase db; + private boolean darkTheme; private List<Note> noteEntities; NoteListWidgetFactory(Context context, Intent intent) { this.context = context; - final int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - db = NotesDatabase.getInstance(context); - data = db.getWidgetNotesListDao().getNoteListWidgetData(appWidgetId); - - darkTheme = NotesApplication.isDarkThemeActive(context, DarkModeSetting.fromModeID(data.getThemeMode())); + this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); + this.db = NotesDatabase.getInstance(context); } @Override public void onCreate() { + // NoOp + } + + @Override + public void onDataSetChanged() { final LiveData<List<Note>> noteEntitiesLiveData; try { + NotesListWidgetData data = db.getWidgetNotesListDao().getNoteListWidgetData(appWidgetId); + darkTheme = NotesApplication.isDarkThemeActive(context, DarkModeSetting.fromModeID(data.getThemeMode())); Log.v(TAG, "--- data - " + data); switch (data.getMode()) { case MODE_DISPLAY_ALL: @@ -66,18 +72,14 @@ public class NoteListWidgetFactory implements RemoteViewsService.RemoteViewsFact } break; } - noteEntitiesLiveData.observeForever((notes) -> noteEntities = notes); + + new Handler(Looper.getMainLooper()).post(() -> noteEntitiesLiveData.observeForever((notes) -> noteEntities = notes)); } catch (IllegalArgumentException e) { e.printStackTrace(); } } @Override - public void onDataSetChanged() { - // NoOp - } - - @Override public void onDestroy() { // NoOp } 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 9791594a..3637f72d 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 @@ -27,36 +27,38 @@ public class SingleNoteWidget extends AppWidgetProvider { final NotesDatabase db = NotesDatabase.getInstance(context); for (int appWidgetId : appWidgetIds) { - final SingleNoteWidgetData data = db.getWidgetSingleNoteDao().getSingleNoteWidgetData(appWidgetId); - if (data != null) { - templateIntent.putExtra(BaseNoteFragment.PARAM_ACCOUNT_ID, data.getAccountId()); - - final PendingIntent templatePendingIntent = PendingIntent.getActivity(context, appWidgetId, templateIntent, - PendingIntent.FLAG_UPDATE_CURRENT); - - Intent serviceIntent = new Intent(context, SingleNoteWidgetService.class); - serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); - - RemoteViews views; - - if (NotesApplication.isDarkThemeActive(context, DarkModeSetting.fromModeID(data.getThemeMode()))) { - views = new RemoteViews(context.getPackageName(), R.layout.widget_single_note_dark); - views.setPendingIntentTemplate(R.id.single_note_widget_lv_dark, templatePendingIntent); - views.setRemoteAdapter(R.id.single_note_widget_lv_dark, serviceIntent); - views.setEmptyView(R.id.single_note_widget_lv_dark, R.id.widget_single_note_placeholder_tv_dark); - awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.single_note_widget_lv_dark); + new Thread(() -> { + final SingleNoteWidgetData data = db.getWidgetSingleNoteDao().getSingleNoteWidgetData(appWidgetId); + if (data != null) { + templateIntent.putExtra(BaseNoteFragment.PARAM_ACCOUNT_ID, data.getAccountId()); + + final PendingIntent templatePendingIntent = PendingIntent.getActivity(context, appWidgetId, templateIntent, + PendingIntent.FLAG_UPDATE_CURRENT); + + Intent serviceIntent = new Intent(context, SingleNoteWidgetService.class); + serviceIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); + serviceIntent.setData(Uri.parse(serviceIntent.toUri(Intent.URI_INTENT_SCHEME))); + + RemoteViews views; + + if (NotesApplication.isDarkThemeActive(context, DarkModeSetting.fromModeID(data.getThemeMode()))) { + views = new RemoteViews(context.getPackageName(), R.layout.widget_single_note_dark); + views.setPendingIntentTemplate(R.id.single_note_widget_lv_dark, templatePendingIntent); + views.setRemoteAdapter(R.id.single_note_widget_lv_dark, serviceIntent); + views.setEmptyView(R.id.single_note_widget_lv_dark, R.id.widget_single_note_placeholder_tv_dark); + awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.single_note_widget_lv_dark); + } else { + views = new RemoteViews(context.getPackageName(), R.layout.widget_single_note); + views.setPendingIntentTemplate(R.id.single_note_widget_lv, templatePendingIntent); + views.setRemoteAdapter(R.id.single_note_widget_lv, serviceIntent); + views.setEmptyView(R.id.single_note_widget_lv, R.id.widget_single_note_placeholder_tv); + awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.single_note_widget_lv); + } + awm.updateAppWidget(appWidgetId, views); } else { - views = new RemoteViews(context.getPackageName(), R.layout.widget_single_note); - views.setPendingIntentTemplate(R.id.single_note_widget_lv, templatePendingIntent); - views.setRemoteAdapter(R.id.single_note_widget_lv, serviceIntent); - views.setEmptyView(R.id.single_note_widget_lv, R.id.widget_single_note_placeholder_tv); - awm.notifyAppWidgetViewDataChanged(appWidgetId, R.id.single_note_widget_lv); + Log.i(TAG, "onUpdate has been triggered before the user finished configuring the widget"); } - awm.updateAppWidget(appWidgetId, views); - } else { - Log.i(TAG, "onUpdate has been triggered before the user finished configuring the widget"); - } + }).start(); } } @@ -80,7 +82,7 @@ public class SingleNoteWidget extends AppWidgetProvider { final NotesDatabase db = NotesDatabase.getInstance(context); for (int appWidgetId : appWidgetIds) { - db.getWidgetSingleNoteDao().removeSingleNoteWidget(appWidgetId); + new Thread(() -> db.getWidgetSingleNoteDao().removeSingleNoteWidget(appWidgetId)).start(); } super.onDeleted(context, appWidgetIds); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java index 49783eae..ea36d705 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java @@ -31,15 +31,14 @@ public class SingleNoteWidgetFactory implements RemoteViewsService.RemoteViewsFa SingleNoteWidgetFactory(Context context, Intent intent) { this.context = context; - this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, - AppWidgetManager.INVALID_APPWIDGET_ID); + this.appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); this.db = NotesDatabase.getInstance(context); - final SingleNoteWidgetData data = db.getWidgetSingleNoteDao().getSingleNoteWidgetData(appWidgetId); - if (data != null) { - darkModeActive = NotesApplication.isDarkThemeActive(context, DarkModeSetting.fromModeID(data.getThemeMode())); - } else { - Log.w(TAG, "Widget with ID " + appWidgetId + " seems to be not configured yet."); - } +// final SingleNoteWidgetData data = db.getWidgetSingleNoteDao().getSingleNoteWidgetData(appWidgetId); +// if (data != null) { +// darkModeActive = NotesApplication.isDarkThemeActive(context, DarkModeSetting.fromModeID(data.getThemeMode())); +// } else { +// Log.w(TAG, "Widget with ID " + appWidgetId + " seems to be not configured yet."); +// } } @Override @@ -51,6 +50,7 @@ public class SingleNoteWidgetFactory implements RemoteViewsService.RemoteViewsFa public void onDataSetChanged() { final SingleNoteWidgetData data = db.getWidgetSingleNoteDao().getSingleNoteWidgetData(appWidgetId); if (data != null) { + darkModeActive = NotesApplication.isDarkThemeActive(context, DarkModeSetting.fromModeID(data.getThemeMode())); final long noteId = data.getNoteId(); Log.v(TAG, "Fetch note with id " + noteId); note = db.getNoteDao().getNoteById(noteId); |