diff options
-rw-r--r-- | AndroidManifest.xml | 3 | ||||
-rw-r--r-- | src/com/cyngn/theme/chooser/ChooserActivity.java | 62 | ||||
-rw-r--r-- | src/com/cyngn/theme/chooser/ThemeFragment.java | 7 |
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) { |