blob: 7d1587cf8dd03e23480d155dcf50488611b97970 [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;
Robert Snoeberger69956802019-04-16 16:55:21 -040024import android.util.TypedValue;
Robert Snoeberger496916b2019-01-15 18:00:58 -050025import android.view.LayoutInflater;
26import android.view.View;
27import android.widget.TextClock;
28
Robert Snoeberger2ba20602019-03-29 14:25:39 -040029import com.android.internal.colorextraction.ColorExtractor;
Robert Snoeberger496916b2019-01-15 18:00:58 -050030import com.android.keyguard.R;
Robert Snoeberger2ba20602019-03-29 14:25:39 -040031import com.android.systemui.colorextraction.SysuiColorExtractor;
Robert Snoeberger496916b2019-01-15 18:00:58 -050032import com.android.systemui.plugins.ClockPlugin;
33
34import java.util.TimeZone;
35
36/**
37 * Controller for Stretch clock that can appear on lock screen and AOD.
38 */
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040039public class AnalogClockController implements ClockPlugin {
Robert Snoeberger496916b2019-01-15 18:00:58 -050040
41 /**
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050042 * Resources used to get title and thumbnail.
43 */
44 private final Resources mResources;
45
46 /**
47 * LayoutInflater used to inflate custom clock views.
48 */
49 private final LayoutInflater mLayoutInflater;
50
51 /**
Robert Snoeberger2ba20602019-03-29 14:25:39 -040052 * Extracts accent color from wallpaper.
53 */
54 private final SysuiColorExtractor mColorExtractor;
55
56 /**
57 * Renders preview from clock view.
58 */
59 private final ViewPreviewer mRenderer = new ViewPreviewer();
60
61 /**
Robert Snoeberger496916b2019-01-15 18:00:58 -050062 * Custom clock shown on AOD screen and behind stack scroller on lock.
63 */
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040064 private ClockLayout mBigClockView;
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040065 private ImageClock mAnalogClock;
Robert Snoeberger496916b2019-01-15 18:00:58 -050066
67 /**
68 * Small clock shown on lock screen above stack scroller.
69 */
70 private View mView;
71 private TextClock mLockClock;
72
73 /**
Robert Snoeberger496916b2019-01-15 18:00:58 -050074 * Create a BubbleClockController instance.
75 *
Robert Snoeberger2ba20602019-03-29 14:25:39 -040076 * @param res Resources contains title and thumbnail.
77 * @param inflater Inflater used to inflate custom clock views.
78 * @param colorExtractor Extracts accent color from wallpaper.
Robert Snoeberger496916b2019-01-15 18:00:58 -050079 */
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040080 public AnalogClockController(Resources res, LayoutInflater inflater,
Robert Snoeberger2ba20602019-03-29 14:25:39 -040081 SysuiColorExtractor colorExtractor) {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050082 mResources = res;
83 mLayoutInflater = inflater;
Robert Snoeberger2ba20602019-03-29 14:25:39 -040084 mColorExtractor = colorExtractor;
Robert Snoeberger496916b2019-01-15 18:00:58 -050085 }
86
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050087 private void createViews() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -040088 mBigClockView = (ClockLayout) mLayoutInflater.inflate(R.layout.analog_clock, null);
Robert Snoeberger496916b2019-01-15 18:00:58 -050089 mAnalogClock = mBigClockView.findViewById(R.id.analog_clock);
Robert Snoeberger496916b2019-01-15 18:00:58 -050090
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050091 mView = mLayoutInflater.inflate(R.layout.digital_clock, null);
Robert Snoeberger496916b2019-01-15 18:00:58 -050092 mLockClock = mView.findViewById(R.id.lock_screen_clock);
Robert Snoeberger69956802019-04-16 16:55:21 -040093 final int textSize = mResources.getDimensionPixelSize(R.dimen.widget_title_font_size);
94 mLockClock.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
Robert Snoeberger496916b2019-01-15 18:00:58 -050095 }
96
Robert Snoeberger3358cfb2019-04-03 13:09:55 -040097
98 @Override
99 public void onDestroyView() {
100 mBigClockView = null;
Robert Snoeberger3358cfb2019-04-03 13:09:55 -0400101 mAnalogClock = null;
102 mView = null;
103 mLockClock = null;
Robert Snoeberger3358cfb2019-04-03 13:09:55 -0400104 }
105
Robert Snoeberger496916b2019-01-15 18:00:58 -0500106 @Override
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500107 public String getName() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400108 return "analog";
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500109 }
110
111 @Override
112 public String getTitle() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400113 return mResources.getString(R.string.clock_title_analog);
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500114 }
115
116 @Override
117 public Bitmap getThumbnail() {
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400118 return BitmapFactory.decodeResource(mResources, R.drawable.analog_thumbnail);
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500119 }
120
121 @Override
Robert Snoeberger2ba20602019-03-29 14:25:39 -0400122 public Bitmap getPreview(int width, int height) {
123
124 // Use the big clock view for the preview
125 View view = getBigClockView();
126
127 // Initialize state of plugin before generating preview.
128 setDarkAmount(1f);
129 setTextColor(Color.WHITE);
130 ColorExtractor.GradientColors colors = mColorExtractor.getColors(
131 WallpaperManager.FLAG_LOCK, true);
132 setColorPalette(colors.supportsDarkText(), colors.getColorPalette());
133 onTimeTick();
134
135 return mRenderer.createPreview(view, width, height);
136 }
137
138 @Override
Robert Snoeberger496916b2019-01-15 18:00:58 -0500139 public View getView() {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500140 if (mView == null) {
141 createViews();
142 }
Robert Snoeberger496916b2019-01-15 18:00:58 -0500143 return mView;
144 }
145
146 @Override
147 public View getBigClockView() {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500148 if (mBigClockView == null) {
149 createViews();
150 }
Robert Snoeberger496916b2019-01-15 18:00:58 -0500151 return mBigClockView;
152 }
153
154 @Override
Robert Snoeberger69956802019-04-16 16:55:21 -0400155 public int getPreferredY(int totalHeight) {
156 return totalHeight / 4;
157 }
158
159 @Override
Robert Snoeberger496916b2019-01-15 18:00:58 -0500160 public void setStyle(Style style) {}
161
162 @Override
Robert Snoeberger69956802019-04-16 16:55:21 -0400163 public void setTextColor(int color) { }
Robert Snoeberger0397c842019-02-07 14:25:46 -0500164
165 @Override
166 public void setColorPalette(boolean supportsDarkText, int[] colorPalette) {
167 if (colorPalette == null || colorPalette.length == 0) {
168 return;
169 }
170 final int length = colorPalette.length;
Robert Snoeberger69956802019-04-16 16:55:21 -0400171 mLockClock.setTextColor(colorPalette[Math.max(0, length - 2)]);
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400172 mAnalogClock.setClockColors(colorPalette[Math.max(0, length - 5)],
Robert Snoeberger0397c842019-02-07 14:25:46 -0500173 colorPalette[Math.max(0, length - 2)]);
Robert Snoeberger496916b2019-01-15 18:00:58 -0500174 }
175
176 @Override
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500177 public void onTimeTick() {
Robert Snoeberger496916b2019-01-15 18:00:58 -0500178 mAnalogClock.onTimeChanged();
Robert Snoeberger7fd7f512019-04-12 13:46:16 -0400179 mBigClockView.onTimeChanged();
Robert Snoeberger67e281c2019-03-21 14:04:20 -0400180 mLockClock.refresh();
Robert Snoeberger496916b2019-01-15 18:00:58 -0500181 }
182
183 @Override
Robert Snoeberger69956802019-04-16 16:55:21 -0400184 public void setDarkAmount(float darkAmount) { }
Robert Snoeberger496916b2019-01-15 18:00:58 -0500185
186 @Override
187 public void onTimeZoneChanged(TimeZone timeZone) {
188 mAnalogClock.onTimeZoneChanged(timeZone);
189 }
190
191 @Override
192 public boolean shouldShowStatusArea() {
Robert Snoeberger69956802019-04-16 16:55:21 -0400193 return true;
Robert Snoeberger496916b2019-01-15 18:00:58 -0500194 }
195}