diff options
author | Richard MacGregor <rmacgregor@cyngn.com> | 2015-05-28 15:59:03 -0700 |
---|---|---|
committer | Richard MacGregor <rmacgregor@cyngn.com> | 2015-05-29 12:05:09 -0700 |
commit | 1c5c017dd27126f84309072ba5d602a7977816e6 (patch) | |
tree | e11176e404faab932c57e40c70e01c7d312fc2fa /src | |
parent | 9819db1f4e1443e9eda6f22f99f32937cc1e3130 (diff) | |
download | packages_apps_ThemeChooser-1c5c017dd27126f84309072ba5d602a7977816e6.zip packages_apps_ThemeChooser-1c5c017dd27126f84309072ba5d602a7977816e6.tar.gz packages_apps_ThemeChooser-1c5c017dd27126f84309072ba5d602a7977816e6.tar.bz2 |
Introduce Theme Versioning
Move sql query construction into new class.
Consolidate shared Loader_ID_* states across different classes.
Include versioning to allow for certain functions to not be called,
and sql queries not built if frameworks doesn't support them.
Depends on:
http://review.cyanogenmod.org/#/c/99452/
http://review.cyanogenmod.org/#/c/99600/
Change-Id: I8061f1894890fa7e2221e1d4f4c90c4ed503e3d1
Diffstat (limited to 'src')
-rw-r--r-- | src/com/cyngn/theme/chooser/ChooserActivity.java | 32 | ||||
-rw-r--r-- | src/com/cyngn/theme/chooser/ComponentSelector.java | 126 | ||||
-rw-r--r-- | src/com/cyngn/theme/chooser/MyThemeFragment.java | 29 | ||||
-rw-r--r-- | src/com/cyngn/theme/chooser/ThemeFragment.java | 170 | ||||
-rw-r--r-- | src/com/cyngn/theme/util/CursorLoaderHelper.java | 369 |
5 files changed, 419 insertions, 307 deletions
diff --git a/src/com/cyngn/theme/chooser/ChooserActivity.java b/src/com/cyngn/theme/chooser/ChooserActivity.java index 1158782..c851abe 100644 --- a/src/com/cyngn/theme/chooser/ChooserActivity.java +++ b/src/com/cyngn/theme/chooser/ChooserActivity.java @@ -53,6 +53,7 @@ import android.view.animation.AnimationUtils; import android.widget.ImageView; import com.cyngn.theme.perapptheming.PerAppThemingWindow; +import com.cyngn.theme.util.CursorLoaderHelper; import com.cyngn.theme.util.NotificationHelper; import com.cyngn.theme.util.PreferenceUtils; import com.cyngn.theme.util.TypefaceHelperCache; @@ -69,6 +70,9 @@ import static android.provider.ThemesContract.ThemesColumns.MODIFIES_RINGTONES; import static com.cyngn.theme.chooser.ComponentSelector.DEFAULT_COMPONENT_ID; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_INSTALLED_THEMES; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_APPLIED; + public class ChooserActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> { public static final String THEME_STORE_PACKAGE = "com.cyngn.themestore"; @@ -80,10 +84,6 @@ public class ChooserActivity extends FragmentActivity private static final int OFFSCREEN_PAGE_LIMIT = 3; - private static final int LOADER_ID_INSTALLED_THEMES = 1000; - private static final int LOADER_ID_APPLIED = 1001; - - private static final String THEME_STORE_ACTIVITY = THEME_STORE_PACKAGE + ".ui.StoreActivity"; private static final String ACTION_APPLY_THEME = "android.intent.action.APPLY_THEME"; private static final String PERMISSION_WRITE_THEME = "android.permission.WRITE_THEMES"; @@ -879,37 +879,15 @@ public class ChooserActivity extends FragmentActivity @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { - String selection = null; - String selectionArgs[] = null; - String sortOrder = null; - String[] projection = null; - Uri contentUri = null; - switch (id) { case LOADER_ID_INSTALLED_THEMES: mAppliedBaseTheme = PreferenceUtils.getAppliedBaseTheme(this); - selection = ThemesColumns.PRESENT_AS_THEME + "=? AND " + - ThemesColumns.INSTALL_STATE + "=?"; - selectionArgs = new String[] { "1", "" + ThemesColumns.InstallState.INSTALLED}; - // 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, " - + ThemesColumns.INSTALL_TIME + " DESC"; - contentUri = ThemesColumns.CONTENT_URI; - projection = new String[] {ThemesColumns.PKG_NAME, ThemesColumns.TITLE, - ThemesColumns.AUTHOR}; break; case LOADER_ID_APPLIED: //TODO: Mix n match query should only be done once - contentUri = ThemesContract.MixnMatchColumns.CONTENT_URI; - selection = null; - selectionArgs = null; break; } - - - return new CursorLoader(this, contentUri, projection, selection, - selectionArgs, sortOrder); + return CursorLoaderHelper.chooserActivityCursorLoader(this, id, mAppliedBaseTheme); } public class ThemesAdapter extends NewFragmentStatePagerAdapter { diff --git a/src/com/cyngn/theme/chooser/ComponentSelector.java b/src/com/cyngn/theme/chooser/ComponentSelector.java index d47c47a..57bc749 100644 --- a/src/com/cyngn/theme/chooser/ComponentSelector.java +++ b/src/com/cyngn/theme/chooser/ComponentSelector.java @@ -40,6 +40,7 @@ import android.widget.TextView; import android.widget.Toast; import com.cyngn.theme.util.AudioUtils; +import com.cyngn.theme.util.CursorLoaderHelper; import com.cyngn.theme.util.ThemedTypefaceHelper; import com.cyngn.theme.util.TypefaceHelperCache; import com.cyngn.theme.util.Utils; @@ -56,6 +57,18 @@ import static android.provider.ThemesContract.ThemesColumns.MODIFIES_NAVIGATION_ import static android.provider.ThemesContract.ThemesColumns.MODIFIES_ICONS; import static android.provider.ThemesContract.ThemesColumns.MODIFIES_FONTS; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_STATUS_BAR; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_FONT; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_ICONS; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_WALLPAPER; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_NAVIGATION_BAR; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_LOCKSCREEN; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_STYLE; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_BOOT_ANIMATION; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_RINGTONE; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_NOTIFICATION; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_ALARM; + public class ComponentSelector extends LinearLayout implements LoaderManager.LoaderCallbacks<Cursor> { private static final String TAG = ComponentSelector.class.getSimpleName(); @@ -64,18 +77,6 @@ public class ComponentSelector extends LinearLayout public static final String EXTERNAL_WALLPAPER = "external"; - private static final int LOADER_ID_STATUS_BAR = 100; - private static final int LOADER_ID_NAVIGATION_BAR = 101; - private static final int LOADER_ID_FONT = 102; - private static final int LOADER_ID_ICON = 103; - private static final int LOADER_ID_STYLE = 104; - private static final int LOADER_ID_WALLPAPER = 105; - private static final int LOADER_ID_BOOTANIMATIONS = 106; - private static final int LOADER_ID_RINGTONE = 107; - private static final int LOADER_ID_NOTIFICATION = 108; - private static final int LOADER_ID_ALARM = 109; - private static final int LOADER_ID_LOCKSCREEN = 110; - private static final int EXTRA_WALLPAPER_COMPONENTS = 2; protected static final long DEFAULT_COMPONENT_ID = 0; @@ -277,7 +278,7 @@ public class ComponentSelector extends LinearLayout return LOADER_ID_FONT; } if (MODIFIES_ICONS.equals(component)) { - return LOADER_ID_ICON; + return LOADER_ID_ICONS; } if (MODIFIES_OVERLAYS.equals(component)) { return LOADER_ID_STYLE; @@ -286,7 +287,7 @@ public class ComponentSelector extends LinearLayout return LOADER_ID_WALLPAPER; } if (MODIFIES_BOOT_ANIM.equals(component)) { - return LOADER_ID_BOOTANIMATIONS; + return LOADER_ID_BOOT_ANIMATION; } if (MODIFIES_RINGTONES.equals(component)) { return LOADER_ID_RINGTONE; @@ -305,96 +306,7 @@ public class ComponentSelector extends LinearLayout @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { - Uri uri = PreviewColumns.CONTENT_URI; - String selection; - String[] selectionArgs = { "1" }; - String[] projection = { ThemesColumns.TITLE, ThemesColumns.PKG_NAME }; - switch(id) { - case LOADER_ID_STATUS_BAR: - selection = MODIFIES_STATUS_BAR + "=?"; - projection = new String[] { - PreviewColumns.STATUSBAR_WIFI_ICON, - PreviewColumns.STATUSBAR_SIGNAL_ICON, - PreviewColumns.STATUSBAR_BLUETOOTH_ICON, - PreviewColumns.STATUSBAR_BACKGROUND, - PreviewColumns.STATUSBAR_BATTERY_CIRCLE, - PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, - PreviewColumns.STATUSBAR_BATTERY_PORTRAIT, - ThemesColumns.TITLE, - ThemesColumns.PKG_NAME - }; - break; - case LOADER_ID_NAVIGATION_BAR: - selection = MODIFIES_NAVIGATION_BAR + "=?"; - projection = new String[] { - PreviewColumns.NAVBAR_BACK_BUTTON, - PreviewColumns.STATUSBAR_BACKGROUND, - ThemesColumns.TITLE, - ThemesColumns.PKG_NAME, - }; - break; - case LOADER_ID_FONT: - selection = MODIFIES_FONTS + "=?"; - break; - case LOADER_ID_ICON: - selection = MODIFIES_ICONS + "=?"; - projection = new String[] { - PreviewColumns.ICON_PREVIEW_1, - ThemesColumns.TITLE, - ThemesColumns.PKG_NAME - }; - break; - case LOADER_ID_STYLE: - selection = MODIFIES_OVERLAYS + "=?"; - projection = new String[] { - PreviewColumns.STYLE_THUMBNAIL, - ThemesColumns.TITLE, - ThemesColumns.PKG_NAME - }; - break; - case LOADER_ID_WALLPAPER: - uri = PreviewColumns.COMPONENTS_URI; - selection = MODIFIES_LAUNCHER + "=?"; - projection = new String[] { - PreviewColumns.WALLPAPER_THUMBNAIL, - ThemesColumns.TITLE, - ThemesColumns.PKG_NAME, - PreviewColumns.COMPONENT_ID - }; - break; - case LOADER_ID_BOOTANIMATIONS: - selection = MODIFIES_BOOT_ANIM + "=?"; - projection = new String[] { - PreviewColumns.BOOTANIMATION_THUMBNAIL, - ThemesColumns.TITLE, - ThemesColumns.PKG_NAME - }; - break; - case LOADER_ID_RINGTONE: - selection = MODIFIES_RINGTONES + "=?"; - break; - case LOADER_ID_NOTIFICATION: - selection = MODIFIES_NOTIFICATIONS + "=?"; - break; - case LOADER_ID_ALARM: - selection = MODIFIES_ALARMS + "=?"; - break; - case LOADER_ID_LOCKSCREEN: - selection = MODIFIES_LOCKSCREEN + "=?"; - projection = new String[] { - PreviewColumns.LOCK_WALLPAPER_THUMBNAIL, - ThemesColumns.TITLE, - ThemesColumns.PKG_NAME, - PreviewColumns.COMPONENT_ID - }; - break; - default: - return null; - } - // sort in ascending order but make sure the "default" theme is always first - String sortOrder = "(" + ThemesContract.ThemesColumns.IS_DEFAULT_THEME + "=1) DESC, " - + ThemesContract.ThemesColumns.TITLE + " ASC"; - return new CursorLoader(mContext, uri, projection, selection, selectionArgs, sortOrder); + return CursorLoaderHelper.componentSelectorCursorLoader(mContext, id); } @Override @@ -418,7 +330,7 @@ public class ComponentSelector extends LinearLayout count = (int) Math.ceil((double)count / mItemsPerPage); mContent.setShowDividers(LinearLayout.SHOW_DIVIDER_NONE); break; - case LOADER_ID_BOOTANIMATIONS: + case LOADER_ID_BOOT_ANIMATION: dividerPadding = res.getDimensionPixelSize( R.dimen.component_divider_padding_top_bootani); dividerHeight = res.getDimensionPixelSize(R.dimen.component_divider_height_bootani); @@ -598,11 +510,13 @@ public class ComponentSelector extends LinearLayout cursor.moveToPosition(position - EXTRA_WALLPAPER_COMPONENTS); int pkgNameIndex = cursor.getColumnIndex(ThemesContract.ThemesColumns.PKG_NAME); int cmpntIdIndex = cursor.getColumnIndex(PreviewColumns.COMPONENT_ID); + long cmpntId = (cmpntIdIndex >= 0) ? + cursor.getLong(cmpntIdIndex) : DEFAULT_COMPONENT_ID; iv.setImageBitmap( Utils.loadBitmapBlob(cursor, wallpaperIndex)); setTitle(((TextView) v.findViewById(R.id.title)), cursor); v.setTag(R.id.tag_key_package_name, cursor.getString(pkgNameIndex)); - v.setTag(R.id.tag_key_component_id, cursor.getLong(cmpntIdIndex)); + v.setTag(R.id.tag_key_component_id, cmpntId); } v.setOnClickListener(mItemClickListener); return v; diff --git a/src/com/cyngn/theme/chooser/MyThemeFragment.java b/src/com/cyngn/theme/chooser/MyThemeFragment.java index d1c14a1..ab0b485 100644 --- a/src/com/cyngn/theme/chooser/MyThemeFragment.java +++ b/src/com/cyngn/theme/chooser/MyThemeFragment.java @@ -40,6 +40,7 @@ import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import com.cyngn.theme.util.AudioUtils; +import com.cyngn.theme.util.CursorLoaderHelper; import com.cyngn.theme.util.PreferenceUtils; import com.cyngn.theme.util.ThemedTypefaceHelper; import com.cyngn.theme.util.TypefaceHelperCache; @@ -51,7 +52,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import static com.cyngn.theme.chooser.ComponentSelector.DEFAULT_COMPONENT_ID; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_ALL; public class MyThemeFragment extends ThemeFragment { private static final String TAG = MyThemeFragment.class.getSimpleName(); @@ -333,8 +334,6 @@ public class MyThemeFragment extends ThemeFragment { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { - Uri uri; - String[] projection; switch (id) { case LOADER_ID_ALL: if (args != null) { @@ -343,29 +342,7 @@ public class MyThemeFragment extends ThemeFragment { return super.onCreateLoader(id, args); } } - projection = new String[]{ - PreviewColumns.WALLPAPER_PREVIEW, - PreviewColumns.STATUSBAR_BACKGROUND, - PreviewColumns.STATUSBAR_WIFI_ICON, - PreviewColumns.STATUSBAR_WIFI_COMBO_MARGIN_END, - PreviewColumns.STATUSBAR_BLUETOOTH_ICON, - PreviewColumns.STATUSBAR_SIGNAL_ICON, - PreviewColumns.STATUSBAR_CLOCK_TEXT_COLOR, - PreviewColumns.STATUSBAR_BATTERY_CIRCLE, - PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, - PreviewColumns.STATUSBAR_BATTERY_PORTRAIT, - PreviewColumns.NAVBAR_BACK_BUTTON, - PreviewColumns.NAVBAR_HOME_BUTTON, - PreviewColumns.NAVBAR_RECENT_BUTTON, - PreviewColumns.ICON_PREVIEW_1, - PreviewColumns.ICON_PREVIEW_2, - PreviewColumns.ICON_PREVIEW_3, - PreviewColumns.LOCK_WALLPAPER_PREVIEW, - PreviewColumns.STYLE_PREVIEW, - PreviewColumns.NAVBAR_BACKGROUND - }; - uri = PreviewColumns.APPLIED_URI; - return new CursorLoader(getActivity(), uri, projection, null, null, null); + return CursorLoaderHelper.myThemeFragmentCursorLoader(getActivity(), id); default: // Only LOADER_ID_ALL differs for MyThemeFragment return super.onCreateLoader(id, args); diff --git a/src/com/cyngn/theme/chooser/ThemeFragment.java b/src/com/cyngn/theme/chooser/ThemeFragment.java index c1aa725..77daf1d 100644 --- a/src/com/cyngn/theme/chooser/ThemeFragment.java +++ b/src/com/cyngn/theme/chooser/ThemeFragment.java @@ -74,6 +74,7 @@ import android.widget.TextView; import com.cyngn.theme.chooser.ComponentSelector.OnItemClickedListener; import com.cyngn.theme.util.AudioUtils; import com.cyngn.theme.util.BootAnimationHelper; +import com.cyngn.theme.util.CursorLoaderHelper; import com.cyngn.theme.util.IconPreviewHelper; import com.cyngn.theme.util.PreferenceUtils; import com.cyngn.theme.util.ThemedTypefaceHelper; @@ -85,6 +86,8 @@ import com.cyngn.theme.widget.ConfirmCancelOverlay; import com.cyngn.theme.widget.LockableScrollView; import com.cyngn.theme.widget.ThemeTagLayout; +import cyanogenmod.app.ThemeVersion; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -109,6 +112,20 @@ import static android.provider.ThemesContract.ThemesColumns.MODIFIES_FONTS; import static com.cyngn.theme.chooser.ComponentSelector.DEFAULT_COMPONENT_ID; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_INVALID; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_ALL; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_STATUS_BAR; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_FONT; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_ICONS; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_WALLPAPER; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_NAVIGATION_BAR; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_LOCKSCREEN; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_STYLE; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_BOOT_ANIMATION; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_RINGTONE; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_NOTIFICATION; +import static com.cyngn.theme.util.CursorLoaderHelper.LOADER_ID_ALARM; + import static android.content.pm.ThemeUtils.SYSTEM_TARGET_API; public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, @@ -151,20 +168,6 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb protected static final String WALLPAPER_NONE = ""; - protected static final int LOADER_ID_INVALID = -1; - protected static final int LOADER_ID_ALL = 0; - protected static final int LOADER_ID_STATUS_BAR = 1; - protected static final int LOADER_ID_FONT = 2; - protected static final int LOADER_ID_ICONS = 3; - protected static final int LOADER_ID_WALLPAPER = 4; - protected static final int LOADER_ID_NAVIGATION_BAR = 5; - protected static final int LOADER_ID_LOCKSCREEN = 6; - protected static final int LOADER_ID_STYLE = 7; - protected static final int LOADER_ID_BOOT_ANIMATION = 8; - protected static final int LOADER_ID_RINGTONE = 9; - protected static final int LOADER_ID_NOTIFICATION = 10; - protected static final int LOADER_ID_ALARM = 11; - protected static final String ARG_PACKAGE_NAME = "pkgName"; protected static final String ARG_COMPONENT_ID = "cmpntId"; protected static final String ARG_SKIP_LOADING_ANIM = "skipLoadingAnim"; @@ -284,6 +287,8 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb protected boolean mIsLegacyTheme; + private static final int mThemeVersion = ThemeVersion.getVersion(); + protected enum CustomizeResetAction { Customize, Reset, @@ -1208,139 +1213,8 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb pkgName = args.getString(ARG_PACKAGE_NAME); componentId = args.getLong(ARG_COMPONENT_ID, DEFAULT_COMPONENT_ID); } - Uri uri = ThemesContract.PreviewColumns.CONTENT_URI; - String selection = ThemesContract.ThemesColumns.PKG_NAME + "= ?"; - String[] selectionArgs = new String[] { pkgName }; - String[] projection = null; - switch (id) { - case LOADER_ID_ALL: - // Load all default component previews (component_id == 0) - selection = ThemesContract.ThemesColumns.PKG_NAME + "=? AND " + - PreviewColumns.COMPONENT_ID + "=?"; - selectionArgs = new String[] { pkgName, String.valueOf(DEFAULT_COMPONENT_ID) }; - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE, - ThemesColumns.AUTHOR, - ThemesColumns.WALLPAPER_URI, - ThemesColumns.HOMESCREEN_URI, - ThemesColumns.TARGET_API, - // Theme abilities - ThemesColumns.MODIFIES_LAUNCHER, - ThemesColumns.MODIFIES_LOCKSCREEN, - ThemesColumns.MODIFIES_ALARMS, - ThemesColumns.MODIFIES_BOOT_ANIM, - ThemesColumns.MODIFIES_FONTS, - ThemesColumns.MODIFIES_ICONS, - ThemesColumns.MODIFIES_NAVIGATION_BAR, - ThemesColumns.MODIFIES_OVERLAYS, - ThemesColumns.MODIFIES_RINGTONES, - ThemesColumns.MODIFIES_STATUS_BAR, - ThemesColumns.MODIFIES_NOTIFICATIONS, - //Previews - PreviewColumns.WALLPAPER_PREVIEW, - PreviewColumns.STATUSBAR_BACKGROUND, - PreviewColumns.STATUSBAR_WIFI_ICON, - PreviewColumns.STATUSBAR_WIFI_COMBO_MARGIN_END, - PreviewColumns.STATUSBAR_BLUETOOTH_ICON, - PreviewColumns.STATUSBAR_SIGNAL_ICON, - PreviewColumns.STATUSBAR_CLOCK_TEXT_COLOR, - PreviewColumns.STATUSBAR_BATTERY_CIRCLE, - PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, - PreviewColumns.STATUSBAR_BATTERY_PORTRAIT, - PreviewColumns.NAVBAR_BACK_BUTTON, - PreviewColumns.NAVBAR_HOME_BUTTON, - PreviewColumns.NAVBAR_RECENT_BUTTON, - PreviewColumns.ICON_PREVIEW_1, - PreviewColumns.ICON_PREVIEW_2, - PreviewColumns.ICON_PREVIEW_3, - PreviewColumns.LOCK_WALLPAPER_PREVIEW, - PreviewColumns.STYLE_PREVIEW - }; - break; - case LOADER_ID_STATUS_BAR: - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE, - PreviewColumns.STATUSBAR_BACKGROUND, - PreviewColumns.STATUSBAR_WIFI_ICON, - PreviewColumns.STATUSBAR_WIFI_COMBO_MARGIN_END, - PreviewColumns.STATUSBAR_BLUETOOTH_ICON, - PreviewColumns.STATUSBAR_SIGNAL_ICON, - PreviewColumns.STATUSBAR_CLOCK_TEXT_COLOR, - PreviewColumns.STATUSBAR_BATTERY_CIRCLE, - PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, - PreviewColumns.STATUSBAR_BATTERY_PORTRAIT - }; - break; - case LOADER_ID_FONT: - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE - }; - break; - case LOADER_ID_ICONS: - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE, - PreviewColumns.ICON_PREVIEW_1, - PreviewColumns.ICON_PREVIEW_2, - PreviewColumns.ICON_PREVIEW_3, - }; - break; - case LOADER_ID_WALLPAPER: - uri = PreviewColumns.COMPONENTS_URI; - // Load specified wallpaper previews (component_id is specified) - selection = ThemesContract.ThemesColumns.PKG_NAME + "=? AND " + - PreviewColumns.COMPONENT_ID + "=?"; - selectionArgs = new String[] { pkgName, String.valueOf(componentId) }; - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE, - PreviewColumns.WALLPAPER_PREVIEW, - PreviewColumns.COMPONENT_ID - }; - break; - case LOADER_ID_NAVIGATION_BAR: - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE, - PreviewColumns.STATUSBAR_BACKGROUND, - PreviewColumns.NAVBAR_BACK_BUTTON, - PreviewColumns.NAVBAR_HOME_BUTTON, - PreviewColumns.NAVBAR_RECENT_BUTTON - }; - break; - case LOADER_ID_LOCKSCREEN: - projection = new String[]{ - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE, - PreviewColumns.LOCK_WALLPAPER_PREVIEW - }; - break; - case LOADER_ID_STYLE: - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE, - PreviewColumns.STYLE_PREVIEW - }; - break; - case LOADER_ID_BOOT_ANIMATION: - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE - }; - break; - case LOADER_ID_RINGTONE: - case LOADER_ID_NOTIFICATION: - case LOADER_ID_ALARM: - projection = new String[] { - ThemesColumns.PKG_NAME, - ThemesColumns.TITLE - }; - break; - } - return new CursorLoader(getActivity(), uri, projection, selection, selectionArgs, null); + return CursorLoaderHelper.themeFragmentCursorLoader(getActivity(), id, pkgName, + componentId); } @Override @@ -2172,7 +2046,7 @@ public class ThemeFragment extends Fragment implements LoaderManager.LoaderCallb builder.setComponent(component, componentMap.get(component)); } builder.setRequestType(requestType); - builder.setWallpaperId(mSelectedWallpaperComponentId); + if (mThemeVersion >= 3) builder.setWallpaperId(mSelectedWallpaperComponentId); return builder.build(); } diff --git a/src/com/cyngn/theme/util/CursorLoaderHelper.java b/src/com/cyngn/theme/util/CursorLoaderHelper.java new file mode 100644 index 0000000..b315f38 --- /dev/null +++ b/src/com/cyngn/theme/util/CursorLoaderHelper.java @@ -0,0 +1,369 @@ +/* + * Copyright (C) 2015 Cyanogen, Inc. + */ +package com.cyngn.theme.util; + +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.provider.ThemesContract; +import android.provider.ThemesContract.MixnMatchColumns; +import android.provider.ThemesContract.PreviewColumns; +import android.provider.ThemesContract.ThemesColumns; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; + +import cyanogenmod.app.ThemeVersion; + +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_ALARMS; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_BOOT_ANIM; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_LAUNCHER; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_LOCKSCREEN; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_NOTIFICATIONS; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_OVERLAYS; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_RINGTONES; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_STATUS_BAR; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_NAVIGATION_BAR; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_ICONS; +import static android.provider.ThemesContract.ThemesColumns.MODIFIES_FONTS; + +public class CursorLoaderHelper { + + public static final int LOADER_ID_INVALID = -1; + public static final int LOADER_ID_ALL = 0; + public static final int LOADER_ID_STATUS_BAR = 1; + public static final int LOADER_ID_FONT = 2; + public static final int LOADER_ID_ICONS = 3; + public static final int LOADER_ID_WALLPAPER = 4; + public static final int LOADER_ID_NAVIGATION_BAR = 5; + public static final int LOADER_ID_LOCKSCREEN = 6; + public static final int LOADER_ID_STYLE = 7; + public static final int LOADER_ID_BOOT_ANIMATION = 8; + public static final int LOADER_ID_RINGTONE = 9; + public static final int LOADER_ID_NOTIFICATION = 10; + public static final int LOADER_ID_ALARM = 11; + public static final int LOADER_ID_INSTALLED_THEMES = 1000; + public static final int LOADER_ID_APPLIED = 1001; + + private static final long DEFAULT_COMPONENT_ID = 0; + + private static int mThemeVersion = ThemeVersion.getVersion(); + + public static Loader<Cursor> chooserActivityCursorLoader(Context context, int id, + String appliedBaseTheme) { + String selection = null; + String selectionArgs[] = null; + String sortOrder = null; + String[] projection = null; + Uri contentUri = null; + + switch (id) { + case LOADER_ID_INSTALLED_THEMES: + selection = ThemesColumns.PRESENT_AS_THEME + "=? AND " + + ThemesColumns.INSTALL_STATE + "=?"; + selectionArgs = new String[] { "1", "" + ThemesColumns.InstallState.INSTALLED}; + // sort in ascending order but make sure the "default" theme is always first + sortOrder = "(" + ThemesColumns.IS_DEFAULT_THEME + "=1) DESC, " + + "(" + ThemesColumns.PKG_NAME + "='" + appliedBaseTheme + "') DESC, " + + ThemesColumns.INSTALL_TIME + " DESC"; + contentUri = ThemesColumns.CONTENT_URI; + projection = new String[] {ThemesColumns.PKG_NAME, ThemesColumns.TITLE, + ThemesColumns.AUTHOR}; + break; + case LOADER_ID_APPLIED: + //TODO: Mix n match query should only be done once + contentUri = ThemesContract.MixnMatchColumns.CONTENT_URI; + selection = null; + selectionArgs = null; + break; + } + + return new CursorLoader(context, contentUri, projection, selection, + selectionArgs, sortOrder); + } + + public static Loader<Cursor> componentSelectorCursorLoader(Context context, int id) { + Uri uri = PreviewColumns.CONTENT_URI; + String selection; + String[] selectionArgs = { "1" }; + String[] projection = { ThemesColumns.TITLE, ThemesColumns.PKG_NAME }; + switch(id) { + case LOADER_ID_STATUS_BAR: + selection = MODIFIES_STATUS_BAR + "=?"; + projection = new String[] { + PreviewColumns.STATUSBAR_WIFI_ICON, + PreviewColumns.STATUSBAR_SIGNAL_ICON, + PreviewColumns.STATUSBAR_BLUETOOTH_ICON, + PreviewColumns.STATUSBAR_BACKGROUND, + PreviewColumns.STATUSBAR_BATTERY_CIRCLE, + PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, + PreviewColumns.STATUSBAR_BATTERY_PORTRAIT, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME + }; + break; + case LOADER_ID_NAVIGATION_BAR: + selection = MODIFIES_NAVIGATION_BAR + "=?"; + projection = new String[] { + PreviewColumns.NAVBAR_BACK_BUTTON, + PreviewColumns.STATUSBAR_BACKGROUND, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME, + }; + break; + case LOADER_ID_FONT: + selection = MODIFIES_FONTS + "=?"; + break; + case LOADER_ID_ICONS: + selection = MODIFIES_ICONS + "=?"; + projection = new String[] { + PreviewColumns.ICON_PREVIEW_1, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME + }; + break; + case LOADER_ID_STYLE: + selection = MODIFIES_OVERLAYS + "=?"; + projection = new String[] { + PreviewColumns.STYLE_THUMBNAIL, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME + }; + break; + case LOADER_ID_WALLPAPER: + selection = MODIFIES_LAUNCHER + "=?"; + if (mThemeVersion >= 3) { + uri = PreviewColumns.COMPONENTS_URI; + projection = new String[]{ + PreviewColumns.WALLPAPER_THUMBNAIL, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME, + PreviewColumns.COMPONENT_ID + }; + } else { + projection = new String[]{ + PreviewColumns.WALLPAPER_THUMBNAIL, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME + }; + } + break; + case LOADER_ID_BOOT_ANIMATION: + selection = MODIFIES_BOOT_ANIM + "=?"; + projection = new String[] { + PreviewColumns.BOOTANIMATION_THUMBNAIL, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME + }; + break; + case LOADER_ID_RINGTONE: + selection = MODIFIES_RINGTONES + "=?"; + break; + case LOADER_ID_NOTIFICATION: + selection = MODIFIES_NOTIFICATIONS + "=?"; + break; + case LOADER_ID_ALARM: + selection = MODIFIES_ALARMS + "=?"; + break; + case LOADER_ID_LOCKSCREEN: + selection = MODIFIES_LOCKSCREEN + "=?"; + if (mThemeVersion >= 3) { + projection = new String[]{ + PreviewColumns.LOCK_WALLPAPER_THUMBNAIL, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME, + PreviewColumns.COMPONENT_ID + }; + } else { + projection = new String[]{ + PreviewColumns.LOCK_WALLPAPER_THUMBNAIL, + ThemesColumns.TITLE, + ThemesColumns.PKG_NAME + }; + } + break; + default: + return null; + } + // sort in ascending order but make sure the "default" theme is always first + String sortOrder = "(" + ThemesContract.ThemesColumns.IS_DEFAULT_THEME + "=1) DESC, " + + ThemesContract.ThemesColumns.TITLE + " ASC"; + return new CursorLoader(context, uri, projection, selection, selectionArgs, sortOrder); + } + + public static Loader<Cursor> myThemeFragmentCursorLoader(Context context, int id) { + Uri uri; + String[] projection; + projection = new String[]{ + PreviewColumns.WALLPAPER_PREVIEW, + PreviewColumns.STATUSBAR_BACKGROUND, + PreviewColumns.STATUSBAR_WIFI_ICON, + PreviewColumns.STATUSBAR_WIFI_COMBO_MARGIN_END, + PreviewColumns.STATUSBAR_BLUETOOTH_ICON, + PreviewColumns.STATUSBAR_SIGNAL_ICON, + PreviewColumns.STATUSBAR_CLOCK_TEXT_COLOR, + PreviewColumns.STATUSBAR_BATTERY_CIRCLE, + PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, + PreviewColumns.STATUSBAR_BATTERY_PORTRAIT, + PreviewColumns.NAVBAR_BACK_BUTTON, + PreviewColumns.NAVBAR_HOME_BUTTON, + PreviewColumns.NAVBAR_RECENT_BUTTON, + PreviewColumns.ICON_PREVIEW_1, + PreviewColumns.ICON_PREVIEW_2, + PreviewColumns.ICON_PREVIEW_3, + PreviewColumns.LOCK_WALLPAPER_PREVIEW, + PreviewColumns.STYLE_PREVIEW, + PreviewColumns.NAVBAR_BACKGROUND + }; + uri = PreviewColumns.APPLIED_URI; + return new CursorLoader(context, uri, projection, null, null, null); + } + + public static Loader<Cursor> themeFragmentCursorLoader(Context context, int id, String pkgName, + long componentId) { + Uri uri = PreviewColumns.CONTENT_URI; + String selection = ThemesContract.ThemesColumns.PKG_NAME + "= ?"; + String[] selectionArgs = new String[] { pkgName }; + String[] projection = null; + switch (id) { + case LOADER_ID_ALL: + if (mThemeVersion >= 3) { + // Load all default component previews (component_id == 0) + selection += " AND " + PreviewColumns.COMPONENT_ID + "=?"; + selectionArgs = new String[] { pkgName, String.valueOf(DEFAULT_COMPONENT_ID) }; + } else { + // SQL query will fail if we ask for PreviewColumns.COMPONENT_ID, don't add it. + selectionArgs = new String[]{pkgName}; + } + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + ThemesColumns.AUTHOR, + ThemesColumns.WALLPAPER_URI, + ThemesColumns.HOMESCREEN_URI, + ThemesColumns.TARGET_API, + // Theme abilities + ThemesColumns.MODIFIES_LAUNCHER, + ThemesColumns.MODIFIES_LOCKSCREEN, + ThemesColumns.MODIFIES_ALARMS, + ThemesColumns.MODIFIES_BOOT_ANIM, + ThemesColumns.MODIFIES_FONTS, + ThemesColumns.MODIFIES_ICONS, + ThemesColumns.MODIFIES_NAVIGATION_BAR, + ThemesColumns.MODIFIES_OVERLAYS, + ThemesColumns.MODIFIES_RINGTONES, + ThemesColumns.MODIFIES_STATUS_BAR, + ThemesColumns.MODIFIES_NOTIFICATIONS, + //Previews + PreviewColumns.WALLPAPER_PREVIEW, + PreviewColumns.STATUSBAR_BACKGROUND, + PreviewColumns.STATUSBAR_WIFI_ICON, + PreviewColumns.STATUSBAR_WIFI_COMBO_MARGIN_END, + PreviewColumns.STATUSBAR_BLUETOOTH_ICON, + PreviewColumns.STATUSBAR_SIGNAL_ICON, + PreviewColumns.STATUSBAR_CLOCK_TEXT_COLOR, + PreviewColumns.STATUSBAR_BATTERY_CIRCLE, + PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, + PreviewColumns.STATUSBAR_BATTERY_PORTRAIT, + PreviewColumns.NAVBAR_BACK_BUTTON, + PreviewColumns.NAVBAR_HOME_BUTTON, + PreviewColumns.NAVBAR_RECENT_BUTTON, + PreviewColumns.ICON_PREVIEW_1, + PreviewColumns.ICON_PREVIEW_2, + PreviewColumns.ICON_PREVIEW_3, + PreviewColumns.LOCK_WALLPAPER_PREVIEW, + PreviewColumns.STYLE_PREVIEW + }; + break; + case LOADER_ID_STATUS_BAR: + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + PreviewColumns.STATUSBAR_BACKGROUND, + PreviewColumns.STATUSBAR_WIFI_ICON, + PreviewColumns.STATUSBAR_WIFI_COMBO_MARGIN_END, + PreviewColumns.STATUSBAR_BLUETOOTH_ICON, + PreviewColumns.STATUSBAR_SIGNAL_ICON, + PreviewColumns.STATUSBAR_CLOCK_TEXT_COLOR, + PreviewColumns.STATUSBAR_BATTERY_CIRCLE, + PreviewColumns.STATUSBAR_BATTERY_LANDSCAPE, + PreviewColumns.STATUSBAR_BATTERY_PORTRAIT + }; + break; + case LOADER_ID_FONT: + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE + }; + break; + case LOADER_ID_ICONS: + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + PreviewColumns.ICON_PREVIEW_1, + PreviewColumns.ICON_PREVIEW_2, + PreviewColumns.ICON_PREVIEW_3, + }; + break; + case LOADER_ID_WALLPAPER: + if (mThemeVersion >= 3) { + uri = PreviewColumns.COMPONENTS_URI; + // Load specified wallpaper previews (component_id is specified) + selection += " AND " + PreviewColumns.COMPONENT_ID + "=?"; + selectionArgs = new String[]{pkgName, String.valueOf(componentId)}; + projection = new String[]{ + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + PreviewColumns.WALLPAPER_PREVIEW, + PreviewColumns.COMPONENT_ID + }; + } else { + projection = new String[]{ + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + PreviewColumns.WALLPAPER_PREVIEW + }; + } + break; + case LOADER_ID_NAVIGATION_BAR: + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + PreviewColumns.STATUSBAR_BACKGROUND, + PreviewColumns.NAVBAR_BACK_BUTTON, + PreviewColumns.NAVBAR_HOME_BUTTON, + PreviewColumns.NAVBAR_RECENT_BUTTON + }; + break; + case LOADER_ID_LOCKSCREEN: + projection = new String[]{ + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + PreviewColumns.LOCK_WALLPAPER_PREVIEW + }; + break; + case LOADER_ID_STYLE: + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE, + PreviewColumns.STYLE_PREVIEW + }; + break; + case LOADER_ID_BOOT_ANIMATION: + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE + }; + break; + case LOADER_ID_RINGTONE: + case LOADER_ID_NOTIFICATION: + case LOADER_ID_ALARM: + projection = new String[] { + ThemesColumns.PKG_NAME, + ThemesColumns.TITLE + }; + break; + } + return new CursorLoader(context, uri, projection, selection, selectionArgs, null); + } +}
\ No newline at end of file |