diff --git a/AndroidManifest-common.xml b/AndroidManifest-common.xml index 7c040a808b..ad404c09a9 100644 --- a/AndroidManifest-common.xml +++ b/AndroidManifest-common.xml @@ -89,7 +89,8 @@ + android:process=":wallpaper_chooser" + android:permission="android.permission.BIND_JOB_SERVICE" /> mListeners = new ArrayList<>(); @@ -80,6 +86,28 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { reloadColors(); } }, new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED)); + + // Register a receiver for results + String permission = null; + // Find a permission which only we can use. + try { + for (PermissionInfo info : context.getPackageManager().getPackageInfo( + context.getPackageName(), + PackageManager.GET_PERMISSIONS).permissions) { + if ((info.protectionLevel & PermissionInfo.PROTECTION_SIGNATURE) != 0) { + permission = info.name; + } + } + } catch (PackageManager.NameNotFoundException e) { + // Something went wrong. ignore + Log.d(TAG, "Unable to get permission info", e); + } + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + handleResult(intent.getStringExtra(KEY_COLORS)); + } + }, new IntentFilter(ACTION_EXTRACTION_COMPLETE), permission, new Handler()); } @Nullable @@ -94,15 +122,10 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { } private void reloadColors() { - ResultReceiver receiver = new ResultReceiver(new Handler()) { - - @Override - protected void onReceiveResult(int resultCode, Bundle resultData) { - handleResult(resultData.getString(KEY_COLORS)); - } - }; - mContext.startService(new Intent(mContext, ColorExtractionService.class) - .putExtra(EXTRA_RECEIVER, receiver)); + JobInfo job = new JobInfo.Builder(Utilities.WALLPAPER_COMPAT_JOB_ID, + new ComponentName(mContext, ColorExtractionService.class)) + .setMinimumLatency(0).build(); + ((JobScheduler) mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE)).schedule(job); } private void handleResult(String result) { @@ -141,18 +164,43 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { /** * Intent service to handle color extraction */ - public static class ColorExtractionService extends IntentService { + public static class ColorExtractionService extends JobService implements Runnable { private static final int MAX_WALLPAPER_EXTRACTION_AREA = 112 * 112; - 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 + public void onDestroy() { + super.onDestroy(); + mWorkerThread.quit(); + } + + @Override + public boolean onStartJob(final JobParameters jobParameters) { + mWorkerHandler.post(this); + return true; + } + + @Override + public boolean onStopJob(JobParameters jobParameters) { + mWorkerHandler.removeCallbacksAndMessages(null); + return true; } /** * Extracts the wallpaper colors and sends the result back through the receiver. */ @Override - protected void onHandleIntent(@Nullable Intent intent) { + public void run() { int wallpaperId = getWallpaperId(this); Bitmap bitmap = null; @@ -223,10 +271,10 @@ public class WallpaperManagerCompatVL extends WallpaperManagerCompat { value = builder.toString(); } - ResultReceiver receiver = intent.getParcelableExtra(EXTRA_RECEIVER); - Bundle result = new Bundle(); - result.putString(KEY_COLORS, value); - receiver.send(0, result); + // Send the result + sendBroadcast(new Intent(ACTION_EXTRACTION_COMPLETE) + .setPackage(getPackageName()) + .putExtra(KEY_COLORS, value)); } } }