diff --git a/src/org/fdroid/fdroid/PackageAddedReceiver.java b/src/org/fdroid/fdroid/PackageAddedReceiver.java index 0f683e3ae..e55bbd91f 100644 --- a/src/org/fdroid/fdroid/PackageAddedReceiver.java +++ b/src/org/fdroid/fdroid/PackageAddedReceiver.java @@ -21,7 +21,10 @@ package org.fdroid.fdroid; import android.content.ContentValues; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.util.Log; import org.fdroid.fdroid.data.InstalledAppProvider; @@ -44,10 +47,12 @@ public class PackageAddedReceiver extends PackageReceiver { Log.d("FDroid", "Inserting installed app info for '" + appId + "' (v" + info.versionCode + ")"); Uri uri = InstalledAppProvider.getContentUri(); - ContentValues values = new ContentValues(3); + ContentValues values = new ContentValues(4); values.put(InstalledAppProvider.DataColumns.APP_ID, appId); values.put(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode); values.put(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName); + values.put(InstalledAppProvider.DataColumns.APPLICATION_LABEL, + InstalledAppProvider.getApplicationLabel(context, appId)); context.getContentResolver().insert(uri, values); } diff --git a/src/org/fdroid/fdroid/PackageUpgradedReceiver.java b/src/org/fdroid/fdroid/PackageUpgradedReceiver.java index 6f4057dca..699c40133 100644 --- a/src/org/fdroid/fdroid/PackageUpgradedReceiver.java +++ b/src/org/fdroid/fdroid/PackageUpgradedReceiver.java @@ -21,9 +21,13 @@ package org.fdroid.fdroid; import android.content.ContentValues; import android.content.Context; import android.content.Intent; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.net.Uri; import android.util.Log; + import org.fdroid.fdroid.data.InstalledAppProvider; /** @@ -46,10 +50,12 @@ public class PackageUpgradedReceiver extends PackageReceiver { Log.d("FDroid", "Updating installed app info for '" + appId + "' to v" + info.versionCode + " (" + info.versionName + ")"); Uri uri = InstalledAppProvider.getContentUri(); - ContentValues values = new ContentValues(1); - values.put(InstalledAppProvider.DataColumns.APP_ID, info.packageName); + ContentValues values = new ContentValues(4); + values.put(InstalledAppProvider.DataColumns.APP_ID, appId); values.put(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode); values.put(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName); + values.put(InstalledAppProvider.DataColumns.APPLICATION_LABEL, + InstalledAppProvider.getApplicationLabel(context, appId)); context.getContentResolver().insert(uri, values); } diff --git a/src/org/fdroid/fdroid/data/DBHelper.java b/src/org/fdroid/fdroid/data/DBHelper.java index 4d81bb4b4..229900d4b 100644 --- a/src/org/fdroid/fdroid/data/DBHelper.java +++ b/src/org/fdroid/fdroid/data/DBHelper.java @@ -91,12 +91,13 @@ public class DBHelper extends SQLiteOpenHelper { public static final String TABLE_INSTALLED_APP = "fdroid_installedApp"; private static final String CREATE_TABLE_INSTALLED_APP = "CREATE TABLE " + TABLE_INSTALLED_APP + " ( " - + "appId TEXT NOT NULL PRIMARY KEY, " - + "versionCode INT NOT NULL, " - + "versionName TEXT NOT NULL " + + InstalledAppProvider.DataColumns.APP_ID + " TEXT NOT NULL PRIMARY KEY, " + + InstalledAppProvider.DataColumns.VERSION_CODE + " INT NOT NULL, " + + InstalledAppProvider.DataColumns.VERSION_NAME + " TEXT NOT NULL, " + + InstalledAppProvider.DataColumns.APPLICATION_LABEL + " TEXT NOT NULL " + " );"; - private static final int DB_VERSION = 44; + private static final int DB_VERSION = 45; private Context context; @@ -249,6 +250,7 @@ public class DBHelper extends SQLiteOpenHelper { addLastUpdatedToRepo(db, oldVersion); renameRepoId(db, oldVersion); populateRepoNames(db, oldVersion); + upgradeInstalledApp(db, oldVersion); if (oldVersion < 43) createInstalledApp(db); } @@ -398,6 +400,14 @@ public class DBHelper extends SQLiteOpenHelper { db.execSQL(CREATE_TABLE_INSTALLED_APP); } + private void upgradeInstalledApp(SQLiteDatabase db, int oldVersion) { + if (oldVersion < 45) { + Log.i(TAG, "upgradeInstalledApp"); + // just wipe it out, so it'll get rebuilt from scratch + db.execSQL("DELETE FROM fdroid_installedApp;"); + } + } + private static boolean columnExists(SQLiteDatabase db, String table, String column) { return (db.rawQuery( "select * from " + table + " limit 0,1", null ) diff --git a/src/org/fdroid/fdroid/data/InstalledAppCacheUpdater.java b/src/org/fdroid/fdroid/data/InstalledAppCacheUpdater.java index edb4ae5b3..a9fbf15fe 100644 --- a/src/org/fdroid/fdroid/data/InstalledAppCacheUpdater.java +++ b/src/org/fdroid/fdroid/data/InstalledAppCacheUpdater.java @@ -135,6 +135,8 @@ public class InstalledAppCacheUpdater { .withValue(InstalledAppProvider.DataColumns.APP_ID, info.packageName) .withValue(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode) .withValue(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName) + .withValue(InstalledAppProvider.DataColumns.APPLICATION_LABEL, + InstalledAppProvider.getApplicationLabel(context, info.packageName)) .build(); ops.add(op); } diff --git a/src/org/fdroid/fdroid/data/InstalledAppProvider.java b/src/org/fdroid/fdroid/data/InstalledAppProvider.java index 8e4b8136e..640a1948b 100644 --- a/src/org/fdroid/fdroid/data/InstalledAppProvider.java +++ b/src/org/fdroid/fdroid/data/InstalledAppProvider.java @@ -3,9 +3,14 @@ package org.fdroid.fdroid.data; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Resources.NotFoundException; import android.database.Cursor; import android.net.Uri; import android.util.Log; + import org.fdroid.fdroid.R; import java.util.HashMap; @@ -49,8 +54,11 @@ public class InstalledAppProvider extends FDroidProvider { public static final String APP_ID = "appId"; public static final String VERSION_CODE = "versionCode"; public static final String VERSION_NAME = "versionName"; + public static final String APPLICATION_LABEL = "applicationLabel"; - public static String[] ALL = { _ID, APP_ID, VERSION_CODE, VERSION_NAME }; + public static String[] ALL = { + _ID, APP_ID, VERSION_CODE, VERSION_NAME, APPLICATION_LABEL, + }; } @@ -71,6 +79,20 @@ public class InstalledAppProvider extends FDroidProvider { return Uri.withAppendedPath(getContentUri(), appId); } + public static String getApplicationLabel(Context context, String packageName) { + PackageManager pm = context.getPackageManager(); + ApplicationInfo appInfo; + try { + appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA); + return appInfo.loadLabel(pm).toString(); + } catch (NameNotFoundException e) { + e.printStackTrace(); + } catch (NotFoundException e) { + Log.d("InstalledAppProvider", "getApplicationLabel: " + e.getMessage()); + } + return packageName; // all else fails, return id + } + @Override protected String getTableName() { return DBHelper.TABLE_INSTALLED_APP; diff --git a/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java b/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java index b9a6b7ce8..58d15c363 100644 --- a/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java +++ b/src/org/fdroid/fdroid/views/fragments/SelectLocalAppsFragment.java @@ -60,6 +60,7 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb android.R.layout.simple_list_item_activated_1, null, new String[] { + InstalledAppProvider.DataColumns.APPLICATION_LABEL, InstalledAppProvider.DataColumns.APP_ID, }, new int[] { @@ -91,8 +92,8 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb if (mActionMode == null) mActionMode = selectLocalAppsActivity .startActionMode(selectLocalAppsActivity.mActionModeCallback); - Cursor cursor = (Cursor) l.getAdapter().getItem(position); - String packageName = cursor.getString(1); + Cursor c = (Cursor) l.getAdapter().getItem(position); + String packageName = c.getString(c.getColumnIndex(DataColumns.APP_ID)); if (FDroidApp.selectedApps.contains(packageName)) { FDroidApp.selectedApps.remove(packageName); } else { @@ -108,7 +109,7 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb InstalledAppProvider.DataColumns.ALL, null, null, - InstalledAppProvider.DataColumns.APP_ID); + InstalledAppProvider.DataColumns.APPLICATION_LABEL); return loader; } @@ -123,7 +124,7 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb Cursor c = ((Cursor) listView.getItemAtPosition(i)); String packageName = c.getString(c.getColumnIndex(DataColumns.APP_ID)); if (TextUtils.equals(packageName, fdroid)) { - listView.setItemChecked(i, true); + listView.setItemChecked(i, true); // always include FDroid } else { for (String selected : FDroidApp.selectedApps) { if (TextUtils.equals(packageName, selected)) { diff --git a/test/src/org/fdroid/fdroid/FDroidProviderTest.java b/test/src/org/fdroid/fdroid/FDroidProviderTest.java index 1be7eec3d..4102b9690 100644 --- a/test/src/org/fdroid/fdroid/FDroidProviderTest.java +++ b/test/src/org/fdroid/fdroid/FDroidProviderTest.java @@ -9,9 +9,11 @@ import android.net.Uri; import android.os.Build; import android.provider.ContactsContract; import android.test.ProviderTestCase2MockContext; + import mock.MockContextEmptyComponents; import mock.MockContextSwappableComponents; import mock.MockFDroidResources; + import org.fdroid.fdroid.data.*; import java.util.List; @@ -151,6 +153,7 @@ public abstract class FDroidProviderTest extends Provi InstalledAppProvider.DataColumns.APP_ID, InstalledAppProvider.DataColumns.VERSION_CODE, InstalledAppProvider.DataColumns.VERSION_NAME, + InstalledAppProvider.DataColumns.APPLICATION_LABEL, }; Cursor cursor = getMockContentResolver().query(uri, projection, null, null, null);