From e4886a668f6fc7f04fa2c9e6de28c5e2e9f17d59 Mon Sep 17 00:00:00 2001 From: d34d Date: Fri, 29 Apr 2016 16:49:33 -0700 Subject: [PATCH] QS: Make themes a first class citizen again Change-Id: Icd397a2ddd730ae525233b66288fde9a6798c221 TICKET: CYNGNOS-2670 --- .../internal/ThemeManagerService.java | 42 +++++++++++++++++++ cm/res/res/drawable/ic_qs_themes.xml | 28 +++++++++++++ cm/res/res/values/strings.xml | 4 ++ cm/res/res/values/symbols.xml | 5 +++ .../internal/logging/CMMetricsLogger.java | 1 + .../internal/util/QSConstants.java | 2 + 6 files changed, 82 insertions(+) create mode 100644 cm/res/res/drawable/ic_qs_themes.xml diff --git a/cm/lib/main/java/org/cyanogenmod/platform/internal/ThemeManagerService.java b/cm/lib/main/java/org/cyanogenmod/platform/internal/ThemeManagerService.java index 7b6054c..125df02 100644 --- a/cm/lib/main/java/org/cyanogenmod/platform/internal/ThemeManagerService.java +++ b/cm/lib/main/java/org/cyanogenmod/platform/internal/ThemeManagerService.java @@ -21,6 +21,7 @@ import android.app.ActivityManagerNative; import android.app.IActivityManager; import android.app.Notification; import android.app.NotificationManager; +import android.app.PendingIntent; import android.app.WallpaperManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -55,6 +56,8 @@ import android.util.Log; import com.android.server.SystemService; import cyanogenmod.app.CMContextConstants; +import cyanogenmod.app.CMStatusBarManager; +import cyanogenmod.app.CustomTile; import cyanogenmod.providers.CMSettings; import cyanogenmod.providers.ThemesContract.MixnMatchColumns; import cyanogenmod.providers.ThemesContract.ThemesColumns; @@ -64,6 +67,8 @@ import cyanogenmod.themes.IThemeService; import cyanogenmod.themes.ThemeChangeRequest; import org.cyanogenmod.internal.util.ImageUtils; +import org.cyanogenmod.internal.util.QSConstants; +import org.cyanogenmod.internal.util.QSUtils; import org.cyanogenmod.internal.util.ThemeUtils; import org.cyanogenmod.platform.internal.AppsFailureReceiver; @@ -97,6 +102,8 @@ public class ThemeManagerService extends SystemService { private static final String CM_SETUPWIZARD_PACKAGE = "com.cyanogenmod.setupwizard"; private static final String MANAGED_PROVISIONING_PACKAGE = "com.android.managedprovisioning"; + private static final String CATEGORY_THEME_CHOOSER = "cyanogenmod.intent.category.APP_THEMES"; + // Defines a min and max compatible api level for themes on this system. private static final int MIN_COMPATIBLE_VERSION = 21; @@ -264,6 +271,8 @@ public class ThemeManagerService extends SystemService { } registerAppsFailureReceiver(); processInstalledThemes(); + } else if (phase == SystemService.PHASE_BOOT_COMPLETED) { + publishThemesTile(); } } @@ -1116,6 +1125,39 @@ public class ThemeManagerService extends SystemService { return SYSTEM_DEFAULT; } + private void publishThemesTile() { + // This action should be performed as system + final int userId = UserHandle.myUserId(); + long token = Binder.clearCallingIdentity(); + try { + final UserHandle user = new UserHandle(userId); + final Context resourceContext = QSUtils.getQSTileContext(mContext, userId); + + CMStatusBarManager statusBarManager = CMStatusBarManager.getInstance(mContext); + final PendingIntent chooserIntent = getThemeChooserPendingIntent(); + CustomTile tile = new CustomTile.Builder(resourceContext) + .setLabel(R.string.qs_themes_label) + .setContentDescription(R.string.qs_themes_content_description) + .setIcon(R.drawable.ic_qs_themes) + .setOnClickIntent(chooserIntent) + .setOnLongClickIntent(chooserIntent) + .shouldCollapsePanel(true) + .build(); + statusBarManager.publishTileAsUser(QSConstants.DYNAMIC_TILE_THEMES, + ThemeManagerService.class.hashCode(), tile, user); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private PendingIntent getThemeChooserPendingIntent() { + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.addCategory(CATEGORY_THEME_CHOOSER); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); + return PendingIntent.getActivity(mContext, ThemeManagerService.class.hashCode(), + intent, 0); + } + private final IBinder mService = new IThemeService.Stub() { @Override public void requestThemeChangeUpdates(IThemeChangeListener listener) diff --git a/cm/res/res/drawable/ic_qs_themes.xml b/cm/res/res/drawable/ic_qs_themes.xml new file mode 100644 index 0000000..f8c6cfb --- /dev/null +++ b/cm/res/res/drawable/ic_qs_themes.xml @@ -0,0 +1,28 @@ + + + + + + \ No newline at end of file diff --git a/cm/res/res/values/strings.xml b/cm/res/res/values/strings.xml index 2c57e00..1551adf 100644 --- a/cm/res/res/values/strings.xml +++ b/cm/res/res/values/strings.xml @@ -218,4 +218,8 @@ observe audio session changes Allows an app to observe audio streams being created and destroyed. + + Themes + Customize your theme + diff --git a/cm/res/res/values/symbols.xml b/cm/res/res/values/symbols.xml index fa31456..767f354 100644 --- a/cm/res/res/values/symbols.xml +++ b/cm/res/res/values/symbols.xml @@ -113,4 +113,9 @@ + + + + + diff --git a/sdk/src/java/org/cyanogenmod/internal/logging/CMMetricsLogger.java b/sdk/src/java/org/cyanogenmod/internal/logging/CMMetricsLogger.java index e3303d5..a059b3a 100644 --- a/sdk/src/java/org/cyanogenmod/internal/logging/CMMetricsLogger.java +++ b/sdk/src/java/org/cyanogenmod/internal/logging/CMMetricsLogger.java @@ -67,4 +67,5 @@ public class CMMetricsLogger extends MetricsLogger { public static final int TILE_BATTERY_SAVER = BASE + 40; public static final int TILE_CAFFEINE = BASE + 41; public static final int WEATHER_SETTINGS = BASE + 42; + public static final int TILE_THEMES = BASE + 43; } diff --git a/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java b/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java index c2cbc4d..c5e62eb 100644 --- a/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java +++ b/sdk/src/java/org/cyanogenmod/internal/util/QSConstants.java @@ -60,6 +60,7 @@ public class QSConstants { public static final String DYNAMIC_TILE_SU = "su"; public static final String DYNAMIC_TILE_ADB = "adb"; public static final String DYNAMIC_TILE_LIVE_DISPLAY = "live_display"; + public static final String DYNAMIC_TILE_THEMES = "themes"; protected static final ArrayList STATIC_TILES_AVAILABLE = new ArrayList(); protected static final ArrayList DYNAMIC_TILES_AVAILBLE = new ArrayList(); @@ -107,5 +108,6 @@ public class QSConstants { DYNAMIC_TILES_AVAILBLE.add(DYNAMIC_TILE_NEXT_ALARM); DYNAMIC_TILES_AVAILBLE.add(DYNAMIC_TILE_SU); DYNAMIC_TILES_AVAILBLE.add(DYNAMIC_TILE_LIVE_DISPLAY); + DYNAMIC_TILES_AVAILBLE.add(DYNAMIC_TILE_THEMES); } }