diff options
-rw-r--r-- | AndroidManifest-common.xml | 3 | ||||
-rw-r--r-- | src/com/android/launcher3/Utilities.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher3/dynamicui/ColorExtractionService.java | 105 | ||||
-rw-r--r-- | src/com/android/launcher3/dynamicui/ExtractionUtils.java | 10 |
4 files changed, 81 insertions, 39 deletions
diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index dd1446635..7c040a808 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -82,7 +82,8 @@ <service android:name="com.android.launcher3.dynamicui.ColorExtractionService" android:exported="false" - android:process=":wallpaper_chooser"> + android:process=":wallpaper_chooser" + android:permission="android.permission.BIND_JOB_SERVICE"> </service> <service diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java index 61c970789..ffda67c38 100644 --- a/src/com/android/launcher3/Utilities.java +++ b/src/com/android/launcher3/Utilities.java @@ -110,6 +110,8 @@ public final class Utilities { // An intent extra to indicate the horizontal scroll of the wallpaper. public static final String EXTRA_WALLPAPER_OFFSET = "com.android.launcher3.WALLPAPER_OFFSET"; + public static final int COLOR_EXTRACTION_JOB_ID = 1; + // These values are same as that in {@link AsyncTask}. private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static final int CORE_POOL_SIZE = CPU_COUNT + 1; diff --git a/src/com/android/launcher3/dynamicui/ColorExtractionService.java b/src/com/android/launcher3/dynamicui/ColorExtractionService.java index 06a4dabdd..b9dd3b588 100644 --- a/src/com/android/launcher3/dynamicui/ColorExtractionService.java +++ b/src/com/android/launcher3/dynamicui/ColorExtractionService.java @@ -17,9 +17,9 @@ package com.android.launcher3.dynamicui; import android.annotation.TargetApi; -import android.app.IntentService; import android.app.WallpaperManager; -import android.content.Intent; +import android.app.job.JobParameters; +import android.app.job.JobService; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapRegionDecoder; @@ -27,6 +27,8 @@ import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.support.v7.graphics.Palette; import android.util.Log; @@ -42,53 +44,84 @@ import java.io.IOException; /** * Extracts colors from the wallpaper, and saves results to {@link LauncherProvider}. */ -public class ColorExtractionService extends IntentService { +public class ColorExtractionService extends JobService { private static final String TAG = "ColorExtractionService"; + private static final boolean DEBUG = false; /** The fraction of the wallpaper to extract colors for use on the hotseat. */ private static final float HOTSEAT_FRACTION = 1f / 4; - public ColorExtractionService() { - super("ColorExtractionService"); - } + private HandlerThread mWorkerThread; + private Handler mWorkerHandler; @Override - protected void onHandleIntent(Intent intent) { - WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); - int wallpaperId = ExtractionUtils.getWallpaperId(wallpaperManager); - - ExtractedColors extractedColors = new ExtractedColors(); - if (wallpaperManager.getWallpaperInfo() != null) { - // We can't extract colors from live wallpapers, so just use the default color always. - extractedColors.updateHotseatPalette(null); + public void onCreate() { + super.onCreate(); + mWorkerThread = new HandlerThread("ColorExtractionService"); + mWorkerThread.start(); + mWorkerHandler = new Handler(mWorkerThread.getLooper()); + } - if (FeatureFlags.QSB_IN_HOTSEAT || FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { - extractedColors.updateWallpaperThemePalette(null); - } - } else { - // We extract colors for the hotseat and status bar separately, - // since they only consider part of the wallpaper. - extractedColors.updateHotseatPalette(getHotseatPalette()); + @Override + public void onDestroy() { + super.onDestroy(); + mWorkerThread.quit(); + } - if (FeatureFlags.LIGHT_STATUS_BAR) { - extractedColors.updateStatusBarPalette(getStatusBarPalette()); - } + @Override + public boolean onStartJob(final JobParameters jobParameters) { + if (DEBUG) Log.d(TAG, "onStartJob"); + mWorkerHandler.post(new Runnable() { + @Override + public void run() { + WallpaperManager wallpaperManager = WallpaperManager.getInstance( + ColorExtractionService.this); + int wallpaperId = ExtractionUtils.getWallpaperId(wallpaperManager); + + ExtractedColors extractedColors = new ExtractedColors(); + if (wallpaperManager.getWallpaperInfo() != null) { + // We can't extract colors from live wallpapers; always use the default color. + extractedColors.updateHotseatPalette(null); + + if (FeatureFlags.QSB_IN_HOTSEAT || FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { + extractedColors.updateWallpaperThemePalette(null); + } + } else { + // We extract colors for the hotseat and status bar separately, + // since they only consider part of the wallpaper. + extractedColors.updateHotseatPalette(getHotseatPalette()); + + if (FeatureFlags.LIGHT_STATUS_BAR) { + extractedColors.updateStatusBarPalette(getStatusBarPalette()); + } + + if (FeatureFlags.QSB_IN_HOTSEAT || FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { + extractedColors.updateWallpaperThemePalette(getWallpaperPalette()); + } + } - if (FeatureFlags.QSB_IN_HOTSEAT || FeatureFlags.LAUNCHER3_GRADIENT_ALL_APPS) { - extractedColors.updateWallpaperThemePalette(getWallpaperPalette()); + // Save the extracted colors and wallpaper id to LauncherProvider. + String colorsString = extractedColors.encodeAsString(); + Bundle extras = new Bundle(); + extras.putInt(LauncherSettings.Settings.EXTRA_WALLPAPER_ID, wallpaperId); + extras.putString(LauncherSettings.Settings.EXTRA_EXTRACTED_COLORS, colorsString); + getContentResolver().call( + LauncherSettings.Settings.CONTENT_URI, + LauncherSettings.Settings.METHOD_SET_EXTRACTED_COLORS_AND_WALLPAPER_ID, + null, extras); + jobFinished(jobParameters, false /* needsReschedule */); + if (DEBUG) Log.d(TAG, "job finished!"); } - } + }); + return true; + } - // Save the extracted colors and wallpaper id to LauncherProvider. - String colorsString = extractedColors.encodeAsString(); - Bundle extras = new Bundle(); - extras.putInt(LauncherSettings.Settings.EXTRA_WALLPAPER_ID, wallpaperId); - extras.putString(LauncherSettings.Settings.EXTRA_EXTRACTED_COLORS, colorsString); - getContentResolver().call( - LauncherSettings.Settings.CONTENT_URI, - LauncherSettings.Settings.METHOD_SET_EXTRACTED_COLORS_AND_WALLPAPER_ID, - null, extras); + @Override + public boolean onStopJob(JobParameters jobParameters) { + if (DEBUG) Log.d(TAG, "onStopJob"); + mWorkerHandler.removeCallbacksAndMessages(null); + return true; } @TargetApi(Build.VERSION_CODES.N) diff --git a/src/com/android/launcher3/dynamicui/ExtractionUtils.java b/src/com/android/launcher3/dynamicui/ExtractionUtils.java index 1cf5d55e0..92cb5dc08 100644 --- a/src/com/android/launcher3/dynamicui/ExtractionUtils.java +++ b/src/com/android/launcher3/dynamicui/ExtractionUtils.java @@ -18,8 +18,10 @@ package com.android.launcher3.dynamicui; import android.annotation.TargetApi; import android.app.WallpaperManager; +import android.app.job.JobInfo; +import android.app.job.JobScheduler; +import android.content.ComponentName; import android.content.Context; -import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Build; @@ -58,7 +60,11 @@ public class ExtractionUtils { /** Starts the {@link ColorExtractionService} without checking the wallpaper id */ public static void startColorExtractionService(Context context) { - context.startService(new Intent(context, ColorExtractionService.class)); + JobScheduler jobScheduler = (JobScheduler) context.getSystemService( + Context.JOB_SCHEDULER_SERVICE); + jobScheduler.schedule(new JobInfo.Builder(Utilities.COLOR_EXTRACTION_JOB_ID, + new ComponentName(context, ColorExtractionService.class)) + .setMinimumLatency(0).build()); } private static boolean hasWallpaperIdChanged(Context context) { |