Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +46 −7 Original line number Diff line number Diff line Loading @@ -50,9 +50,9 @@ import androidx.slice.builders.SliceAction; import com.android.internal.annotations.VisibleForTesting; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarStateController; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; import com.android.systemui.statusbar.policy.ZenModeController; Loading @@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit; */ public class KeyguardSliceProvider extends SliceProvider implements NextAlarmController.NextAlarmChangeCallback, ZenModeController.Callback, NotificationMediaManager.MediaListener { NotificationMediaManager.MediaListener, StatusBarStateController.StateListener { private static final StyleSpan BOLD_STYLE = new StyleSpan(Typeface.BOLD); public static final String KEYGUARD_SLICE_URI = "content://com.android.systemui.keyguard/main"; Loading Loading @@ -109,7 +109,9 @@ public class KeyguardSliceProvider extends SliceProvider implements private AlarmManager.AlarmClockInfo mNextAlarmInfo; private PendingIntent mPendingIntent; protected NotificationMediaManager mMediaManager; private StatusBarStateController mStatusBarStateController; protected MediaMetadata mMediaMetaData; protected boolean mDozing; /** * Receiver responsible for time ticking and updating the date format. Loading Loading @@ -167,9 +169,20 @@ public class KeyguardSliceProvider extends SliceProvider implements mMediaUri = Uri.parse(KEYGUARD_MEDIA_URI); } public void initDependencies() { mMediaManager = Dependency.get(NotificationMediaManager.class); /** * Initialize dependencies that don't exist during {@link android.content.ContentProvider} * instantiation. * * @param mediaManager {@link NotificationMediaManager} singleton. * @param statusBarStateController {@link StatusBarStateController} singleton. */ public void initDependencies( NotificationMediaManager mediaManager, StatusBarStateController statusBarStateController) { mMediaManager = mediaManager; mMediaManager.addCallback(this); mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); } @AnyThread Loading @@ -179,7 +192,7 @@ public class KeyguardSliceProvider extends SliceProvider implements Slice slice; synchronized (this) { ListBuilder builder = new ListBuilder(getContext(), mSliceUri, ListBuilder.INFINITY); if (mMediaMetaData != null) { if (needsMediaLocked()) { addMediaLocked(builder); } else { builder.addRow(new RowBuilder(mDateUri).setTitle(mLastText)); Loading @@ -193,6 +206,10 @@ public class KeyguardSliceProvider extends SliceProvider implements return slice; } protected boolean needsMediaLocked() { return mMediaMetaData != null && mDozing; } protected void addMediaLocked(ListBuilder listBuilder) { if (mMediaMetaData != null) { SpannableStringBuilder builder = new SpannableStringBuilder(); Loading @@ -209,7 +226,7 @@ public class KeyguardSliceProvider extends SliceProvider implements } RowBuilder mediaBuilder = new RowBuilder(mMediaUri).setTitle(builder); Icon notificationIcon = mMediaManager.getMediaIcon(); Icon notificationIcon = mMediaManager == null ? null : mMediaManager.getMediaIcon(); if (notificationIcon != null) { IconCompat icon = IconCompat.createFromIcon(notificationIcon); mediaBuilder.addEndItem(icon, ListBuilder.ICON_IMAGE); Loading Loading @@ -389,13 +406,35 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onMetadataChanged(MediaMetadata metadata) { final boolean notify; synchronized (this) { boolean neededMedia = needsMediaLocked(); mMediaMetaData = metadata; notify = neededMedia != needsMediaLocked(); } if (notify) { notifyChange(); } } protected void notifyChange() { mContentResolver.notifyChange(mSliceUri, null /* observer */); } @Override public void onDozingChanged(boolean isDozing) { final boolean notify; synchronized (this) { boolean neededMedia = needsMediaLocked(); mDozing = isDozing; notify = neededMedia != needsMediaLocked(); } if (notify) { notifyChange(); } } @Override public void onStateChanged(int newState) { } } packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +1 −1 Original line number Diff line number Diff line Loading @@ -632,7 +632,7 @@ public class StatusBar extends SystemUI implements DemoMode, mBubbleController.setExpandListener(mBubbleExpandListener); KeyguardSliceProvider sliceProvider = KeyguardSliceProvider.getAttachedInstance(); if (sliceProvider != null) { sliceProvider.initDependencies(); sliceProvider.initDependencies(mMediaManager, mStatusBarStateController); } else { Log.w(TAG, "Cannot init KeyguardSliceProvider dependencies"); } Loading packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +30 −6 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ 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.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; Loading @@ -44,6 +45,7 @@ import androidx.slice.core.SliceQuery; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarStateController; import org.junit.Assert; import org.junit.Before; Loading @@ -67,6 +69,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { private AlarmManager mAlarmManager; @Mock private NotificationMediaManager mNotificationMediaManager; @Mock private StatusBarStateController mStatusBarStateController; private TestableKeyguardSliceProvider mProvider; private boolean mIsZenMode; Loading @@ -76,7 +80,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mIsZenMode = false; mProvider = new TestableKeyguardSliceProvider(); mProvider.attachInfo(getContext(), null); mProvider.initDependencies(); mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController); SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST))); } Loading @@ -98,6 +102,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onBindSlice_readsMedia() { MediaMetadata metadata = mock(MediaMetadata.class); mProvider.onDozingChanged(true); mProvider.onMetadataChanged(metadata); mProvider.onBindSlice(mProvider.getUri()); verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_TITLE)); Loading Loading @@ -162,7 +167,31 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onMetadataChanged_updatesSlice() { mProvider.onMetadataChanged(mock(MediaMetadata.class)); mProvider.onDozingChanged(true); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); // Hides after waking up reset(mContentResolver); mProvider.onDozingChanged(false); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); // And won't update slice if device is awake reset(mContentResolver); mProvider.onMetadataChanged(mock(MediaMetadata.class)); verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null)); } @Test public void onDozingChanged_updatesSliceIfMedia() { // Show media when dozing mProvider.onMetadataChanged(mock(MediaMetadata.class)); mProvider.onDozingChanged(true); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); // Do not notify again if nothing changed reset(mContentResolver); mProvider.onDozingChanged(true); verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null)); } private class TestableKeyguardSliceProvider extends KeyguardSliceProvider { Loading Loading @@ -201,11 +230,6 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { protected String getFormattedDateLocked() { return super.getFormattedDateLocked() + mCounter++; } @Override public void initDependencies() { mMediaManager = mNotificationMediaManager; } } } Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardSliceProvider.java +46 −7 Original line number Diff line number Diff line Loading @@ -50,9 +50,9 @@ import androidx.slice.builders.SliceAction; import com.android.internal.annotations.VisibleForTesting; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarStateController; import com.android.systemui.statusbar.policy.NextAlarmController; import com.android.systemui.statusbar.policy.NextAlarmControllerImpl; import com.android.systemui.statusbar.policy.ZenModeController; Loading @@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit; */ public class KeyguardSliceProvider extends SliceProvider implements NextAlarmController.NextAlarmChangeCallback, ZenModeController.Callback, NotificationMediaManager.MediaListener { NotificationMediaManager.MediaListener, StatusBarStateController.StateListener { private static final StyleSpan BOLD_STYLE = new StyleSpan(Typeface.BOLD); public static final String KEYGUARD_SLICE_URI = "content://com.android.systemui.keyguard/main"; Loading Loading @@ -109,7 +109,9 @@ public class KeyguardSliceProvider extends SliceProvider implements private AlarmManager.AlarmClockInfo mNextAlarmInfo; private PendingIntent mPendingIntent; protected NotificationMediaManager mMediaManager; private StatusBarStateController mStatusBarStateController; protected MediaMetadata mMediaMetaData; protected boolean mDozing; /** * Receiver responsible for time ticking and updating the date format. Loading Loading @@ -167,9 +169,20 @@ public class KeyguardSliceProvider extends SliceProvider implements mMediaUri = Uri.parse(KEYGUARD_MEDIA_URI); } public void initDependencies() { mMediaManager = Dependency.get(NotificationMediaManager.class); /** * Initialize dependencies that don't exist during {@link android.content.ContentProvider} * instantiation. * * @param mediaManager {@link NotificationMediaManager} singleton. * @param statusBarStateController {@link StatusBarStateController} singleton. */ public void initDependencies( NotificationMediaManager mediaManager, StatusBarStateController statusBarStateController) { mMediaManager = mediaManager; mMediaManager.addCallback(this); mStatusBarStateController = statusBarStateController; mStatusBarStateController.addCallback(this); } @AnyThread Loading @@ -179,7 +192,7 @@ public class KeyguardSliceProvider extends SliceProvider implements Slice slice; synchronized (this) { ListBuilder builder = new ListBuilder(getContext(), mSliceUri, ListBuilder.INFINITY); if (mMediaMetaData != null) { if (needsMediaLocked()) { addMediaLocked(builder); } else { builder.addRow(new RowBuilder(mDateUri).setTitle(mLastText)); Loading @@ -193,6 +206,10 @@ public class KeyguardSliceProvider extends SliceProvider implements return slice; } protected boolean needsMediaLocked() { return mMediaMetaData != null && mDozing; } protected void addMediaLocked(ListBuilder listBuilder) { if (mMediaMetaData != null) { SpannableStringBuilder builder = new SpannableStringBuilder(); Loading @@ -209,7 +226,7 @@ public class KeyguardSliceProvider extends SliceProvider implements } RowBuilder mediaBuilder = new RowBuilder(mMediaUri).setTitle(builder); Icon notificationIcon = mMediaManager.getMediaIcon(); Icon notificationIcon = mMediaManager == null ? null : mMediaManager.getMediaIcon(); if (notificationIcon != null) { IconCompat icon = IconCompat.createFromIcon(notificationIcon); mediaBuilder.addEndItem(icon, ListBuilder.ICON_IMAGE); Loading Loading @@ -389,13 +406,35 @@ public class KeyguardSliceProvider extends SliceProvider implements @Override public void onMetadataChanged(MediaMetadata metadata) { final boolean notify; synchronized (this) { boolean neededMedia = needsMediaLocked(); mMediaMetaData = metadata; notify = neededMedia != needsMediaLocked(); } if (notify) { notifyChange(); } } protected void notifyChange() { mContentResolver.notifyChange(mSliceUri, null /* observer */); } @Override public void onDozingChanged(boolean isDozing) { final boolean notify; synchronized (this) { boolean neededMedia = needsMediaLocked(); mDozing = isDozing; notify = neededMedia != needsMediaLocked(); } if (notify) { notifyChange(); } } @Override public void onStateChanged(int newState) { } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +1 −1 Original line number Diff line number Diff line Loading @@ -632,7 +632,7 @@ public class StatusBar extends SystemUI implements DemoMode, mBubbleController.setExpandListener(mBubbleExpandListener); KeyguardSliceProvider sliceProvider = KeyguardSliceProvider.getAttachedInstance(); if (sliceProvider != null) { sliceProvider.initDependencies(); sliceProvider.initDependencies(mMediaManager, mStatusBarStateController); } else { Log.w(TAG, "Cannot init KeyguardSliceProvider dependencies"); } Loading
packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardSliceProviderTest.java +30 −6 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ 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.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; Loading @@ -44,6 +45,7 @@ import androidx.slice.core.SliceQuery; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.StatusBarStateController; import org.junit.Assert; import org.junit.Before; Loading @@ -67,6 +69,8 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { private AlarmManager mAlarmManager; @Mock private NotificationMediaManager mNotificationMediaManager; @Mock private StatusBarStateController mStatusBarStateController; private TestableKeyguardSliceProvider mProvider; private boolean mIsZenMode; Loading @@ -76,7 +80,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { mIsZenMode = false; mProvider = new TestableKeyguardSliceProvider(); mProvider.attachInfo(getContext(), null); mProvider.initDependencies(); mProvider.initDependencies(mNotificationMediaManager, mStatusBarStateController); SliceProvider.setSpecs(new HashSet<>(Arrays.asList(SliceSpecs.LIST))); } Loading @@ -98,6 +102,7 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onBindSlice_readsMedia() { MediaMetadata metadata = mock(MediaMetadata.class); mProvider.onDozingChanged(true); mProvider.onMetadataChanged(metadata); mProvider.onBindSlice(mProvider.getUri()); verify(metadata).getText(eq(MediaMetadata.METADATA_KEY_TITLE)); Loading Loading @@ -162,7 +167,31 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { @Test public void onMetadataChanged_updatesSlice() { mProvider.onMetadataChanged(mock(MediaMetadata.class)); mProvider.onDozingChanged(true); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); // Hides after waking up reset(mContentResolver); mProvider.onDozingChanged(false); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); // And won't update slice if device is awake reset(mContentResolver); mProvider.onMetadataChanged(mock(MediaMetadata.class)); verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null)); } @Test public void onDozingChanged_updatesSliceIfMedia() { // Show media when dozing mProvider.onMetadataChanged(mock(MediaMetadata.class)); mProvider.onDozingChanged(true); verify(mContentResolver).notifyChange(eq(mProvider.getUri()), eq(null)); // Do not notify again if nothing changed reset(mContentResolver); mProvider.onDozingChanged(true); verify(mContentResolver, never()).notifyChange(eq(mProvider.getUri()), eq(null)); } private class TestableKeyguardSliceProvider extends KeyguardSliceProvider { Loading Loading @@ -201,11 +230,6 @@ public class KeyguardSliceProviderTest extends SysuiTestCase { protected String getFormattedDateLocked() { return super.getFormattedDateLocked() + mCounter++; } @Override public void initDependencies() { mMediaManager = mNotificationMediaManager; } } }