From f9f53f4610a28aa63b45e8857cfbdda3ffbe0fe8 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 4 Apr 2022 17:25:17 -0300 Subject: [PATCH] [app] Make installed apps use new DB --- .../panic/SelectInstalledAppsActivity.java | 45 +++++++------- .../main/java/org/fdroid/fdroid/data/App.java | 2 +- .../installed/InstalledAppListAdapter.java | 58 +++++++++---------- .../InstalledAppListItemController.java | 11 +--- .../installed/InstalledAppsActivity.java | 54 +++++++---------- .../fdroid/work/FDroidMetricsWorker.java | 12 ---- 6 files changed, 73 insertions(+), 109 deletions(-) diff --git a/app/src/full/java/org/fdroid/fdroid/panic/SelectInstalledAppsActivity.java b/app/src/full/java/org/fdroid/fdroid/panic/SelectInstalledAppsActivity.java index 9299c8052..a9f8aee0a 100644 --- a/app/src/full/java/org/fdroid/fdroid/panic/SelectInstalledAppsActivity.java +++ b/app/src/full/java/org/fdroid/fdroid/panic/SelectInstalledAppsActivity.java @@ -20,7 +20,6 @@ package org.fdroid.fdroid.panic; import android.annotation.SuppressLint; -import android.database.Cursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; @@ -29,27 +28,30 @@ import android.widget.TextView; import com.google.android.material.appbar.MaterialToolbar; +import org.fdroid.database.AppListItem; +import org.fdroid.database.AppPrefsDao; +import org.fdroid.database.FDroidDatabase; import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; -import org.fdroid.fdroid.data.InstalledAppProvider; +import org.fdroid.fdroid.Utils; +import org.fdroid.fdroid.data.DBHelper; import org.fdroid.fdroid.views.installed.InstalledAppListAdapter; -import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.CursorLoader; -import androidx.loader.content.Loader; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -public class SelectInstalledAppsActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks { +import java.util.List; + +public class SelectInstalledAppsActivity extends AppCompatActivity { private InstalledAppListAdapter adapter; private RecyclerView appList; private TextView emptyState; private int checkId; + private FDroidDatabase db; private Preferences prefs; @Override @@ -74,6 +76,9 @@ public class SelectInstalledAppsActivity extends AppCompatActivity implements Lo appList.setAdapter(adapter); emptyState = findViewById(R.id.empty_state); + + db = DBHelper.getDb(this); + db.getAppDao().getInstalledAppListItems(getPackageManager()).observe(this, this::onLoadFinished); } @Override @@ -81,20 +86,10 @@ public class SelectInstalledAppsActivity extends AppCompatActivity implements Lo super.onResume(); prefs = Preferences.get(); - - // Starts a new or restarts an existing Loader in this manager - getSupportLoaderManager().restartLoader(0, null, this); } - @NonNull - @Override - public Loader onCreateLoader(int id, Bundle args) { - return new CursorLoader(this, InstalledAppProvider.getAllAppsUri(), null, null, null, null); - } - - @Override - public void onLoadFinished(@NonNull Loader loader, Cursor cursor) { - adapter.setApps(cursor); + public void onLoadFinished(List items) { + adapter.setApps(items); if (adapter.getItemCount() == 0) { appList.setVisibility(View.GONE); @@ -103,14 +98,16 @@ public class SelectInstalledAppsActivity extends AppCompatActivity implements Lo appList.setVisibility(View.VISIBLE); emptyState.setVisibility(View.GONE); } - } - @Override - public void onLoaderReset(@NonNull Loader loader) { - adapter.setApps(null); + // load app prefs for each app off the UiThread and update item if updates are ignored + AppPrefsDao appPrefsDao = db.getAppPrefsDao(); + for (AppListItem item : items) { + Utils.observeOnce(appPrefsDao.getAppPrefs(item.getPackageName()), this, appPrefs -> { + if (appPrefs.getIgnoreVersionCodeUpdate() > 0) adapter.updateItem(item, appPrefs); + }); + } } - @Override public boolean onCreateOptionsMenu(Menu menu) { MenuItem menuItem = menu.add(R.string.menu_select_for_wipe); diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 978effb62..98e4dfa7c 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -128,7 +128,7 @@ public class App extends ValueObject implements Comparable, Parcelable { @JsonIgnore private long id; @JsonIgnore - private org.fdroid.database.AppPrefs prefs; + public org.fdroid.database.AppPrefs prefs; @JsonIgnore public String preferredSigner; @JsonIgnore diff --git a/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListAdapter.java index b009646a2..30be7decc 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListAdapter.java @@ -1,10 +1,10 @@ package org.fdroid.fdroid.views.installed; -import android.database.Cursor; -import android.provider.BaseColumns; import android.view.View; import android.view.ViewGroup; +import org.fdroid.database.AppListItem; +import org.fdroid.database.AppPrefs; import org.fdroid.fdroid.R; import org.fdroid.fdroid.data.App; @@ -13,27 +13,17 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.RecyclerView; +import java.util.ArrayList; +import java.util.List; + public class InstalledAppListAdapter extends RecyclerView.Adapter { protected final AppCompatActivity activity; - @Nullable - private Cursor cursor; + private final List items = new ArrayList<>(); protected InstalledAppListAdapter(AppCompatActivity activity) { this.activity = activity; - setHasStableIds(true); - } - - @Override - public long getItemId(int position) { - if (cursor == null) { - return 0; - } - - cursor.moveToPosition(position); - // TODO this should be based on Schema.InstalledAppProvider.Cols._ID - return cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); } @NonNull @@ -45,30 +35,36 @@ public class InstalledAppListAdapter extends RecyclerView.Adapter items) { + this.items.clear(); + for (AppListItem item: items) { + this.items.add(new App(item)); + } notifyDataSetChanged(); } - @Nullable - public App getItem(int position) { - if (cursor == null) { - return null; + public void updateItem(AppListItem item, AppPrefs appPrefs) { + for (int i = 0; i < items.size(); i++) { + App app = items.get(i); + if (app.packageName.equals(item.getPackageName())) { + app.prefs = appPrefs; + notifyItemChanged(i); + break; + } } - cursor.moveToPosition(position); - return new App(cursor); + } + + @Nullable + App getItem(int position) { + return items.get(position); } } diff --git a/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListItemController.java b/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListItemController.java index 482cd633b..6a821586b 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListItemController.java +++ b/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppListItemController.java @@ -2,10 +2,10 @@ package org.fdroid.fdroid.views.installed; import android.view.View; +import org.fdroid.database.AppPrefs; import org.fdroid.fdroid.AppUpdateStatusManager; import org.fdroid.fdroid.R; import org.fdroid.fdroid.data.App; -import org.fdroid.fdroid.data.AppPrefs; import org.fdroid.fdroid.views.apps.AppListItemController; import org.fdroid.fdroid.views.apps.AppListItemState; @@ -49,15 +49,10 @@ public class InstalledAppListItemController extends AppListItemController { */ @Nullable private CharSequence getIgnoreStatus(@NonNull App app) { - AppPrefs prefs = app.getPrefs(activity); - if (prefs.ignoreAllUpdates) { + AppPrefs prefs = app.prefs; + if (prefs != null && prefs.shouldIgnoreUpdate(app.autoInstallVersionCode)) { return activity.getString(R.string.installed_app__updates_ignored); - } else if (prefs.ignoreThisUpdate > 0 && prefs.ignoreThisUpdate == app.autoInstallVersionCode) { - return activity.getString( - R.string.installed_app__updates_ignored_for_suggested_version, - app.getAutoInstallVersionName()); } - return null; } } diff --git a/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppsActivity.java b/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppsActivity.java index a741ba0c3..3765beb76 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppsActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/installed/InstalledAppsActivity.java @@ -19,7 +19,6 @@ package org.fdroid.fdroid.views.installed; -import android.database.Cursor; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; @@ -28,23 +27,25 @@ import android.widget.TextView; import com.google.android.material.appbar.MaterialToolbar; +import org.fdroid.database.AppListItem; +import org.fdroid.database.AppPrefsDao; +import org.fdroid.database.FDroidDatabase; import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.R; +import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.App; -import org.fdroid.fdroid.data.AppProvider; -import org.fdroid.fdroid.data.Schema; +import org.fdroid.fdroid.data.DBHelper; -import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ShareCompat; -import androidx.loader.app.LoaderManager; -import androidx.loader.content.CursorLoader; -import androidx.loader.content.Loader; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -public class InstalledAppsActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks { +import java.util.List; +public class InstalledAppsActivity extends AppCompatActivity { + + private FDroidDatabase db; private InstalledAppListAdapter adapter; private RecyclerView appList; private TextView emptyState; @@ -70,29 +71,13 @@ public class InstalledAppsActivity extends AppCompatActivity implements LoaderMa appList.setAdapter(adapter); emptyState = (TextView) findViewById(R.id.empty_state); + + db = DBHelper.getDb(this); + db.getAppDao().getInstalledAppListItems(getPackageManager()).observe(this, this::onLoadFinished); } - @Override - protected void onResume() { - super.onResume(); - - // Starts a new or restarts an existing Loader in this manager - getSupportLoaderManager().restartLoader(0, null, this); - } - - @NonNull - @Override - public Loader onCreateLoader(int id, Bundle args) { - return new CursorLoader( - this, - AppProvider.getInstalledUri(), - Schema.AppMetadataTable.Cols.ALL, - null, null, null); - } - - @Override - public void onLoadFinished(@NonNull Loader loader, Cursor cursor) { - adapter.setApps(cursor); + public void onLoadFinished(List items) { + adapter.setApps(items); if (adapter.getItemCount() == 0) { appList.setVisibility(View.GONE); @@ -101,11 +86,14 @@ public class InstalledAppsActivity extends AppCompatActivity implements LoaderMa appList.setVisibility(View.VISIBLE); emptyState.setVisibility(View.GONE); } - } - @Override - public void onLoaderReset(@NonNull Loader loader) { - adapter.setApps(null); + // load app prefs for each app off the UiThread and update item if updates are ignored + AppPrefsDao appPrefsDao = db.getAppPrefsDao(); + for (AppListItem item : items) { + Utils.observeOnce(appPrefsDao.getAppPrefs(item.getPackageName()), this, appPrefs -> { + if (appPrefs.getIgnoreVersionCodeUpdate() > 0) adapter.updateItem(item, appPrefs); + }); + } } @Override diff --git a/app/src/main/java/org/fdroid/fdroid/work/FDroidMetricsWorker.java b/app/src/main/java/org/fdroid/fdroid/work/FDroidMetricsWorker.java index 1c254a762..617af4665 100644 --- a/app/src/main/java/org/fdroid/fdroid/work/FDroidMetricsWorker.java +++ b/app/src/main/java/org/fdroid/fdroid/work/FDroidMetricsWorker.java @@ -36,8 +36,6 @@ import org.apache.commons.io.FileUtils; import org.fdroid.download.HttpPoster; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Utils; -import org.fdroid.fdroid.data.App; -import org.fdroid.fdroid.data.InstalledAppProvider; import org.fdroid.fdroid.installer.InstallHistoryService; import org.fdroid.fdroid.net.DownloaderFactory; @@ -265,7 +263,6 @@ public class FDroidMetricsWorker extends Worker { return p1.packageName.compareTo(p2.packageName); } }); - App[] installedApps = InstalledAppProvider.Helper.all(context); EVENTS.add(getDeviceEvent(weekStart, "isPrivilegedInstallerEnabled", Preferences.get().isPrivilegedInstallerEnabled())); EVENTS.add(getDeviceEvent(weekStart, "Build.VERSION.SDK_INT", Build.VERSION.SDK_INT)); @@ -274,15 +271,6 @@ public class FDroidMetricsWorker extends Worker { } for (PackageInfo packageInfo : packageInfoList) { - boolean found = false; - for (App app : installedApps) { - if (packageInfo.packageName.equals(app.packageName)) { - found = true; - break; - } - } - if (!found) continue; - if (isTimestampInReportingWeek(weekStart, packageInfo.firstInstallTime)) { addFirstInstallEvent(pm, packageInfo); }