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);
}
}