[app] Make installed apps use new DB

This commit is contained in:
Torsten Grote
2022-04-04 17:25:17 -03:00
committed by Hans-Christoph Steiner
parent ab2941cae6
commit f9f53f4610
6 changed files with 73 additions and 109 deletions

View File

@@ -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<Cursor> {
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<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(this, InstalledAppProvider.getAllAppsUri(), null, null, null, null);
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
adapter.setApps(cursor);
public void onLoadFinished(List<AppListItem> 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<Cursor> 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);

View File

@@ -128,7 +128,7 @@ public class App extends ValueObject implements Comparable<App>, Parcelable {
@JsonIgnore
private long id;
@JsonIgnore
private org.fdroid.database.AppPrefs prefs;
public org.fdroid.database.AppPrefs prefs;
@JsonIgnore
public String preferredSigner;
@JsonIgnore

View File

@@ -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<InstalledAppListItemController> {
protected final AppCompatActivity activity;
@Nullable
private Cursor cursor;
private final List<App> 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<InstalledAppLi
@Override
public void onBindViewHolder(@NonNull InstalledAppListItemController holder, int position) {
if (cursor == null) {
return;
}
cursor.moveToPosition(position);
holder.bindModel(new App(cursor), null, null);
App app = items.get(position);
holder.bindModel(app, null, null);
}
@Override
public int getItemCount() {
return cursor == null ? 0 : cursor.getCount();
return items.size();
}
public void setApps(@Nullable Cursor cursor) {
this.cursor = cursor;
public void setApps(@NonNull List<AppListItem> 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);
}
}

View File

@@ -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;
}
}

View File

@@ -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<Cursor> {
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<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(
this,
AppProvider.getInstalledUri(),
Schema.AppMetadataTable.Cols.ALL,
null, null, null);
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
adapter.setApps(cursor);
public void onLoadFinished(List<AppListItem> 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<Cursor> 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

View File

@@ -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);
}