Loading packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +18 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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)); } Loading @@ -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() { Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +48 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading @@ -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; Loading @@ -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. Loading Loading @@ -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 Loading @@ -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(); } Loading @@ -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(), Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -122,7 +122,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode @Override public int getZen() { return mModeSetting.getValue(); return mZenMode; } @Override Loading packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +34 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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))); Loading Loading @@ -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; } Loading @@ -148,6 +169,11 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { return true; } @Override protected boolean isDndSuppressingNotifications() { return mIsZenMode; } @Override void cleanDateFormat() { super.cleanDateFormat(); Loading Loading
packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +18 −7 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading @@ -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)); } Loading @@ -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() { Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +48 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -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. Loading @@ -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; Loading @@ -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. Loading Loading @@ -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 Loading @@ -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(); } Loading @@ -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(), Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -122,7 +122,7 @@ public class ZenModeControllerImpl extends CurrentUserTracker implements ZenMode @Override public int getZen() { return mModeSetting.getValue(); return mZenMode; } @Override Loading
packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +34 −8 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading @@ -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))); Loading Loading @@ -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; } Loading @@ -148,6 +169,11 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { return true; } @Override protected boolean isDndSuppressingNotifications() { return mIsZenMode; } @Override void cleanDateFormat() { super.cleanDateFormat(); Loading