diff options
author | desperateCoder <echotodevnull@gmail.com> | 2020-12-14 21:21:41 +0300 |
---|---|---|
committer | desperateCoder <echotodevnull@gmail.com> | 2020-12-14 21:21:41 +0300 |
commit | 2a2d93940491faf9ff043736747676d00a7d6e11 (patch) | |
tree | f4a3559a28512b158b8a2f7bc96d9f4e6088d02c /app/src/main | |
parent | 458832cb94cec960cccd79b0386a26c1c979fed8 (diff) | |
parent | 8454ca8a5a1cdffad7b1ce3e9636c51fffb804c3 (diff) |
Merge branch '597-filter-widget' of github.com:stefan-niedermann/nextcloud-deck into 597-filter-widget
Diffstat (limited to 'app/src/main')
12 files changed, 81 insertions, 214 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 151301948..f0b7932b4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -136,12 +136,6 @@ android:name=".ui.exception.ExceptionActivity" android:process=":error_activity" /> -<!-- <activity android:name=".ui.widget.filter.FilterWidgetConfigurationActivity">--> -<!-- <intent-filter>--> -<!-- <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />--> -<!-- </intent-filter>--> -<!-- </activity>--> - <!-- <receiver--> <!-- android:name="it.niedermann.nextcloud.deck.ui.widget.filter.FilterWidget"--> <!-- android:label="@string/widget_filter_title">--> @@ -155,12 +149,6 @@ <!-- android:resource="@xml/filter_widget_provider" />--> <!-- </receiver>--> - <activity android:name=".ui.widget.upcoming.UpcomingWidgetConfigurationActivity"> - <intent-filter> - <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> - </intent-filter> - </activity> - <service android:name=".ui.widget.upcoming.UpcomingWidgetService" android:permission="android.permission.BIND_REMOTEVIEWS" /> diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/enums/EDueType.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/enums/EDueType.java index 52895a376..9faff0013 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/enums/EDueType.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/enums/EDueType.java @@ -15,10 +15,10 @@ public enum EDueType { MONTH(5, R.string.filter_month), NO_DUE(6, R.string.filter_no_due); - private int value; - private int id; + private final int value; + private final int id; - EDueType(@NonNull int id, @StringRes int value) { + EDueType(int id, @StringRes int value) { this.value = value; this.id = id; } @@ -27,7 +27,6 @@ public enum EDueType { return id; } - public static EDueType findById(int id) { for (EDueType s : EDueType.values()) { if (s.getId() == id) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/EWidgetType.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/EWidgetType.java index e8622c5dc..74680a998 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/EWidgetType.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/EWidgetType.java @@ -3,11 +3,11 @@ package it.niedermann.nextcloud.deck.model.widget.filter; import it.niedermann.nextcloud.deck.ui.widget.upcoming.UpcomingWidget; public enum EWidgetType { - UPCOMING_CARDS_WIDGET(1, UpcomingWidget.class); + FILTER_WIDGET(1, FilterWidget.class), + UPCOMING_WIDGET(2, UpcomingWidget.class); - - private int id; - private Class<?> widgetClass; + private final int id; + private final Class<?> widgetClass; EWidgetType(int id, Class<?> widgetClass) { this.id = id; @@ -20,7 +20,7 @@ public enum EWidgetType { return s; } } - throw new IllegalArgumentException("unknown EWidgetType key"); + throw new IllegalArgumentException("unknown " + EWidgetType.class.getSimpleName() + " key: " + id); } public static EWidgetType findByClass(Class<?> clazz) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidget.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidget.java index 9f471a072..0bae96f6a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidget.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidget.java @@ -1,6 +1,7 @@ package it.niedermann.nextcloud.deck.model.widget.filter; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.room.Entity; import androidx.room.Ignore; import androidx.room.PrimaryKey; @@ -14,49 +15,56 @@ import it.niedermann.nextcloud.deck.model.enums.EDueType; public class FilterWidget { @PrimaryKey() - @NonNull private int id; + @Nullable private EDueType dueType; @NonNull - private EWidgetType widgetType; + private EWidgetType widgetType = EWidgetType.FILTER_WIDGET; @Ignore - private List<FilterWidgetAccount> accounts = new ArrayList<>(); + @NonNull + private final List<FilterWidgetAccount> accounts = new ArrayList<>(); @Ignore - private List<FilterWidgetSort> sorts = new ArrayList<>(); + @NonNull + private final List<FilterWidgetSort> sorts = new ArrayList<>(); + @NonNull public List<FilterWidgetAccount> getAccounts() { return accounts; } - public void setAccounts(List<FilterWidgetAccount> accounts) { - this.accounts = accounts; + public void setAccounts(@NonNull List<FilterWidgetAccount> accounts) { + this.accounts.clear(); + this.accounts.addAll(accounts); } public Integer getId() { return id; } + @NonNull public List<FilterWidgetSort> getSorts() { return sorts; } - public void setSorts(List<FilterWidgetSort> sorts) { - this.sorts = sorts; + public void setSorts(@NonNull List<FilterWidgetSort> sorts) { + this.sorts.clear(); + this.sorts.addAll(sorts); } public void setId(int id) { this.id = id; } + @Nullable public EDueType getDueType() { return dueType; } - public void setDueType(EDueType dueType) { + public void setDueType(@Nullable EDueType dueType) { this.dueType = dueType; } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index c42dab129..e45f1a73d 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -381,6 +381,11 @@ public class SyncManager { return dataBaseAdapter.readAccounts(); } + @WorkerThread + public List<Account> readAccountsDirectly() { + return dataBaseAdapter.getAllAccountsDirectly(); + } + /** * <p> * Since the return value is a {@link LiveData}, it should immediately return the available values from the database diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java index 9db5e59f7..8941a853f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/converter/EnumConverter.java @@ -1,5 +1,6 @@ package it.niedermann.nextcloud.deck.persistence.sync.adapters.db.converter; +import androidx.annotation.Nullable; import androidx.room.TypeConverter; import it.niedermann.nextcloud.deck.model.enums.EDueType; @@ -19,12 +20,14 @@ public class EnumConverter { // #### EDueType @TypeConverter - public static EDueType toDueTypeEnum(Integer value) { + @Nullable + public static EDueType toDueTypeEnum(@Nullable Integer value) { return value == null ? null : EDueType.findById(value); } @TypeConverter - public static int fromDueTypeEnum(EDueType value) { + @Nullable + public static Integer fromDueTypeEnum(@Nullable EDueType value) { return value == null ? null : value.getId(); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java index 8774e6bb8..9de8933ef 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidget.java @@ -6,15 +6,23 @@ import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.database.sqlite.SQLiteConstraintException; import android.net.Uri; import android.widget.RemoteViews; +import java.util.Collections; import java.util.List; import java.util.NoSuchElementException; +import java.util.stream.Collectors; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; import it.niedermann.nextcloud.deck.api.IResponseCallback; +import it.niedermann.nextcloud.deck.model.Account; +import it.niedermann.nextcloud.deck.model.widget.filter.EWidgetType; +import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget; +import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetAccount; +import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser; import it.niedermann.nextcloud.deck.model.widget.filter.dto.FilterWidgetCard; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; import it.niedermann.nextcloud.deck.ui.MainActivity; @@ -68,7 +76,42 @@ public class UpcomingWidget extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { super.onUpdate(context, appWidgetManager, appWidgetIds); - updateAppWidget(context, appWidgetManager, appWidgetIds); + final SyncManager syncManager = new SyncManager(context); + + for (int appWidgetId : appWidgetIds) { + new Thread(() -> { + List<Account> accountsList = syncManager.readAccountsDirectly(); + final FilterWidget config = new FilterWidget(); + config.setWidgetType(EWidgetType.UPCOMING_WIDGET); + config.setId(appWidgetId); + config.setAccounts(accountsList.stream().map(account -> { + final FilterWidgetAccount fwa = new FilterWidgetAccount(); + fwa.setAccountId(account.getId()); + final FilterWidgetUser fwu = new FilterWidgetUser(); + fwu.setUserId(syncManager.getUserByUidDirectly(account.getId(), account.getUserName()).getId()); + fwa.setUsers(Collections.singletonList(fwu)); + return fwa; + }).collect(Collectors.toList())); + syncManager.createFilterWidget(config, new IResponseCallback<Integer>(null) { + @Override + public void onResponse(Integer response) { + updateAppWidget(context, appWidgetManager, appWidgetIds); + } + + @Override + public void onError(Throwable throwable) { + super.onError(throwable); + // FIXME check before inserting... + if (throwable.getClass().equals(SQLiteConstraintException.class)) { + DeckLog.error("Already exists, update instead."); + updateAppWidget(context, appWidgetManager, appWidgetIds); + } else { + onDeleted(context, appWidgetIds); + } + } + }); + }).start(); + } } @Override diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetConfigurationActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetConfigurationActivity.java deleted file mode 100644 index beb1daad2..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetConfigurationActivity.java +++ /dev/null @@ -1,69 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.widget.upcoming; - -import android.appwidget.AppWidgetManager; -import android.content.Intent; -import android.os.Bundle; - -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.app.AppCompatActivity; -import androidx.lifecycle.ViewModelProvider; - -import it.niedermann.nextcloud.deck.DeckLog; -import it.niedermann.nextcloud.deck.R; -import it.niedermann.nextcloud.deck.databinding.ActivityUpcomingWidgetBinding; -import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; - -public class UpcomingWidgetConfigurationActivity extends AppCompatActivity { - private int appWidgetId; - private ActivityUpcomingWidgetBinding binding; - private UpcomingWidgetViewModel viewModel; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler(this)); - - binding = ActivityUpcomingWidgetBinding.inflate(getLayoutInflater()); - viewModel = new ViewModelProvider(this).get(UpcomingWidgetViewModel.class); - - setContentView(binding.getRoot()); - setSupportActionBar(binding.toolbar); - - final ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setTitle(R.string.widget_upcoming_title); - } - - setResult(RESULT_CANCELED); - final Bundle args = getIntent().getExtras(); - - if (args != null) { - appWidgetId = args.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); - } - - if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { - DeckLog.error("INVALID_APPWIDGET_ID"); - finish(); - } - binding.cancel.setOnClickListener((v) -> finish()); - binding.submit.setOnClickListener((v) -> { - final Bundle extras = new Bundle(); - - viewModel.addUpcomingWidget(appWidgetId).observe(this, (id) -> { - DeckLog.log("Created " + id); - }); - Intent updateIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, getApplicationContext(), UpcomingWidget.class); - extras.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); - - // The `extras` bundle is added to the intent this way because using putExtras(extras) - // would have the OS attempt to reassemble the data and cause a crash - // when it finds classes that are only known to this application. - updateIntent.putExtra(UpcomingWidget.BUNDLE_KEY, extras); - setResult(RESULT_OK, updateIntent); - getApplicationContext().sendBroadcast(updateIntent); - - finish(); - }); - } -} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java index 930dfe76a..b871f811f 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetFactory.java @@ -45,6 +45,7 @@ public class UpcomingWidgetFactory implements RemoteViewsService.RemoteViewsFact syncManager.getCardsForFilterWidget(appWidgetId, new IResponseCallback<List<FilterWidgetCard>>(null) { @Override public void onResponse(List<FilterWidgetCard> response) { + DeckLog.log("Result: " + response.size()); data.clear(); Collections.sort(response, (card1, card2) -> { if (card1 == null || card1.getCard() == null || card1.getCard().getCard().getDueDate() == null) { diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetViewModel.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetViewModel.java deleted file mode 100644 index df53e7313..000000000 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/widget/upcoming/UpcomingWidgetViewModel.java +++ /dev/null @@ -1,60 +0,0 @@ -package it.niedermann.nextcloud.deck.ui.widget.upcoming; - -import android.app.Application; - -import androidx.annotation.NonNull; -import androidx.lifecycle.AndroidViewModel; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -import java.util.Collections; -import java.util.stream.Collectors; - -import it.niedermann.nextcloud.deck.api.IResponseCallback; -import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget; -import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetAccount; -import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser; -import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; - -import static androidx.lifecycle.Transformations.switchMap; - -public class UpcomingWidgetViewModel extends AndroidViewModel { - - @NonNull - private final SyncManager syncManager; - - public UpcomingWidgetViewModel(@NonNull Application application) { - super(application); - this.syncManager = new SyncManager(application); - } - - public LiveData<Integer> addUpcomingWidget(int appWidgetId) { - return switchMap(syncManager.readAccounts(), accountsList -> { - final MutableLiveData<Integer> result$ = new MutableLiveData<>(); - new Thread(() -> { - final FilterWidget config = new FilterWidget(); - config.setId(appWidgetId); - config.setAccounts(accountsList.stream().map(account -> { - final FilterWidgetAccount fwa = new FilterWidgetAccount(); - fwa.setAccountId(account.getId()); - final FilterWidgetUser fwu = new FilterWidgetUser(); - fwu.setUserId(syncManager.getUserByUidDirectly(account.getId(), account.getUserName()).getId()); - fwa.setUsers(Collections.singletonList(fwu)); - return fwa; - }).collect(Collectors.toList())); - syncManager.createFilterWidget(config, new IResponseCallback<Integer>(null) { - @Override - public void onResponse(Integer response) { - result$.postValue(response); - } - - @Override - public void onError(Throwable throwable) { - super.onError(throwable); - } - }); - }).start(); - return result$; - }); - } -} diff --git a/app/src/main/res/layout/activity_upcoming_widget.xml b/app/src/main/res/layout/activity_upcoming_widget.xml deleted file mode 100644 index 13ee06b1a..000000000 --- a/app/src/main/res/layout/activity_upcoming_widget.xml +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:showIn="@layout/activity_filter_widget"> - - <com.google.android.material.appbar.AppBarLayout - android:id="@+id/appBarLayout" - android:layout_width="match_parent" - android:layout_height="wrap_content"> - - <androidx.appcompat.widget.Toolbar - android:id="@+id/toolbar" - android:layout_width="match_parent" - android:layout_height="?android:actionBarSize" - app:title="@string/widget_upcoming_title" /> - </com.google.android.material.appbar.AppBarLayout> - - <LinearLayout - android:id="@+id/buttonBar" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="bottom" - android:orientation="horizontal" - android:padding="@dimen/spacer_2x" - android:weightSum="1.0"> - - <com.google.android.material.button.MaterialButton - android:id="@+id/cancel" - style="@style/Widget.MaterialComponents.Button.TextButton" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/spacer_1x" - android:layout_weight=".5" - android:text="@android:string/cancel" - android:textColor="@color/defaultBrand" /> - - <com.google.android.material.button.MaterialButton - android:id="@+id/submit" - style="@style/Widget.MaterialComponents.Button" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="@dimen/spacer_1x" - android:layout_weight=".5" - android:text="@string/simple_add" - app:backgroundTint="@color/defaultBrand" /> - </LinearLayout> -</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file diff --git a/app/src/main/res/xml/upcoming_widget_provider.xml b/app/src/main/res/xml/upcoming_widget_provider.xml index b73141362..fcb71bed1 100644 --- a/app/src/main/res/xml/upcoming_widget_provider.xml +++ b/app/src/main/res/xml/upcoming_widget_provider.xml @@ -6,5 +6,4 @@ android:minResizeWidth="80dp" android:resizeMode="vertical|horizontal" android:updatePeriodMillis="86400000" - android:widgetCategory="keyguard|home_screen" - android:configure="it.niedermann.nextcloud.deck.ui.widget.upcoming.UpcomingWidgetConfigurationActivity" /> + android:widgetCategory="keyguard|home_screen" /> |