Merge "[Ongoing Call Chip] Add feature flag + controller" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4be0810f5b
@@ -9150,9 +9150,12 @@ public class Notification implements Parcelable
|
||||
* </pre>
|
||||
*/
|
||||
public static class CallStyle extends Style {
|
||||
private static final int CALL_TYPE_INCOMING = 1;
|
||||
private static final int CALL_TYPE_ONGOING = 2;
|
||||
private static final int CALL_TYPE_SCREENING = 3;
|
||||
/** @hide */
|
||||
public static final int CALL_TYPE_INCOMING = 1;
|
||||
/** @hide */
|
||||
public static final int CALL_TYPE_ONGOING = 2;
|
||||
/** @hide */
|
||||
public static final int CALL_TYPE_SCREENING = 3;
|
||||
|
||||
/**
|
||||
* This is a key used privately on the action.extras to give spacing priority
|
||||
|
||||
@@ -50,4 +50,6 @@
|
||||
<bool name="flag_alarm_tile">false</bool>
|
||||
|
||||
<bool name="flag_charging_ripple">false</bool>
|
||||
|
||||
<bool name="flag_ongoing_call_status_bar_chip">false</bool>
|
||||
</resources>
|
||||
|
||||
@@ -23,6 +23,7 @@ import android.view.View;
|
||||
import com.android.systemui.Dumpable;
|
||||
import com.android.systemui.dagger.SysUISingleton;
|
||||
import com.android.systemui.qs.QSFragment;
|
||||
import com.android.systemui.statusbar.phone.CollapsedStatusBarFragment;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
|
||||
import java.io.FileDescriptor;
|
||||
@@ -128,6 +129,9 @@ public class FragmentService implements Dumpable {
|
||||
* Inject a QSFragment.
|
||||
*/
|
||||
QSFragment createQSFragment();
|
||||
|
||||
/** Inject a CollapsedStatusBarFragment. */
|
||||
CollapsedStatusBarFragment createCollapsedStatusBarFragment();
|
||||
}
|
||||
|
||||
private class FragmentHostState {
|
||||
|
||||
@@ -98,4 +98,8 @@ public class FeatureFlags {
|
||||
public boolean isChargingRippleEnabled() {
|
||||
return mFlagReader.isEnabled(R.bool.flag_charging_ripple);
|
||||
}
|
||||
|
||||
public boolean isOngoingCallStatusBarChipEnabled() {
|
||||
return mFlagReader.isEnabled(R.bool.flag_ongoing_call_status_bar_chip);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ import com.android.systemui.statusbar.notification.collection.NotifPipeline;
|
||||
import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
|
||||
import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
|
||||
import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
|
||||
import com.android.systemui.statusbar.phone.KeyguardBypassController;
|
||||
import com.android.systemui.statusbar.phone.ManagedProfileController;
|
||||
@@ -57,6 +58,7 @@ import com.android.systemui.statusbar.phone.StatusBar;
|
||||
import com.android.systemui.statusbar.phone.StatusBarIconController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
|
||||
import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
|
||||
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
|
||||
import com.android.systemui.statusbar.policy.RemoteInputUriController;
|
||||
import com.android.systemui.tracing.ProtoTracer;
|
||||
import com.android.systemui.util.DeviceConfigProxy;
|
||||
@@ -226,4 +228,16 @@ public interface StatusBarDependenciesModule {
|
||||
@Binds
|
||||
StatusBarIconController provideStatusBarIconController(
|
||||
StatusBarIconControllerImpl controllerImpl);
|
||||
|
||||
/**
|
||||
*/
|
||||
@Provides
|
||||
@SysUISingleton
|
||||
static OngoingCallController provideOngoingCallController(
|
||||
CommonNotifCollection notifCollection, FeatureFlags featureFlags) {
|
||||
OngoingCallController ongoingCallController =
|
||||
new OngoingCallController(notifCollection, featureFlags);
|
||||
ongoingCallController.init();
|
||||
return ongoingCallController;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ public interface NotifCollectionListener {
|
||||
* Called whenever a notification with the same key as an existing notification is posted. By
|
||||
* the time this listener is called, the entry's SBN and Ranking will already have been updated.
|
||||
*/
|
||||
default void onEntryUpdated(NotificationEntry entry) {
|
||||
default void onEntryUpdated(@NonNull NotificationEntry entry) {
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -37,6 +37,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.CommandQueue;
|
||||
import com.android.systemui.statusbar.StatusBarState;
|
||||
import com.android.systemui.statusbar.phone.StatusBarIconController.DarkIconManager;
|
||||
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
|
||||
import com.android.systemui.statusbar.policy.EncryptionHelper;
|
||||
import com.android.systemui.statusbar.policy.KeyguardStateController;
|
||||
import com.android.systemui.statusbar.policy.NetworkController;
|
||||
@@ -45,6 +46,8 @@ import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
/**
|
||||
* Contains the collapsed status bar and handles hiding/showing based on disable flags
|
||||
* and keyguard state. Also manages lifecycle to make sure the views it contains are being
|
||||
@@ -72,6 +75,7 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
|
||||
private DarkIconManager mDarkIconManager;
|
||||
private View mOperatorNameFrame;
|
||||
private CommandQueue mCommandQueue;
|
||||
private OngoingCallController mOngoingCallController;
|
||||
|
||||
private List<String> mBlockedIcons = new ArrayList<>();
|
||||
|
||||
@@ -82,6 +86,11 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue
|
||||
}
|
||||
};
|
||||
|
||||
@Inject
|
||||
public CollapsedStatusBarFragment(OngoingCallController ongoingCallController) {
|
||||
mOngoingCallController = ongoingCallController;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
@@ -225,6 +225,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
|
||||
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
|
||||
import com.android.systemui.statusbar.phone.dagger.StatusBarPhoneModule;
|
||||
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
@@ -424,6 +425,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
private final DismissCallbackRegistry mDismissCallbackRegistry;
|
||||
private final DemoModeController mDemoModeController;
|
||||
private NotificationsController mNotificationsController;
|
||||
private final OngoingCallController mOngoingCallController;
|
||||
|
||||
// expanded notifications
|
||||
// the sliding/resizing panel within the notification window
|
||||
@@ -788,6 +790,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
NotificationIconAreaController notificationIconAreaController,
|
||||
BrightnessSlider.Factory brightnessSliderFactory,
|
||||
WiredChargingRippleController chargingRippleAnimationController,
|
||||
OngoingCallController ongoingCallController,
|
||||
FeatureFlags featureFlags) {
|
||||
super(context);
|
||||
mNotificationsController = notificationsController;
|
||||
@@ -867,6 +870,7 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
mNotificationIconAreaController = notificationIconAreaController;
|
||||
mBrightnessSliderFactory = brightnessSliderFactory;
|
||||
mChargingRippleAnimationController = chargingRippleAnimationController;
|
||||
mOngoingCallController = ongoingCallController;
|
||||
mFeatureFlags = featureFlags;
|
||||
|
||||
mExpansionChangedListeners = new ArrayList<>();
|
||||
@@ -1153,7 +1157,8 @@ public class StatusBar extends SystemUI implements DemoMode,
|
||||
checkBarModes();
|
||||
}).getFragmentManager()
|
||||
.beginTransaction()
|
||||
.replace(R.id.status_bar_container, new CollapsedStatusBarFragment(),
|
||||
.replace(R.id.status_bar_container,
|
||||
new CollapsedStatusBarFragment(mOngoingCallController),
|
||||
CollapsedStatusBarFragment.TAG)
|
||||
.commit();
|
||||
|
||||
|
||||
@@ -90,6 +90,7 @@ import com.android.systemui.statusbar.phone.StatusBarIconController;
|
||||
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
|
||||
import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
|
||||
import com.android.systemui.statusbar.phone.StatusBarTouchableRegionManager;
|
||||
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||
@@ -206,6 +207,7 @@ public interface StatusBarPhoneModule {
|
||||
NotificationIconAreaController notificationIconAreaController,
|
||||
BrightnessSlider.Factory brightnessSliderFactory,
|
||||
WiredChargingRippleController chargingRippleAnimationController,
|
||||
OngoingCallController ongoingCallController,
|
||||
FeatureFlags featureFlags) {
|
||||
return new StatusBar(
|
||||
context,
|
||||
@@ -288,6 +290,7 @@ public interface StatusBarPhoneModule {
|
||||
notificationIconAreaController,
|
||||
brightnessSliderFactory,
|
||||
chargingRippleAnimationController,
|
||||
ongoingCallController,
|
||||
featureFlags);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* Copyright (C) 2021 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.systemui.statusbar.phone.ongoingcall
|
||||
|
||||
import android.app.Notification
|
||||
import android.app.Notification.CallStyle.CALL_TYPE_ONGOING
|
||||
import android.util.Log
|
||||
import com.android.systemui.dagger.SysUISingleton
|
||||
import com.android.systemui.statusbar.FeatureFlags
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* A controller to handle the ongoing call chip in the collapsed status bar.
|
||||
*/
|
||||
@SysUISingleton
|
||||
class OngoingCallController @Inject constructor(
|
||||
private val notifCollection: CommonNotifCollection,
|
||||
private val featureFlags: FeatureFlags
|
||||
) {
|
||||
|
||||
private val notifListener = object : NotifCollectionListener {
|
||||
override fun onEntryUpdated(entry: NotificationEntry) {
|
||||
if (isOngoingCallNotification(entry) && DEBUG) {
|
||||
Log.d(TAG, "Ongoing call notification updated")
|
||||
}
|
||||
}
|
||||
|
||||
override fun onEntryRemoved(entry: NotificationEntry, reason: Int) {
|
||||
if (isOngoingCallNotification(entry) && DEBUG) {
|
||||
Log.d(TAG, "Ongoing call notification removed")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun init() {
|
||||
if (featureFlags.isOngoingCallStatusBarChipEnabled) {
|
||||
notifCollection.addCollectionListener(notifListener)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun isOngoingCallNotification(entry: NotificationEntry): Boolean {
|
||||
val extras = entry.sbn.notification.extras
|
||||
val callStyleTemplateName = Notification.CallStyle::class.java.name
|
||||
return extras.getString(Notification.EXTRA_TEMPLATE) == callStyleTemplateName &&
|
||||
extras.getInt(Notification.EXTRA_CALL_TYPE, -1) == CALL_TYPE_ONGOING
|
||||
}
|
||||
|
||||
private const val TAG = "OngoingCallController"
|
||||
private val DEBUG = Log.isLoggable(TAG, Log.DEBUG)
|
||||
@@ -23,7 +23,10 @@ import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.app.StatusBarManager;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper.RunWithLooper;
|
||||
import android.view.View;
|
||||
@@ -34,6 +37,7 @@ import androidx.test.filters.SmallTest;
|
||||
import com.android.systemui.R;
|
||||
import com.android.systemui.SysuiBaseFragmentTest;
|
||||
import com.android.systemui.plugins.statusbar.StatusBarStateController;
|
||||
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -157,4 +161,9 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
|
||||
Mockito.verify(mStatusBarStateController).isDozing();
|
||||
Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Fragment instantiate(Context context, String className, Bundle arguments) {
|
||||
return new CollapsedStatusBarFragment(mock(OngoingCallController.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,6 +132,7 @@ import com.android.systemui.statusbar.notification.stack.NotificationListContain
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
|
||||
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
|
||||
import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
|
||||
import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
|
||||
import com.android.systemui.statusbar.policy.BatteryController;
|
||||
import com.android.systemui.statusbar.policy.ConfigurationController;
|
||||
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
|
||||
@@ -263,6 +264,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
@Mock private Lazy<NotificationShadeDepthController> mNotificationShadeDepthControllerLazy;
|
||||
@Mock private BrightnessSlider.Factory mBrightnessSliderFactory;
|
||||
@Mock private WiredChargingRippleController mWiredChargingRippleController;
|
||||
@Mock private OngoingCallController mOngoingCallController;
|
||||
@Mock private FeatureFlags mFeatureFlags;
|
||||
private ShadeController mShadeController;
|
||||
private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
|
||||
@@ -427,6 +429,7 @@ public class StatusBarTest extends SysuiTestCase {
|
||||
mNotificationIconAreaController,
|
||||
mBrightnessSliderFactory,
|
||||
mWiredChargingRippleController,
|
||||
mOngoingCallController,
|
||||
mFeatureFlags);
|
||||
|
||||
when(mNotificationShadeWindowView.findViewById(R.id.lock_icon_container)).thenReturn(
|
||||
|
||||
Reference in New Issue
Block a user