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
199 lines
5.8 KiB
Java
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;
|
|
}
|
|
}
|