store "App Label" for Installed Apps, to show in Local Repo setup

Most people are going to know the "label" i.e. the display name rather than
the packageName/id.  So also store the label in the database and make it
accessible via InstalledAppsProvider so SelectLocalAppsFragment can show a
list of friendly names rather than packageNames.
This commit is contained in:
Hans-Christoph Steiner 2014-05-06 23:13:59 -04:00
parent 3c005006ce
commit 584152d2fa
7 changed files with 61 additions and 12 deletions

View File

@ -21,7 +21,10 @@ package org.fdroid.fdroid;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri; import android.net.Uri;
import android.util.Log; import android.util.Log;
import org.fdroid.fdroid.data.InstalledAppProvider; 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 + ")"); Log.d("FDroid", "Inserting installed app info for '" + appId + "' (v" + info.versionCode + ")");
Uri uri = InstalledAppProvider.getContentUri(); 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.APP_ID, appId);
values.put(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode); values.put(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode);
values.put(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName); values.put(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName);
values.put(InstalledAppProvider.DataColumns.APPLICATION_LABEL,
InstalledAppProvider.getApplicationLabel(context, appId));
context.getContentResolver().insert(uri, values); context.getContentResolver().insert(uri, values);
} }

View File

@ -21,9 +21,13 @@ package org.fdroid.fdroid;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri; import android.net.Uri;
import android.util.Log; import android.util.Log;
import org.fdroid.fdroid.data.InstalledAppProvider; 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 + ")"); Log.d("FDroid", "Updating installed app info for '" + appId + "' to v" + info.versionCode + " (" + info.versionName + ")");
Uri uri = InstalledAppProvider.getContentUri(); Uri uri = InstalledAppProvider.getContentUri();
ContentValues values = new ContentValues(1); ContentValues values = new ContentValues(4);
values.put(InstalledAppProvider.DataColumns.APP_ID, info.packageName); values.put(InstalledAppProvider.DataColumns.APP_ID, appId);
values.put(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode); values.put(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode);
values.put(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName); values.put(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName);
values.put(InstalledAppProvider.DataColumns.APPLICATION_LABEL,
InstalledAppProvider.getApplicationLabel(context, appId));
context.getContentResolver().insert(uri, values); context.getContentResolver().insert(uri, values);
} }

View File

