1827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham/* 2827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * Copyright (C) 2016 The Android Open Source Project 3827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * 4827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * Licensed under the Apache License, Version 2.0 (the "License"); 5827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * you may not use this file except in compliance with the License. 6827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * You may obtain a copy of the License at 7827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * 8827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * http://www.apache.org/licenses/LICENSE-2.0 9827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * 10827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * Unless required by applicable law or agreed to in writing, software 11827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * distributed under the License is distributed on an "AS IS" BASIS, 12827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * See the License for the specific language governing permissions and 14827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * limitations under the License. 15827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham */ 16827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham 17827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhampackage com.android.launcher3.dynamicui; 18827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham 19827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport android.app.IntentService; 20827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport android.app.WallpaperManager; 21827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport android.content.Intent; 22827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport android.graphics.Bitmap; 23827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport android.graphics.drawable.BitmapDrawable; 24827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport android.os.Bundle; 25827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport android.support.v7.graphics.Palette; 26827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham 27827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport com.android.launcher3.LauncherProvider; 28827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhamimport com.android.launcher3.LauncherSettings; 299311387a227d7bd894d880b897fb80ca34b39405Tony Wickhamimport com.android.launcher3.R; 300fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickhamimport com.android.launcher3.config.FeatureFlags; 31827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham 32827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham/** 33827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham * Extracts colors from the wallpaper, and saves results to {@link LauncherProvider}. 34827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham */ 35827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickhampublic class ColorExtractionService extends IntentService { 36827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham 37462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham /** The fraction of the wallpaper to extract colors for use on the hotseat. */ 38462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham private static final float HOTSEAT_FRACTION = 1f / 4; 39462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham 40827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham public ColorExtractionService() { 41827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham super("ColorExtractionService"); 42827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham } 43827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham 44827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham @Override 45827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham protected void onHandleIntent(Intent intent) { 46827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham WallpaperManager wallpaperManager = WallpaperManager.getInstance(this); 47827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham int wallpaperId = ExtractionUtils.getWallpaperId(wallpaperManager); 48827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham ExtractedColors extractedColors = new ExtractedColors(); 49827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham if (wallpaperManager.getWallpaperInfo() != null) { 50827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham // We can't extract colors from live wallpapers, so just use the default color always. 51827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham extractedColors.updatePalette(null); 52462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham extractedColors.updateHotseatPalette(null); 53827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham } else { 54827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham Bitmap wallpaper = ((BitmapDrawable) wallpaperManager.getDrawable()).getBitmap(); 55827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham Palette palette = Palette.from(wallpaper).generate(); 56827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham extractedColors.updatePalette(palette); 579311387a227d7bd894d880b897fb80ca34b39405Tony Wickham // We extract colors for the hotseat and status bar separately, 589311387a227d7bd894d880b897fb80ca34b39405Tony Wickham // since they only consider part of the wallpaper. 59462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham Palette hotseatPalette = Palette.from(wallpaper) 60462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham .setRegion(0, (int) (wallpaper.getHeight() * (1f - HOTSEAT_FRACTION)), 61462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham wallpaper.getWidth(), wallpaper.getHeight()) 62462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham .clearFilters() 63462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham .generate(); 64462b5cca7bb1d5e24fb8277b0cfe238cc2e1e980Tony Wickham extractedColors.updateHotseatPalette(hotseatPalette); 659311387a227d7bd894d880b897fb80ca34b39405Tony Wickham 660fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham if (FeatureFlags.LIGHT_STATUS_BAR) { 670fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham int statusBarHeight = getResources() 680fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham .getDimensionPixelSize(R.dimen.status_bar_height); 690fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham Palette statusBarPalette = Palette.from(wallpaper) 700fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham .setRegion(0, 0, wallpaper.getWidth(), statusBarHeight) 710fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham .clearFilters() 720fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham .generate(); 730fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham extractedColors.updateStatusBarPalette(statusBarPalette); 740fed55bf031087474a3833a3e28f4263c8dc7959Tony Wickham } 75827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham } 76827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham 77827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham // Save the extracted colors and wallpaper id to LauncherProvider. 78827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham String colorsString = extractedColors.encodeAsString(); 79827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham Bundle extras = new Bundle(); 80827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham extras.putInt(LauncherSettings.Settings.EXTRA_WALLPAPER_ID, wallpaperId); 81827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham extras.putString(LauncherSettings.Settings.EXTRA_EXTRACTED_COLORS, colorsString); 82827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham getContentResolver().call( 83827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham LauncherSettings.Settings.CONTENT_URI, 84827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham LauncherSettings.Settings.METHOD_SET_EXTRACTED_COLORS_AND_WALLPAPER_ID, 85827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham null, extras); 86827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham } 87827cef203f386cb548b98a7fa9888b75478c8e20Tony Wickham} 88