summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml3
-rw-r--r--src/com/cyngn/theme/chooser/ChooserActivity.java62
-rw-r--r--src/com/cyngn/theme/chooser/ThemeFragment.java7
3 files changed, 53 insertions, 19 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 11cfc0d..4722ac9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -24,6 +24,9 @@
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_KEYGUARD_WALLPAPER" />
+ <!-- Used to cleanly uninstall themes without relying on the PackageInstaller apk -->
+ <uses-permission android:name="android.permission.DELETE_PACKAGES" />
+
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
diff --git a/src/com/cyngn/theme/chooser/ChooserActivity.java b/src/com/cyngn/theme/chooser/ChooserActivity.java
index 0b7425c..db1316e 100644
--- a/src/com/cyngn/theme/chooser/ChooserActivity.java
+++ b/src/com/cyngn/theme/chooser/ChooserActivity.java
@@ -11,6 +11,8 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.pm.IPackageDeleteObserver;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.content.res.ThemeConfig;
import android.content.res.ThemeManager;
@@ -27,6 +29,7 @@ import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
+import android.os.RemoteException;
import android.provider.ThemesContract;
import android.provider.ThemesContract.ThemesColumns;
import android.renderscript.Allocation;
@@ -124,7 +127,8 @@ public class ChooserActivity extends FragmentActivity
// Current system theme configuration as component -> pkgName
private Map<String, String> mCurrentTheme = new HashMap<String, String>();
- protected boolean mIsPickingImage = false;
+ private boolean mIsPickingImage = false;
+ private String mDeletedPackageName;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -457,6 +461,11 @@ public class ChooserActivity extends FragmentActivity
mIsPickingImage = true;
}
+ public void uninstallTheme(String pkgName) {
+ PackageManager pm = getPackageManager();
+ pm.deletePackage(pkgName, new PackageDeleteObserver(), PackageManager.DELETE_ALL_USERS);
+ }
+
private void slideContentIntoView(int yDelta, int selectorHeight) {
ThemeFragment f = getCurrentFragment();
if (f != null) {
@@ -756,7 +765,12 @@ public class ChooserActivity extends FragmentActivity
case LOADER_ID_INSTALLED_THEMES:
mAppliedBaseTheme = PreferenceUtils.getAppliedBaseTheme(this);
selection = ThemesColumns.PRESENT_AS_THEME + "=?";
- selectionArgs = new String[] { "1" };
+ if (mDeletedPackageName != null) {
+ selection += " AND " + ThemesColumns.PKG_NAME + "!=?";
+ selectionArgs = new String[] { "1", mDeletedPackageName };
+ } else {
+ selectionArgs = new String[] { "1" };
+ }
// sort in ascending order but make sure the "default" theme is always first
sortOrder = "(" + ThemesColumns.IS_DEFAULT_THEME + "=1) DESC, "
+ "(" + ThemesColumns.PKG_NAME + "='" + mAppliedBaseTheme + "') DESC, "
@@ -777,16 +791,6 @@ public class ChooserActivity extends FragmentActivity
selectionArgs, sortOrder);
}
- @Override
- public void onProgress(int progress) {
-
- }
-
- @Override
- public void onFinish(boolean isSuccess) {
-
- }
-
class ThemesObserver extends ContentObserver {
/**
@@ -807,6 +811,16 @@ public class ChooserActivity extends FragmentActivity
}
}
+ @Override
+ public void onProgress(int progress) {
+
+ }
+
+ @Override
+ public void onFinish(boolean isSuccess) {
+
+ }
+
public class ThemesAdapter extends FragmentStatePagerAdapter {
private Cursor mCursor;
private Context mContext;
@@ -836,7 +850,6 @@ public class ChooserActivity extends FragmentActivity
@Override
public int getItemPosition(Object object) {
- ThemeFragment fragment = (ThemeFragment) object;
return super.getItemPosition(object);
}
@@ -872,4 +885,27 @@ public class ChooserActivity extends FragmentActivity
return null;
}
}
+
+ /**
+ * Internal delete callback from the system
+ */
+ class PackageDeleteObserver extends IPackageDeleteObserver.Stub {
+ public void packageDeleted(String packageName, int returnCode) throws RemoteException {
+ if (returnCode == PackageManager.DELETE_SUCCEEDED) {
+ Log.d(TAG, "Delete succeeded");
+ mDeletedPackageName = packageName;
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mAdapter = new ThemesAdapter(ChooserActivity.this);
+ mPager.setAdapter(mAdapter);
+ getSupportLoaderManager().restartLoader(LOADER_ID_INSTALLED_THEMES, null,
+ ChooserActivity.this);
+ }
+ });
+ } else {
+ Log.e(TAG, "Delete failed with returnCode " + returnCode);
+ }
+ }
+ }
}
diff --git a/src/com/cyngn/theme/chooser/ThemeFragment.java b/src/com/cyngn/theme/chooser/ThemeFragment.java
index 2a4c60a..2fd10ff 100644
--- a/src/com/cyngn/theme/chooser/ThemeFragment.java
+++ b/src/com/cyngn/theme/chooser/ThemeFragment.java
@@ -10,10 +10,8 @@ import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.app.WallpaperManager;
-import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
-import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ThemeUtils;
import android.content.res.AssetManager;
@@ -2251,10 +2249,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb
}
private void uninstallTheme() {
- Uri packageURI = Uri.parse("package:" + mPkgName);
- Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
- uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, true);
- startActivity(uninstallIntent);
+ getChooserActivity().uninstallTheme(mPkgName);
}
public void setCurrentTheme(Map<String, String> currentTheme) {