1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.launcher3.dynamicui;
18
19import android.app.IntentService;
20import android.app.WallpaperManager;
21import android.content.Intent;
22import android.graphics.Bitmap;
23import android.graphics.drawable.BitmapDrawable;
24import android.os.Bundle;
25import android.support.v7.graphics.Palette;
26
27import com.android.launcher3.LauncherProvider;
28import com.android.launcher3.LauncherSettings;
29import com.android.launcher3.R;
30import com.android.launcher3.config.FeatureFlags;
31
32/**
33 * Extracts colors from the wallpaper, and saves results to {@link LauncherProvider}.
34 */
35public class ColorExtractionService extends IntentService {
36
37    /** The fraction of the wallpaper to extract colors for use on the hotseat. */
38    private static final float HOTSEAT_FRACTION = 1f / 4;
39
40    public ColorExtractionService() {
41        super("ColorExtractionService");
42    }
43
44    @Override
45    protected void onHandleIntent(Intent intent) {
46        WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
47        int wallpaperId = ExtractionUtils.getWallpaperId(wallpaperManager);
48        ExtractedColors extractedColors = new ExtractedColors();
49        if (wallpaperManager.getWallpaperInfo() != null) {
50            // We can't extract colors from live wallpapers, so just use the default color always.
51            extractedColors.updatePalette(null);
52            extractedColors.updateHotseatPalette(null);
53        } else {
54            Bitmap wallpaper = ((BitmapDrawable) wallpaperManager.getDrawable()).getBitmap();
55            Palette palette = Palette.from(wallpaper).generate();
56            extractedColors.updatePalette(palette);
57            // We extract colors for the hotseat and status bar separately,
58            // since they only consider part of the wallpaper.
59            Palette hotseatPalette = Palette.from(wallpaper)
60                    .setRegion(0, (int) (wallpaper.getHeight() * (1f - HOTSEAT_FRACTION)),
61                            wallpaper.getWidth(), wallpaper.getHeight())
62                    .clearFilters()
63                    .generate();
64            extractedColors.updateHotseatPalette(hotseatPalette);
65
66            if (FeatureFlags.LIGHT_STATUS_BAR) {
67                int statusBarHeight = getResources()
68                        .getDimensionPixelSize(R.dimen.status_bar_height);
69                Palette statusBarPalette = Palette.from(wallpaper)
70                        .setRegion(0, 0, wallpaper.getWidth(), statusBarHeight)
71                        .clearFilters()
72                        .generate();
73                extractedColors.updateStatusBarPalette(statusBarPalette);
74            }
75        }
76
77        // Save the extracted colors and wallpaper id to LauncherProvider.
78        String colorsString = extractedColors.encodeAsString();
79        Bundle extras = new Bundle();
80        extras.putInt(LauncherSettings.Settings.EXTRA_WALLPAPER_ID, wallpaperId);
81        extras.putString(LauncherSettings.Settings.EXTRA_EXTRACTED_COLORS, colorsString);
82        getContentResolver().call(
83                LauncherSettings.Settings.CONTENT_URI,
84                LauncherSettings.Settings.METHOD_SET_EXTRACTED_COLORS_AND_WALLPAPER_ID,
85                null, extras);
86    }
87}
88