Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 629a67c5 authored by Tony's avatar Tony
Browse files

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
parent 8b6ea60f
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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"
+2 −1
Original line number Diff line number Diff line
@@ -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;
+63 −30
Original line number Diff line number Diff line
@@ -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,25 +43,44 @@ 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);
    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, so just use the default color always.
                    // 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,
@@ -80,6 +101,18 @@ public class ColorExtractionService extends IntentService {
                        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;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        if (DEBUG) Log.d(TAG, "onStopJob");
        mWorkerHandler.removeCallbacksAndMessages(null);
        return true;
    }

    @TargetApi(Build.VERSION_CODES.N)
+8 −2
Original line number Diff line number Diff line
@@ -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) {