OSDN Git Service

Migrate ColorExtractionService to JobService
authorTony <twickham@google.com>
Fri, 2 Jun 2017 22:43:26 +0000 (15:43 -0700)
committerTony <twickham@google.com>
Sat, 3 Jun 2017 01:21:05 +0000 (18:21 -0700)
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

AndroidManifest-common.xml
src/com/android/launcher3/Utilities.java
src/com/android/launcher3/dynamicui/ColorExtractionService.java
src/com/android/launcher3/dynamicui/ExtractionUtils.java

index 3a60a98..ab582fe 100644 (file)
@@ -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"
index 207a7d4..b5c44bb 100644 (file)
@@ -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;
index f94d442..a2e118e 100644 (file)
 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)
index 1cf5d55..92cb5dc 100644 (file)
@@ -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) {