blob: 387f2656c6f8115b3262ccfbf042988e93771e50 [file] [log] [blame]
Robert Snoebergerce8c2042019-01-17 10:36:02 -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 Snoeberger9ad03f42019-02-28 14:47:49 -050018import android.content.res.Resources;
19import android.graphics.Bitmap;
20import android.graphics.BitmapFactory;
Robert Snoebergerce8c2042019-01-17 10:36:02 -050021import android.graphics.Paint.Style;
22import android.view.LayoutInflater;
23import android.view.View;
24
25import com.android.keyguard.R;
26import com.android.systemui.plugins.ClockPlugin;
27
28import java.util.TimeZone;
29
30/**
31 * Plugin for a custom Typographic clock face that displays the time in words.
32 */
33public class TypeClockController implements ClockPlugin {
34
35 /**
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050036 * Resources used to get title and thumbnail.
37 */
38 private final Resources mResources;
39
40 /**
41 * LayoutInflater used to inflate custom clock views.
42 */
43 private final LayoutInflater mLayoutInflater;
44
45 /**
Robert Snoebergerce8c2042019-01-17 10:36:02 -050046 * Custom clock shown on AOD screen and behind stack scroller on lock.
47 */
48 private View mView;
49 private TypographicClock mTypeClock;
50
51 /**
52 * Small clock shown on lock screen above stack scroller.
53 */
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -050054 private TypographicClock mLockClock;
Robert Snoebergerce8c2042019-01-17 10:36:02 -050055
56 /**
57 * Controller for transition into dark state.
58 */
59 private CrossFadeDarkController mDarkController;
60
Robert Snoebergerce8c2042019-01-17 10:36:02 -050061 /**
62 * Create a TypeClockController instance.
63 *
64 * @param inflater Inflater used to inflate custom clock views.
65 */
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050066 TypeClockController(Resources res, LayoutInflater inflater) {
67 mResources = res;
68 mLayoutInflater = inflater;
Robert Snoebergerce8c2042019-01-17 10:36:02 -050069 }
70
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050071 private void createViews() {
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -050072 mView = mLayoutInflater.inflate(R.layout.type_aod_clock, null);
Robert Snoebergerce8c2042019-01-17 10:36:02 -050073 mTypeClock = mView.findViewById(R.id.type_clock);
74
75 // For now, this view is used to hide the default digital clock.
76 // Need better transition to lock screen.
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -050077 mLockClock = (TypographicClock) mLayoutInflater.inflate(R.layout.typographic_clock, null);
78 mLockClock.setVisibility(View.GONE);
79
80 mDarkController = new CrossFadeDarkController(mView, mLockClock);
Robert Snoebergerce8c2042019-01-17 10:36:02 -050081 }
82
83 @Override
Robert Snoeberger9ad03f42019-02-28 14:47:49 -050084 public String getName() {
85 return "type";
86 }
87
88 @Override
89 public String getTitle() {
90 return mResources.getString(R.string.clock_title_type);
91 }
92
93 @Override
94 public Bitmap getThumbnail() {
95 return BitmapFactory.decodeResource(mResources, R.drawable.type_thumbnail);
96 }
97
98 @Override
Robert Snoebergerce8c2042019-01-17 10:36:02 -050099 public View getView() {
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -0500100 if (mLockClock == null) {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500101 createViews();
102 }
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -0500103 return mLockClock;
Robert Snoebergerce8c2042019-01-17 10:36:02 -0500104 }
105
106 @Override
107 public View getBigClockView() {
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500108 if (mView == null) {
109 createViews();
110 }
Robert Snoebergerce8c2042019-01-17 10:36:02 -0500111 return mView;
112 }
113
114 @Override
115 public void setStyle(Style style) {}
116
117 @Override
118 public void setTextColor(int color) {
119 mTypeClock.setTextColor(color);
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -0500120 mLockClock.setTextColor(color);
Robert Snoebergerce8c2042019-01-17 10:36:02 -0500121 }
122
123 @Override
Robert Snoeberger0397c842019-02-07 14:25:46 -0500124 public void setColorPalette(boolean supportsDarkText, int[] colorPalette) {
125 if (colorPalette == null || colorPalette.length == 0) {
126 return;
127 }
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -0500128 final int color = colorPalette[Math.max(0, colorPalette.length - 5)];
129 mTypeClock.setClockColor(color);
130 mLockClock.setClockColor(color);
Robert Snoeberger0397c842019-02-07 14:25:46 -0500131 }
132
133 @Override
Robert Snoeberger9ad03f42019-02-28 14:47:49 -0500134 public void onTimeTick() {
Robert Snoebergerce8c2042019-01-17 10:36:02 -0500135 mTypeClock.onTimeChanged();
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -0500136 mLockClock.onTimeChanged();
Robert Snoebergerce8c2042019-01-17 10:36:02 -0500137 }
138
139 @Override
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -0500140 public void setDarkAmount(float darkAmount) {
141 if (mDarkController != null) {
142 mDarkController.setDarkAmount(darkAmount);
143 }
144 }
Robert Snoebergerce8c2042019-01-17 10:36:02 -0500145
146 @Override
147 public void onTimeZoneChanged(TimeZone timeZone) {
148 mTypeClock.onTimeZoneChanged(timeZone);
Robert Snoeberger1f19d2c2019-03-06 10:03:05 -0500149 mLockClock.onTimeZoneChanged(timeZone);
Robert Snoebergerce8c2042019-01-17 10:36:02 -0500150 }
151
152 @Override
153 public boolean shouldShowStatusArea() {
154 return false;
155 }
156}