summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTony <twickham@google.com>2017-06-02 15:43:26 -0700
committerTony <twickham@google.com>2017-06-02 18:21:05 -0700
commit629a67c5ac33409ebccf13284505a4cadc65656a (patch)
tree86622470fd8169d7a3f87460365718991de93497
parent8b6ea60facc33c973d1a8c432b91bbade851415c (diff)
downloadandroid_packages_apps_Trebuchet-629a67c5ac33409ebccf13284505a4cadc65656a.tar.gz
android_packages_apps_Trebuchet-629a67c5ac33409ebccf13284505a4cadc65656a.tar.bz2
android_packages_apps_Trebuchet-629a67c5ac33409ebccf13284505a4cadc65656a.zip
Migrate ColorExtractionService to JobService
IntentService cannot be run in the background, so moving to JobService prevents us from crashing if the wallpaper is changed while we aren't running. Bug: 62065291 Change-Id: Ie0c887e36d0ced43a0b9ab8136bf55eb37697489
-rw-r--r--AndroidManifest-common.xml3
-rw-r--r--src/com/android/launcher3/Utilities.java3
-rw-r--r--src/com/android/launcher3/dynamicui/ColorExtractionService.java93
-rw-r--r--src/com/android/launcher3/dynamicui/ExtractionUtils.java10
4 files changed, 75 insertions, 34 deletions
diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml
index 3a60a9878..ab582feb9 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 android:name="com.android.launcher3.notification.NotificationListener"
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 207a7d4af..b5c44bb02 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -61,7 +61,6 @@ import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashSet;
import java.util.Locale;
-import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
@@ -110,6 +109,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 f94d442e0..a2e118e26 100644
--- a/src/com/android/launcher3/dynamicui/ColorExtractionService.java
+++ b/src/com/android/launcher3/dynamicui/ColorExtractionService.java
@@ -17,15 +17,17 @@
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.BitmapRegionDecoder;
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;
@@ -41,45 +43,76 @@ 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
+ public void onCreate() {
+ super.onCreate();
+ mWorkerThread = new HandlerThread("ColorExtractionService");
+ mWorkerThread.start();
+ mWorkerHandler = new Handler(mWorkerThread.getLooper());
}
@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);
- } 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());
+ public void onDestroy() {
+ super.onDestroy();
+ mWorkerThread.quit();
+ }
+
+ @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);
+ } 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());
+ }
+ }
+
+ // 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) {