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