blob: eba24004e387b7b76c6f53068e4adb03e26b76a2 [file] [log] [blame]
Robert Snoeberger496916b2019-01-15 18:00:58 -05001/*
2 * Copyright (C) 2019 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 */
16package com.android.keyguard.clock;
17
Robert Snoeberger2ba20602019-03-29 14:25:39 -040018import android.app.WallpaperManager;
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050019import android.content.res.Resources;
20import android.graphics.Bitmap;
21import android.graphics.BitmapFactory;
Robert Snoeberger2ba20602019-03-29 14:25:39 -040022import android.graphics.Color;
Robert Snoeberger496916b2019-01-15 18:00:58 -050023import android.graphics.Paint.Style;
24import android.view.LayoutInflater;
25import android.view.View;
26import android.widget.TextClock;
27
Robert Snoeberger2ba20602019-03-29 14:25:39 -040028import com.android.internal.colorextraction.ColorExtractor;
Sunny Goyal87fccf02019-08-13 17:39:10 -070029import com.android.systemui.R;
Robert Snoeberger2ba20602019-03-29 14:25:39 -040030import com.android.systemui.colorextraction.SysuiColorExtractor;
Robert Snoeberger496916b2019-01-15 18:00:58 -050031import com.android.systemui.plugins.ClockPlugin;
32
33import java.util.TimeZone;
34
35/**
36 * Controller for Stretch clock that can appear on lock screen and AOD.
37 */
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040038public class AnalogClockController implements ClockPlugin {
Robert Snoeberger496916b2019-01-15 18:00:58 -050039
40 /**
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050041 * Resources used to get title and thumbnail.
42 */
43 private final Resources mResources;
44
45 /**
46 * LayoutInflater used to inflate custom clock views.
47 */
48 private final LayoutInflater mLayoutInflater;
49
50 /**
Robert Snoeberger2ba20602019-03-29 14:25:39 -040051 * Extracts accent color from wallpaper.
52 */
53 private final SysuiColorExtractor mColorExtractor;
54
55 /**
Robert Snoeberger4cbd1592019-04-24 14:20:38 -040056 * Computes preferred position of clock.
57 */
58 private final SmallClockPosition mClockPosition;
59
60 /**
Robert Snoeberger2ba20602019-03-29 14:25:39 -040061 * Renders preview from clock view.
62 */
63 private final ViewPreviewer mRenderer = new ViewPreviewer();
64
65 /**
Robert Snoeberger496916b2019-01-15 18:00:58 -050066 * Custom clock shown on AOD screen and behind stack scroller on lock.
67 */
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040068 private ClockLayout mBigClockView;
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040069 private ImageClock mAnalogClock;
Robert Snoeberger496916b2019-01-15 18:00:58 -050070
71 /**
72 * Small clock shown on lock screen above stack scroller.
73 */
74 private View mView;
75 private TextClock mLockClock;
76
77 /**
Robert Snoebergerf2af1202019-06-05 14:38:01 -040078 * Helper to extract colors from wallpaper palette for clock face.
79 */
80 private final ClockPalette mPalette = new ClockPalette();
81
82 /**
Robert Snoeberger496916b2019-01-15 18:00:58 -050083 * Create a BubbleClockController instance.
84 *
Robert Snoeberger2ba20602019-03-29 14:25:39 -040085 * @param res Resources contains title and thumbnail.
86 * @param inflater Inflater used to inflate custom clock views.
87 * @param colorExtractor Extracts accent color from wallpaper.
Robert Snoeberger496916b2019-01-15 18:00:58 -050088 */
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040089 public AnalogClockController(Resources res, LayoutInflater inflater,
Robert Snoeberger2ba20602019-03-29 14:25:39 -040090 SysuiColorExtractor colorExtractor) {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050091 mResources = res;
92 mLayoutInflater = inflater;
Robert Snoeberger2ba20602019-03-29 14:25:39 -040093 mColorExtractor = colorExtractor;
Robert Snoeberger4cbd1592019-04-24 14:20:38 -040094 mClockPosition = new SmallClockPosition(res);
Robert Snoeberger496916b2019-01-15 18:00:58 -050095 }
96
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050097 private void createViews() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040098 mBigClockView = (ClockLayout) mLayoutInflater.inflate(R.layout.analog_clock, null);
Robert Snoeberger496916b2019-01-15 18:00:58 -050099 mAnalogClock = mBigClockView.findViewById(R.id.analog_clock);
Robert Snoeberger496916b2019-01-15 18:00:58 -0500100
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500101 mView = mLayoutInflater.inflate(R.layout.digital_clock, null);
Robert Snoeberger496916b2019-01-15 18:00:58 -0500102 mLockClock = mView.findViewById(R.id.lock_screen_clock);
Robert Snoeberger496916b2019-01-15 18:00:58 -0500103 }
104
Robert Snoeberger3358cfb2019-04-03 13:09:55 -0400105 @Override
106 public void onDestroyView() {
107 mBigClockView = null;
Robert Snoeberger3358cfb2019-04-03 13:09:55 -0400108 mAnalogClock = null;
109 mView = null;
110 mLockClock = null;
Robert Snoeberger3358cfb2019-04-03 13:09:55 -0400111 }
112
Robert Snoeberger496916b2019-01-15 18:00:58 -0500113 @Override
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500114 public String getName() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400115 return "analog";
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500116 }
117
118 @Override
119 public String getTitle() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400120 return mResources.getString(R.string.clock_title_analog);
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500121 }
122
123 @Override
124 public Bitmap getThumbnail() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400125 return BitmapFactory.decodeResource(mResources, R.drawable.analog_thumbnail);
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500126 }
127
128 @Override
Robert Snoeberger2ba20602019-03-29 14:25:39 -0400129 public Bitmap getPreview(int width, int height) {
130
131 // Use the big clock view for the preview
132 View view = getBigClockView();
133
134 // Initialize state of plugin before generating preview.
135 setDarkAmount(1f);
136 setTextColor(Color.WHITE);
137 ColorExtractor.GradientColors colors = mColorExtractor.getColors(
Lucas Dupin89233c42019-06-10 18:00:22 -0700138 WallpaperManager.FLAG_LOCK);
Robert Snoeberger2ba20602019-03-29 14:25:39 -0400139 setColorPalette(colors.supportsDarkText(), colors.getColorPalette());
140 onTimeTick();
141
142 return mRenderer.createPreview(view, width, height);
143 }
144
145 @Override
Robert Snoeberger496916b2019-01-15 18:00:58 -0500146 public View getView() {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500147 if (mView == null) {
148 createViews();
149 }
Robert Snoeberger496916b2019-01-15 18:00:58 -0500150 return mView;
151 }
152
153 @Override
154 public View getBigClockView() {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500155 if (mBigClockView == null) {
156 createViews();
157 }
Robert Snoeberger496916b2019-01-15 18:00:58 -0500158 return mBigClockView;
159 }
160
161 @Override
Robert Snoeberger69956802019-04-16 16:55:21 -0400162 public int getPreferredY(int totalHeight) {
Robert Snoeberger4cbd1592019-04-24 14:20:38 -0400163 return mClockPosition.getPreferredY();
Robert Snoeberger69956802019-04-16 16:55:21 -0400164 }
165
166 @Override
Robert Snoeberger496916b2019-01-15 18:00:58 -0500167 public void setStyle(Style style) {}
168
169 @Override
Robert Snoebergerf2af1202019-06-05 14:38:01 -0400170 public void setTextColor(int color) {
171 updateColor();
172 }
Robert Snoeberger0397c842019-02-07 14:25:46 -0500173
174 @Override
175 public void setColorPalette(boolean supportsDarkText, int[] colorPalette) {
Robert Snoebergerf2af1202019-06-05 14:38:01 -0400176 mPalette.setColorPalette(supportsDarkText, colorPalette);
177 updateColor();
178 }
179
180 private void updateColor() {
181 final int primary = mPalette.getPrimaryColor();
182 final int secondary = mPalette.getSecondaryColor();
183 mLockClock.setTextColor(secondary);
184 mAnalogClock.setClockColors(primary, secondary);
Robert Snoeberger496916b2019-01-15 18:00:58 -0500185 }
186
187 @Override
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500188 public void onTimeTick() {
Robert Snoeberger496916b2019-01-15 18:00:58 -0500189 mAnalogClock.onTimeChanged();
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400190 mBigClockView.onTimeChanged();
Robert Snoeberger67e281c2019-03-21 14:04:20 -0400191 mLockClock.refresh();
Robert Snoeberger496916b2019-01-15 18:00:58 -0500192 }
193
194 @Override
Robert Snoeberger4cbd1592019-04-24 14:20:38 -0400195 public void setDarkAmount(float darkAmount) {
Robert Snoebergerf2af1202019-06-05 14:38:01 -0400196 mPalette.setDarkAmount(darkAmount);
Robert Snoeberger4cbd1592019-04-24 14:20:38 -0400197 mClockPosition.setDarkAmount(darkAmount);
Robert Snoebergere9aa87b2019-04-29 16:37:14 -0400198 mBigClockView.setDarkAmount(darkAmount);
Robert Snoeberger4cbd1592019-04-24 14:20:38 -0400199 }
Robert Snoeberger496916b2019-01-15 18:00:58 -0500200
201 @Override
202 public void onTimeZoneChanged(TimeZone timeZone) {
203 mAnalogClock.onTimeZoneChanged(timeZone);
204 }
205
206 @Override
207 public boolean shouldShowStatusArea() {
Robert Snoeberger69956802019-04-16 16:55:21 -0400208 return true;
Robert Snoeberger496916b2019-01-15 18:00:58 -0500209 }
210}