@ -91,12 +91,13 @@ public class DBHelper extends SQLiteOpenHelper {
public static final String TABLE_INSTALLED_APP = "fdroid_installedApp"; public static final String TABLE_INSTALLED_APP = "fdroid_installedApp";
private static final String CREATE_TABLE_INSTALLED_APP = "CREATE TABLE " + TABLE_INSTALLED_APP private static final String CREATE_TABLE_INSTALLED_APP = "CREATE TABLE " + TABLE_INSTALLED_APP
+ " ( " + " ( "
+ "appId TEXT NOT NULL PRIMARY KEY, " + InstalledAppProvider.DataColumns.APP_ID + " TEXT NOT NULL PRIMARY KEY, "
+ "versionCode INT NOT NULL, " + InstalledAppProvider.DataColumns.VERSION_CODE + " INT NOT NULL, "
+ "versionName TEXT 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; private Context context;
@ -249,6 +250,7 @@ public class DBHelper extends SQLiteOpenHelper {
addLastUpdatedToRepo(db, oldVersion); addLastUpdatedToRepo(db, oldVersion);
renameRepoId(db, oldVersion); renameRepoId(db, oldVersion);
populateRepoNames(db, oldVersion); populateRepoNames(db, oldVersion);
upgradeInstalledApp(db, oldVersion);
if (oldVersion < 43) createInstalledApp(db); if (oldVersion < 43) createInstalledApp(db);
} }
@ -398,6 +400,14 @@ public class DBHelper extends SQLiteOpenHelper {
db.execSQL(CREATE_TABLE_INSTALLED_APP); 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, private static boolean columnExists(SQLiteDatabase db,
String table, String column) { String table, String column) {
return (db.rawQuery( "select * from " + table + " limit 0,1", null ) return (db.rawQuery( "select * from " + table + " limit 0,1", null )

View File

@ -135,6 +135,8 @@ public class InstalledAppCacheUpdater {
.withValue(InstalledAppProvider.DataColumns.APP_ID, info.packageName) .withValue(InstalledAppProvider.DataColumns.APP_ID, info.packageName)
.withValue(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode) .withValue(InstalledAppProvider.DataColumns.VERSION_CODE, info.versionCode)
.withValue(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName) .withValue(InstalledAppProvider.DataColumns.VERSION_NAME, info.versionName)
.withValue(InstalledAppProvider.DataColumns.APPLICATION_LABEL,
InstalledAppProvider.getApplicationLabel(context, info.packageName))
.build(); .build();
ops.add(op); ops.add(op);
} }

View File

@ -3,9 +3,14 @@ package org.fdroid.fdroid.data;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.UriMatcher; 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.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.util.Log; import android.util.Log;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import java.util.HashMap; import java.util.HashMap;
@ -49,8 +54,11 @@ public class InstalledAppProvider extends FDroidProvider {
public static final String APP_ID = "appId"; public static final String APP_ID = "appId";
public static final String VERSION_CODE = "versionCode"; public static final String VERSION_CODE = "versionCode";
public static final String VERSION_NAME = "versionName"; 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); 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 @Override
protected String getTableName() { protected String getTableName() {
return DBHelper.TABLE_INSTALLED_APP; return DBHelper.TABLE_INSTALLED_APP;

View File

@ -60,6 +60,7 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
android.R.layout.simple_list_item_activated_1, android.R.layout.simple_list_item_activated_1,
null, null,
new String[] { new String[] {
InstalledAppProvider.DataColumns.APPLICATION_LABEL,
InstalledAppProvider.DataColumns.APP_ID, InstalledAppProvider.DataColumns.APP_ID,
}, },
new int[] { new int[] {
@ -91,8 +92,8 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
if (mActionMode == null) if (mActionMode == null)
mActionMode = selectLocalAppsActivity mActionMode = selectLocalAppsActivity
.startActionMode(selectLocalAppsActivity.mActionModeCallback); .startActionMode(selectLocalAppsActivity.mActionModeCallback);
Cursor cursor = (Cursor) l.getAdapter().getItem(position); Cursor c = (Cursor) l.getAdapter().getItem(position);
String packageName = cursor.getString(1); String packageName = c.getString(c.getColumnIndex(DataColumns.APP_ID));
if (FDroidApp.selectedApps.contains(packageName)) { if (FDroidApp.selectedApps.contains(packageName)) {
FDroidApp.selectedApps.remove(packageName); FDroidApp.selectedApps.remove(packageName);
} else { } else {
@ -108,7 +109,7 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
InstalledAppProvider.DataColumns.ALL, InstalledAppProvider.DataColumns.ALL,
null, null,
null, null,
InstalledAppProvider.DataColumns.APP_ID); InstalledAppProvider.DataColumns.APPLICATION_LABEL);
return loader; return loader;
} }
@ -123,7 +124,7 @@ public class SelectLocalAppsFragment extends ListFragment implements LoaderCallb
Cursor c = ((Cursor) listView.getItemAtPosition(i)); Cursor c = ((Cursor) listView.getItemAtPosition(i));
String packageName = c.getString(c.getColumnIndex(DataColumns.APP_ID)); String packageName = c.getString(c.getColumnIndex(DataColumns.APP_ID));
if (TextUtils.equals(packageName, fdroid)) { if (TextUtils.equals(packageName, fdroid)) {
listView.setItemChecked(i, true); listView.setItemChecked(i, true); // always include FDroid
} else { } else {
for (String selected : FDroidApp.selectedApps) { for (String selected : FDroidApp.selectedApps) {
if (TextUtils.equals(packageName, selected)) { if (TextUtils.equals(packageName, selected)) {

View File

@ -9,9 +9,11 @@ import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.provider.ContactsContract; import android.provider.ContactsContract;
import android.test.ProviderTestCase2MockContext; import android.test.ProviderTestCase2MockContext;
import mock.MockContextEmptyComponents; import mock.MockContextEmptyComponents;
import mock.MockContextSwappableComponents; import mock.MockContextSwappableComponents;
import mock.MockFDroidResources; import mock.MockFDroidResources;
import org.fdroid.fdroid.data.*; import org.fdroid.fdroid.data.*;
import java.util.List; import java.util.List;
@ -151,6 +153,7 @@ public abstract class FDroidProviderTest<T extends FDroidProvider> extends Provi
InstalledAppProvider.DataColumns.APP_ID, InstalledAppProvider.DataColumns.APP_ID,
InstalledAppProvider.DataColumns.VERSION_CODE, InstalledAppProvider.DataColumns.VERSION_CODE,
InstalledAppProvider.DataColumns.VERSION_NAME, InstalledAppProvider.DataColumns.VERSION_NAME,
InstalledAppProvider.DataColumns.APPLICATION_LABEL,
}; };
Cursor cursor = getMockContentResolver().query(uri, projection, null, null, null); Cursor cursor = getMockContentResolver().query(uri, projection, null, null, null);