Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/stefan-niedermann/nextcloud-notes.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Niedermann <info@niedermann.it>2021-01-02 18:08:48 +0300
committerStefan Niedermann <info@niedermann.it>2021-01-02 18:08:48 +0300
commitd35ec5c80e1529453065927bebc34e091cb4261f (patch)
tree420827e2c865b4eeca1c6d2027fe1dbec66c2b47 /app/src/main/java/it/niedermann/owncloud/notes/widget
parent69d383f9f87e1207850ffdc27c0fd406c8901cf5 (diff)
Move more database queries away from the main thread
Diffstat (limited to 'app/src/main/java/it/niedermann/owncloud/notes/widget')
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListViewModel.java68
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidget.java169
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetConfigurationActivity.java81
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/notelist/NoteListWidgetFactory.java30
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidget.java60
-rw-r--r--app/src/main/java/it/niedermann/owncloud/notes/widget/singlenote/SingleNoteWidgetFactory.java16
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);