mirror of
https://github.com/f-droid/fdroidclient.git
synced 2026-05-25 00:46:45 -04:00
[app] Make installed apps use new DB
This commit is contained in:
committed by
Hans-Christoph Steiner
parent
ab2941cae6
commit
f9f53f4610
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user