Merge "Add DND indicator to AOD" into pi-dev
am: c6163bf636
Change-Id: Ia6af65c0cc344fba759a7adc8a9463a11452b161
This commit is contained in:
committed by
android-build-merger
commit
b2ffa1ab94
@@ -451,10 +451,11 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
int width = MeasureSpec.getSize(widthMeasureSpec);
|
||||
for (int i = 0; i < getChildCount(); i++) {
|
||||
int childCount = getChildCount();
|
||||
for (int i = 0; i < childCount; i++) {
|
||||
View child = getChildAt(i);
|
||||
if (child instanceof KeyguardSliceButton) {
|
||||
((KeyguardSliceButton) child).setMaxWidth(width / 2);
|
||||
((KeyguardSliceButton) child).setMaxWidth(width / childCount);
|
||||
}
|
||||
}
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
@@ -482,12 +483,10 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
|
||||
@VisibleForTesting
|
||||
static class KeyguardSliceButton extends Button implements
|
||||
ConfigurationController.ConfigurationListener {
|
||||
private final Context mContext;
|
||||
|
||||
public KeyguardSliceButton(Context context) {
|
||||
super(context, null /* attrs */, 0 /* styleAttr */,
|
||||
com.android.keyguard.R.style.TextAppearance_Keyguard_Secondary);
|
||||
mContext = context;
|
||||
onDensityOrFontScaleChanged();
|
||||
setEllipsize(TruncateAt.END);
|
||||
}
|
||||
@@ -506,9 +505,20 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
|
||||
|
||||
@Override
|
||||
public void onDensityOrFontScaleChanged() {
|
||||
int horizontalPadding = (int) mContext.getResources()
|
||||
.getDimension(R.dimen.widget_horizontal_padding);
|
||||
setPadding(horizontalPadding / 2, 0, horizontalPadding / 2, 0);
|
||||
updatePadding();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setText(CharSequence text, BufferType type) {
|
||||
super.setText(text, type);
|
||||
updatePadding();
|
||||
}
|
||||
|
||||
private void updatePadding() {
|
||||
boolean hasText = !TextUtils.isEmpty(getText());
|
||||
int horizontalPadding = (int) getContext().getResources()
|
||||
.getDimension(R.dimen.widget_horizontal_padding) / 2;
|
||||
setPadding(horizontalPadding, 0, horizontalPadding * (hasText ? 1 : -1), 0);
|
||||
setCompoundDrawablePadding((int) mContext.getResources()
|
||||
.getDimension(R.dimen.widget_icon_padding));
|
||||
}
|
||||
@@ -524,6 +534,7 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe
|
||||
Drawable bottom) {
|
||||
super.setCompoundDrawables(left, top, right, bottom);
|
||||
updateDrawableColors();
|
||||
updatePadding();
|
||||
}
|
||||
|
||||
private void updateDrawableColors() {
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.android.systemui.keyguard;
|
||||
|
||||
import android.app.ActivityManager;
|
||||
import android.app.AlarmManager;
|
||||
import android.app.NotificationManager;
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
@@ -28,13 +29,16 @@ import android.icu.text.DateFormat;
|
||||
import android.icu.text.DisplayContext;
|
||||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.os.SystemClock;
|
||||
import android.provider.Settings;
|
||||
import android.service.notification.ZenModeConfig;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.android.internal.annotations.VisibleForTesting;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.statusbar.policy.NextAlarmController;
|
||||
import com.android.systemui.statusbar.policy.NextAlarmControllerImpl;
|
||||
import com.android.systemui.statusbar.policy.ZenModeController;
|
||||
import com.android.systemui.statusbar.policy.ZenModeControllerImpl;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
@@ -49,12 +53,13 @@ import androidx.slice.builders.ListBuilder.RowBuilder;
|
||||
* Simple Slice provider that shows the current date.
|
||||
*/
|
||||
public class KeyguardSliceProvider extends SliceProvider implements
|
||||
NextAlarmController.NextAlarmChangeCallback {
|
||||
NextAlarmController.NextAlarmChangeCallback, ZenModeController.Callback {
|
||||
|
||||
public static final String KEYGUARD_SLICE_URI = "content://com.android.systemui.keyguard/main";
|
||||
public static final String KEYGUARD_DATE_URI = "content://com.android.systemui.keyguard/date";
|
||||
public static final String KEYGUARD_NEXT_ALARM_URI =
|
||||
"content://com.android.systemui.keyguard/alarm";
|
||||
public static final String KEYGUARD_DND_URI = "content://com.android.systemui.keyguard/dnd";
|
||||
|
||||
/**
|
||||
* Only show alarms that will ring within N hours.
|
||||
@@ -62,11 +67,14 @@ public class KeyguardSliceProvider extends SliceProvider implements
|
||||
@VisibleForTesting
|
||||
static final int ALARM_VISIBILITY_HOURS = 12;
|
||||
|
||||
private final Date mCurrentTime = new Date();
|
||||
protected final Uri mSliceUri;
|
||||
protected final Uri mDateUri;
|
||||
protected final Uri mAlarmUri;
|
||||
protected final Uri mDndUri;
|
||||
private final Date mCurrentTime = new Date();
|
||||
private final Handler mHandler;
|
||||
private final AlarmManager.OnAlarmListener mUpdateNextAlarm = this::updateNextAlarm;
|
||||
private ZenModeController mZenModeController;
|
||||
private String mDatePattern;
|
||||
private DateFormat mDateFormat;
|
||||
private String mLastText;
|
||||
@@ -77,7 +85,6 @@ public class KeyguardSliceProvider extends SliceProvider implements
|
||||
protected AlarmManager mAlarmManager;
|
||||
protected ContentResolver mContentResolver;
|
||||
private AlarmManager.AlarmClockInfo mNextAlarmInfo;
|
||||
private final AlarmManager.OnAlarmListener mUpdateNextAlarm = this::updateNextAlarm;
|
||||
|
||||
/**
|
||||
* Receiver responsible for time ticking and updating the date format.
|
||||
@@ -112,6 +119,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
|
||||
mSliceUri = Uri.parse(KEYGUARD_SLICE_URI);
|
||||
mDateUri = Uri.parse(KEYGUARD_DATE_URI);
|
||||
mAlarmUri = Uri.parse(KEYGUARD_NEXT_ALARM_URI);
|
||||
mDndUri = Uri.parse(KEYGUARD_DND_URI);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -119,6 +127,7 @@ public class KeyguardSliceProvider extends SliceProvider implements
|
||||
ListBuilder builder = new ListBuilder(getContext(), mSliceUri);
|
||||
builder.addRow(new RowBuilder(builder, mDateUri).setTitle(mLastText));
|
||||
addNextAlarm(builder);
|
||||
addZenMode(builder);
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
@@ -134,18 +143,53 @@ public class KeyguardSliceProvider extends SliceProvider implements
|
||||
builder.addRow(alarmRowBuilder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add zen mode (DND) icon to slice if it's enabled.
|
||||
* @param builder The slice builder.
|
||||
*/
|
||||
protected void addZenMode(ListBuilder builder) {
|
||||
if (!isDndSuppressingNotifications()) {
|
||||
return;
|
||||
}
|
||||
RowBuilder dndBuilder = new RowBuilder(builder, mDndUri)
|
||||
.addEndItem(Icon.createWithResource(getContext(), R.drawable.stat_sys_dnd));
|
||||
builder.addRow(dndBuilder);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if DND is enabled suppressing notifications.
|
||||
*/
|
||||
protected boolean isDndSuppressingNotifications() {
|
||||
boolean suppressingNotifications = (mZenModeController.getConfig().suppressedVisualEffects
|
||||
& NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST) != 0;
|
||||
return mZenModeController.getZen() != Settings.Global.ZEN_MODE_OFF
|
||||
&& suppressingNotifications;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCreateSliceProvider() {
|
||||
mAlarmManager = getContext().getSystemService(AlarmManager.class);
|
||||
mContentResolver = getContext().getContentResolver();
|
||||
mNextAlarmController = new NextAlarmControllerImpl(getContext());
|
||||
mNextAlarmController.addCallback(this);
|
||||
mZenModeController = new ZenModeControllerImpl(getContext(), mHandler);
|
||||
mZenModeController.addCallback(this);
|
||||
mDatePattern = getContext().getString(R.string.system_ui_aod_date_pattern);
|
||||
registerClockUpdate(false /* everyMinute */);
|
||||
updateClock();
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onZenChanged(int zen) {
|
||||
mContentResolver.notifyChange(mSliceUri, null /* observer */);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConfigChanged(ZenModeConfig config) {
|
||||
mContentResolver.notifyChange(mSliceUri, null /* observer */);
|
||||
}
|
||||
|
||||
private void updateNextAlarm() {
|
||||
if (withinNHours(mNextAlarmInfo, ALARM_VISIBILITY_HOURS)) {
|
||||
String pattern = android.text.format.DateFormat.is24HourFormat(getContext(),
|
||||
|
||||
@@ -122,7 +122,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode
|
||||
|
||||
@Override
|
||||
public int getZen() {
|
||||
return mModeSetting.getValue();
|
||||
return mZenMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,21 +19,25 @@ package com.android.systemui.keyguard;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import androidx.slice.Slice;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.AlarmManager;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Handler;
|
||||
import android.provider.Settings;
|
||||
import android.support.test.filters.SmallTest;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper;
|
||||
import android.testing.TestableLooper.RunWithLooper;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.systemui.SysuiTestCase;
|
||||
import com.android.systemui.statusbar.policy.ZenModeController;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Before;
|
||||
@@ -43,12 +47,14 @@ import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.HashSet;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import androidx.slice.Slice;
|
||||
import androidx.slice.SliceItem;
|
||||
import androidx.slice.SliceProvider;
|
||||
import androidx.slice.SliceSpecs;
|
||||
import androidx.slice.builders.ListBuilder;
|
||||
import androidx.slice.core.SliceQuery;
|
||||
|
||||
@SmallTest
|
||||
@@ -61,10 +67,12 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
|
||||
@Mock
|
||||
private AlarmManager mAlarmManager;
|
||||
private TestableKeyguardSliceProvider mProvider;
|
||||
private boolean mIsZenMode;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mIsZenMode = false;
|
||||
mProvider = new TestableKeyguardSliceProvider();
|
||||
mProvider.attachInfo(getContext(), null);
|
||||
SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST)));
|
||||
@@ -128,14 +136,27 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
|
||||
verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onZenChanged_updatesSlice() {
|
||||
mProvider.onZenChanged(Settings.Global.ZEN_MODE_ALARMS);
|
||||
verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addZenMode_addedToSlice() {
|
||||
ListBuilder listBuilder = spy(new ListBuilder(getContext(), mProvider.getUri()));
|
||||
mProvider.addZenMode(listBuilder);
|
||||
verify(listBuilder, never()).addRow(any(ListBuilder.RowBuilder.class));
|
||||
|
||||
mIsZenMode = true;
|
||||
mProvider.addZenMode(listBuilder);
|
||||
verify(listBuilder).addRow(any(ListBuilder.RowBuilder.class));
|
||||
}
|
||||
|
||||
private class TestableKeyguardSliceProvider extends KeyguardSliceProvider {
|
||||
int mCleanDateFormatInvokations;
|
||||
private int mCounter;
|
||||
|
||||
TestableKeyguardSliceProvider() {
|
||||
super(new Handler(TestableLooper.get(KeyguardSliceProviderTest.this).getLooper()));
|
||||
}
|
||||
|
||||
Uri getUri() {
|
||||
return mSliceUri;
|
||||
}
|
||||
@@ -148,6 +169,11 @@ public class KeyguardSliceProviderTest extends SysuiTestCase {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isDndSuppressingNotifications() {
|
||||
return mIsZenMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
void cleanDateFormat() {
|
||||
super.cleanDateFormat();
|
||||
|
||||
Reference in New Issue
Block a user