Files
frameworks_base/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java
Robert Snoeberger 9c1074fbaa Send time zone changed event to clock plugin.
This prevents plugins from needing to register for time zone
changed broadcasts. The event can be relayed from
KeyguardUpdateMonitor.

Bug: 120666411
Test: example plugin updates when time zone is changed
Change-Id: I84732887527db8575504af27cc8ed537118696c6
2018-12-10 09:33:38 -05:00

199 lines
5.8 KiB
Java

package com.android.keyguard;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextClock;
import androidx.annotation.VisibleForTesting;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.ClockPlugin;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.shared.plugins.PluginManager;
import java.util.Objects;
import java.util.TimeZone;
/**
* Switch to show plugin clock when plugin is connected, otherwise it will show default clock.
*/
public class KeyguardClockSwitch extends FrameLayout {
/**
* Optional/alternative clock injected via plugin.
*/
private ClockPlugin mClockPlugin;
/**
* Default clock.
*/
private TextClock mClockView;
private final PluginListener<ClockPlugin> mClockPluginListener =
new PluginListener<ClockPlugin>() {
@Override
public void onPluginConnected(ClockPlugin plugin, Context pluginContext) {
View view = plugin.getView();
if (view != null) {
disconnectPlugin();
// For now, assume that the most recently connected plugin is the
// selected clock face. In the future, the user should be able to
// pick a clock face from the available plugins.
mClockPlugin = plugin;
addView(view, -1,
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
initPluginParams();
mClockView.setVisibility(View.GONE);
}
}
@Override
public void onPluginDisconnected(ClockPlugin plugin) {
if (Objects.equals(plugin, mClockPlugin)) {
disconnectPlugin();
mClockView.setVisibility(View.VISIBLE);
}
}
};
public KeyguardClockSwitch(Context context) {
this(context, null);
}
public KeyguardClockSwitch(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mClockView = findViewById(R.id.default_clock_view);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
Dependency.get(PluginManager.class).addPluginListener(mClockPluginListener,
ClockPlugin.class);
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
Dependency.get(PluginManager.class).removePluginListener(mClockPluginListener);
}
/**
* It will also update plugin setStyle if plugin is connected.
*/
public void setStyle(Style style) {
mClockView.getPaint().setStyle(style);
if (mClockPlugin != null) {
mClockPlugin.setStyle(style);
}
}
/**
* It will also update plugin setTextColor if plugin is connected.
*/
public void setTextColor(int color) {
mClockView.setTextColor(color);
if (mClockPlugin != null) {
mClockPlugin.setTextColor(color);
}
}
public void setShowCurrentUserTime(boolean showCurrentUserTime) {
mClockView.setShowCurrentUserTime(showCurrentUserTime);
}
public void setElegantTextHeight(boolean elegant) {
mClockView.setElegantTextHeight(elegant);
}
public void setTextSize(int unit, float size) {
mClockView.setTextSize(unit, size);
}
public void setFormat12Hour(CharSequence format) {
mClockView.setFormat12Hour(format);
}
public void setFormat24Hour(CharSequence format) {
mClockView.setFormat24Hour(format);
}
/**
* Set the amount (ratio) that the device has transitioned to doze.
* @param darkAmount Amount of transition to doze: 1f for doze and 0f for awake.
*/
public void setDarkAmount(float darkAmount) {
if (mClockPlugin != null) {
mClockPlugin.setDarkAmount(darkAmount);
}
}
public Paint getPaint() {
return mClockView.getPaint();
}
public int getCurrentTextColor() {
return mClockView.getCurrentTextColor();
}
public float getTextSize() {
return mClockView.getTextSize();
}
public void refresh() {
mClockView.refresh();
}
/**
* Notifies that time tick alarm from doze service fired.
*/
public void dozeTimeTick() {
if (mClockPlugin != null) {
mClockPlugin.dozeTimeTick();
}
}
/**
* Notifies that the time zone has changed.
*/
public void onTimeZoneChanged(TimeZone timeZone) {
if (mClockPlugin != null) {
mClockPlugin.onTimeZoneChanged(timeZone);
}
}
/**
* When plugin changes, set all kept parameters into newer plugin.
*/
private void initPluginParams() {
if (mClockPlugin != null) {
mClockPlugin.setStyle(getPaint().getStyle());
mClockPlugin.setTextColor(getCurrentTextColor());
}
}
private void disconnectPlugin() {
if (mClockPlugin != null) {
View view = mClockPlugin.getView();
if (view != null) {
removeView(view);
}
mClockPlugin = null;
}
}
@VisibleForTesting (otherwise = VisibleForTesting.NONE)
PluginListener getClockPluginListener() {
return mClockPluginListener;
}
}