diff options
9 files changed, 249 insertions, 12 deletions
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index 8b9072266d16..8b70bd61785a 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -176,5 +176,11 @@ public final class SystemUiDeviceConfigFlags { public static final String ASSIST_HANDLES_SUPPRESS_ON_APPS = "assist_handles_suppress_on_apps"; + /** + * (bool) Whether to use the new BrightLineFalsingManager. + */ + public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED = + "brightline_falsing_manager_enabled"; + private SystemUiDeviceConfigFlags() { } } diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java index 28454b007d41..15218896f089 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java @@ -16,31 +16,51 @@ package com.android.systemui.classifier; +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_MANAGER_ENABLED; +import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; + import android.content.Context; import android.net.Uri; +import android.os.Handler; +import android.provider.DeviceConfig; import android.view.MotionEvent; +import com.android.internal.annotations.VisibleForTesting; +import com.android.systemui.Dependency; +import com.android.systemui.classifier.brightline.BrightLineFalsingManager; +import com.android.systemui.classifier.brightline.FalsingDataProvider; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.FalsingPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.util.AsyncSensorManager; import java.io.PrintWriter; import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; /** * Simple passthrough implementation of {@link FalsingManager} allowing plugins to swap in. * * {@link FalsingManagerImpl} is used when a Plugin is not loaded. */ +@Singleton public class FalsingManagerProxy implements FalsingManager { private FalsingManager mInternalFalsingManager; + private final Handler mMainHandler; @Inject - FalsingManagerProxy(Context context, PluginManager pluginManager) { - mInternalFalsingManager = new FalsingManagerImpl(context); + FalsingManagerProxy(Context context, PluginManager pluginManager, + @Named(MAIN_HANDLER_NAME) Handler handler) { + mMainHandler = handler; + DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI, + command -> mMainHandler.post(command), + properties -> onDeviceConfigPropertiesChanged(context, properties.getNamespace()) + ); + setupFalsingManager(context); final PluginListener<FalsingPlugin> mPluginListener = new PluginListener<FalsingPlugin>() { public void onPluginConnected(FalsingPlugin plugin, Context context) { FalsingManager pluginFalsingManager = plugin.getFalsingManager(context); @@ -57,6 +77,40 @@ public class FalsingManagerProxy implements FalsingManager { pluginManager.addPluginListener(mPluginListener, FalsingPlugin.class); } + private void onDeviceConfigPropertiesChanged(Context context, String namespace) { + if (!DeviceConfig.NAMESPACE_SYSTEMUI.equals(namespace)) { + return; + } + + setupFalsingManager(context); + } + + /** + * Chooses the FalsingManager implementation. + */ + @VisibleForTesting + public void setupFalsingManager(Context context) { + boolean brightlineEnabled = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + if (!brightlineEnabled) { + mInternalFalsingManager = new FalsingManagerImpl(context); + } else { + mInternalFalsingManager = new BrightLineFalsingManager( + new FalsingDataProvider(context), + Dependency.get(AsyncSensorManager.class) + ); + } + + } + + /** + * Returns the FalsingManager implementation in use. + */ + @VisibleForTesting + FalsingManager getInternalFalsingManager() { + return mInternalFalsingManager; + } + @Override public void onSucccessfulUnlock() { mInternalFalsingManager.onSucccessfulUnlock(); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java index 8c39e9e9016b..19c46e40f604 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java @@ -60,7 +60,8 @@ public class BrightLineFalsingManager implements FalsingManager { } }; - BrightLineFalsingManager(FalsingDataProvider falsingDataProvider, SensorManager sensorManager) { + public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider, + SensorManager sensorManager) { mDataProvider = falsingDataProvider; mSensorManager = sensorManager; mClassifiers = new ArrayList<>(); diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java index 884c011a2d3f..4975e63f7a0a 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/FalsingDataProvider.java @@ -30,7 +30,7 @@ import java.util.List; /** * Acts as a cache and utility class for FalsingClassifiers. */ -class FalsingDataProvider { +public class FalsingDataProvider { private static final long MOTION_EVENT_AGE_MS = 1000; private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI); @@ -51,7 +51,7 @@ class FalsingDataProvider { private MotionEvent mFirstRecentMotionEvent; private MotionEvent mLastMotionEvent; - FalsingDataProvider(Context context) { + public FalsingDataProvider(Context context) { DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); mXdpi = displayMetrics.xdpi; mYdpi = displayMetrics.ydpi; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index d9d74b9d17a6..a2438552e8af 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -84,6 +84,14 @@ public class DozeScrimController implements StateListener { public void onCancelled() { pulseFinished(); } + + /** + * Whether to timeout wallpaper or not. + */ + @Override + public boolean shouldTimeoutWallpaper() { + return mPulseReason == DozeLog.PULSE_REASON_DOCKING; + } }; public DozeScrimController(DozeParameters dozeParameters) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 5dcbea22eea1..3f38c049a977 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -284,15 +284,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo // AOD wallpapers should fade away after a while. // Docking pulses may take a long time, wallpapers should also fade away after a while. - if (mWallpaperSupportsAmbientMode && mDozeParameters.getAlwaysOn() - && mState == ScrimState.AOD) { - if (!mWallpaperVisibilityTimedOut) { - mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), - AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); - } + mWallpaperVisibilityTimedOut = false; + if (shouldFadeAwayWallpaper()) { + mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), + AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); } else { mTimeTicker.cancel(); - mWallpaperVisibilityTimedOut = false; } if (mKeyguardUpdateMonitor.needsSlowUnlockTransition() && mState == ScrimState.UNLOCKED) { @@ -313,6 +310,23 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo dispatchScrimState(mScrimBehind.getViewAlpha()); } + private boolean shouldFadeAwayWallpaper() { + if (!mWallpaperSupportsAmbientMode) { + return false; + } + + if (mState == ScrimState.AOD && mDozeParameters.getAlwaysOn()) { + return true; + } + + if (mState == ScrimState.PULSING + && mCallback != null && mCallback.shouldTimeoutWallpaper()) { + return true; + } + + return false; + } + public ScrimState getState() { return mState; } @@ -387,6 +401,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo setOrAdaptCurrentAnimation(mScrimInFront); dispatchScrimState(mScrimBehind.getViewAlpha()); + + // Reset wallpaper timeout if it's already timeout like expanding panel while PULSING + // and docking. + if (mWallpaperVisibilityTimedOut) { + mWallpaperVisibilityTimedOut = false; + mTimeTicker.schedule(mDozeParameters.getWallpaperAodDuration(), + AlarmTimeout.MODE_IGNORE_IF_SCHEDULED); + } } } @@ -925,6 +947,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo } default void onCancelled() { } + /** Returns whether to timeout wallpaper or not. */ + default boolean shouldTimeoutWallpaper() { + return false; + } } /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java new file mode 100644 index 000000000000..329ef1c19a2b --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2019 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.classifier; + +import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_MANAGER_ENABLED; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.junit.Assert.assertThat; + +import android.os.Handler; +import android.provider.DeviceConfig; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; + +import androidx.test.filters.SmallTest; + +import com.android.systemui.SysuiTestCase; +import com.android.systemui.classifier.brightline.BrightLineFalsingManager; +import com.android.systemui.shared.plugins.PluginManager; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@TestableLooper.RunWithLooper +public class FalsingManagerProxyTest extends SysuiTestCase { + @Mock + PluginManager mPluginManager; + private boolean mDefaultConfigValue; + private Handler mHandler; + private TestableLooper mTestableLooper; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + mTestableLooper = TestableLooper.get(this); + mHandler = new Handler(mTestableLooper.getLooper()); + mDefaultConfigValue = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, false); + } + + @After + public void tearDown() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, mDefaultConfigValue ? "true" : "false", false); + } + + @Test + public void test_brightLineFalsingManagerDisabled() { + FalsingManagerProxy proxy = new FalsingManagerProxy(getContext(), mPluginManager, mHandler); + + assertThat(proxy.getInternalFalsingManager(), instanceOf(FalsingManagerImpl.class)); + } + + @Test + public void test_brightLineFalsingManagerEnabled() { + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, "true", false); + FalsingManagerProxy proxy = new FalsingManagerProxy(getContext(), mPluginManager, mHandler); + + assertThat(proxy.getInternalFalsingManager(), instanceOf(BrightLineFalsingManager.class)); + } + + @Test + public void test_brightLineFalsingManagerToggled() { + FalsingManagerProxy proxy = new FalsingManagerProxy(getContext(), mPluginManager, mHandler); + assertThat(proxy.getInternalFalsingManager(), instanceOf(FalsingManagerImpl.class)); + + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, "true", false); + mTestableLooper.processAllMessages(); + proxy.setupFalsingManager(getContext()); + assertThat(proxy.getInternalFalsingManager(), instanceOf(BrightLineFalsingManager.class)); + + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, + BRIGHTLINE_FALSING_MANAGER_ENABLED, "false", false); + mTestableLooper.processAllMessages(); + proxy.setupFalsingManager(getContext()); + assertThat(proxy.getInternalFalsingManager(), instanceOf(FalsingManagerImpl.class)); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 191c983ad156..d8e90a584058 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -508,6 +508,38 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test + public void transitionToPulsing_withTimeoutWallpaperCallback_willHideWallpaper() { + mScrimController.setWallpaperSupportsAmbientMode(true); + + mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() { + @Override + public boolean shouldTimeoutWallpaper() { + return true; + } + }); + + verify(mAlarmManager).setExact(anyInt(), anyLong(), any(), any(), any()); + } + + @Test + public void transitionToPulsing_withDefaultCallback_wontHideWallpaper() { + mScrimController.setWallpaperSupportsAmbientMode(true); + + mScrimController.transitionTo(ScrimState.PULSING, new ScrimController.Callback() {}); + + verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any()); + } + + @Test + public void transitionToPulsing_withoutCallback_wontHideWallpaper() { + mScrimController.setWallpaperSupportsAmbientMode(true); + + mScrimController.transitionTo(ScrimState.PULSING); + + verify(mAlarmManager, never()).setExact(anyInt(), anyLong(), any(), any(), any()); + } + + @Test public void testConservesExpansionOpacityAfterTransition() { mScrimController.transitionTo(ScrimState.UNLOCKED); mScrimController.setPanelExpansion(0.5f); diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 9806199003d7..19f8203f7502 100755 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -1021,6 +1021,15 @@ public class CarrierConfigManager { "support_manage_ims_conference_call_bool"; /** + * Determines whether the IMS conference merge process supports and returns its participants + * data. When {@code true}, on merge complete, conference call would have a list of its + * participants returned in XML format, {@code false otherwise}. + * @hide + */ + public static final String KEY_SUPPORT_IMS_CONFERENCE_EVENT_PACKAGE_BOOL = + "support_ims_conference_event_package_bool"; + + /** * Determines whether High Definition audio property is displayed in the dialer UI. * If {@code false}, remove the HD audio property from the connection so that HD audio related * UI is not displayed. If {@code true}, keep HD audio property as it is configured. @@ -3148,6 +3157,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_SUPPORT_CONFERENCE_CALL_BOOL, true); sDefaults.putBoolean(KEY_SUPPORT_IMS_CONFERENCE_CALL_BOOL, true); sDefaults.putBoolean(KEY_SUPPORT_MANAGE_IMS_CONFERENCE_CALL_BOOL, true); + sDefaults.putBoolean(KEY_SUPPORT_IMS_CONFERENCE_EVENT_PACKAGE_BOOL, true); sDefaults.putBoolean(KEY_SUPPORT_VIDEO_CONFERENCE_CALL_BOOL, false); sDefaults.putBoolean(KEY_IS_IMS_CONFERENCE_SIZE_ENFORCED_BOOL, false); sDefaults.putInt(KEY_IMS_CONFERENCE_SIZE_LIMIT_INT, 5); |