diff --git a/res/layout/choose_sim_activity.xml b/res/layout/choose_sim_activity.xml index 693c6e1914d..6e5393a4a74 100644 --- a/res/layout/choose_sim_activity.xml +++ b/res/layout/choose_sim_activity.xml @@ -20,30 +20,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:entries="@xml/items_multiple_carrier" - android:icon="@drawable/ic_network_signal_blue"> - - - - - - - - - - - + android:icon="@drawable/ic_network_signal_blue" /> diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 34506658c45..7d6745cb755 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1529,8 +1529,6 @@ - - "com.google.android.googlequicksearchbox" - - Face Detection uses the front-facing camera to improve Auto-rotate accuracy. Images are never stored or sent to Google.<br><br> - <a href="http://support.google.com/mobile?p=telephony_rtt">Learn more about Auto-rotate screen</a> - + Face Detection uses the front-facing camera to improve Auto-rotate accuracy. Images are never stored or sent to Google. Sample text @@ -13099,8 +13096,8 @@ Location - - Your service provider may collect your location in order to provide this service.\n\nPlease review your service provider\u2019s privacy policy. + + Your carrier may collect your location when you use this service for emergency calls.\n\nVisit your carrier\u2019s privacy policy for details. You may lose access to any remaining time or data. Check with your provider before removing. diff --git a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java index a203534dded..c5bcbed00cb 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java +++ b/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiver.java @@ -75,6 +75,9 @@ public class UsbConnectionBroadcastReceiver extends BroadcastReceiver implements if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_ACCESSORY)) { functions |= UsbManager.FUNCTION_ACCESSORY; } + if (intent.getExtras().getBoolean(UsbManager.USB_FUNCTION_NCM)) { + functions |= UsbManager.FUNCTION_NCM; + } mFunctions = functions; mDataRole = mUsbBackend.getDataRole(); mPowerRole = mUsbBackend.getPowerRole(); diff --git a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java index 502c7d25b9c..97906703069 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDefaultFragment.java @@ -74,8 +74,10 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { Log.d(TAG, "UsbConnectionListener() connected : " + connected + ", functions : " + functions + ", defaultFunctions : " + defaultFunctions + ", mIsStartTethering : " + mIsStartTethering); - if (connected && !mIsConnected && defaultFunctions == UsbManager.FUNCTION_RNDIS + if (connected && !mIsConnected && (defaultFunctions == UsbManager.FUNCTION_RNDIS + || defaultFunctions == UsbManager.FUNCTION_NCM) && !mIsStartTethering) { + mCurrentFunctions = defaultFunctions; startTethering(); } @@ -150,7 +152,11 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { @Override protected String getDefaultKey() { - return UsbBackend.usbFunctionsToString(mUsbBackend.getDefaultUsbFunctions()); + long defaultUsbFunctions = mUsbBackend.getDefaultUsbFunctions(); + // Because we didn't have an option for NCM, so make FUNCTION_NCM corresponding to + // FUNCTION_RNDIS for initializing the UI. + return UsbBackend.usbFunctionsToString(defaultUsbFunctions == UsbManager.FUNCTION_NCM + ? UsbManager.FUNCTION_RNDIS : defaultUsbFunctions); } @Override @@ -158,9 +164,10 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { long functions = UsbBackend.usbFunctionsFromString(key); mPreviousFunctions = mUsbBackend.getCurrentFunctions(); if (!Utils.isMonkeyRunning()) { - if (functions == UsbManager.FUNCTION_RNDIS) { + if (functions == UsbManager.FUNCTION_RNDIS || functions == UsbManager.FUNCTION_NCM) { // We need to have entitlement check for usb tethering, so use API in // TetheringManager. + mCurrentFunctions = functions; startTethering(); } else { mIsStartTethering = false; @@ -193,8 +200,7 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { public void onTetheringStarted() { Log.d(TAG, "onTetheringStarted()"); // Set default usb functions again to make internal data persistent - mCurrentFunctions = UsbManager.FUNCTION_RNDIS; - mUsbBackend.setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS); + mUsbBackend.setDefaultUsbFunctions(mCurrentFunctions); } @Override @@ -214,7 +220,11 @@ public class UsbDefaultFragment extends RadioButtonPickerFragment { final boolean isSupported = mUsbBackend.areFunctionsSupported(option); pref.setEnabled(isSupported); if (isSupported) { - pref.setChecked(functions == option); + if (functions == UsbManager.FUNCTION_NCM) { + pref.setChecked(UsbManager.FUNCTION_RNDIS == option); + } else { + pref.setChecked(functions == option); + } } } } diff --git a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java index 821bb26f18e..006f72a39ef 100644 --- a/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java +++ b/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsController.java @@ -116,6 +116,8 @@ public class UsbDetailsFunctionsController extends UsbDetailsController if (mUsbBackend.areFunctionsSupported(option)) { if (isAccessoryMode(functions)) { pref.setChecked(UsbManager.FUNCTION_MTP == option); + } else if (functions == UsbManager.FUNCTION_NCM) { + pref.setChecked(UsbManager.FUNCTION_RNDIS == option); } else { pref.setChecked(functions == option); } @@ -148,7 +150,7 @@ public class UsbDetailsFunctionsController extends UsbDetailsController preference.setChecked(true); } - if (function == UsbManager.FUNCTION_RNDIS) { + if (function == UsbManager.FUNCTION_RNDIS || function == UsbManager.FUNCTION_NCM) { // We need to have entitlement check for usb tethering, so use API in // TetheringManager. mTetheringManager.startTethering( diff --git a/src/com/android/settings/display/AdaptiveSleepCameraStatePreferenceController.java b/src/com/android/settings/display/AdaptiveSleepCameraStatePreferenceController.java index 20080ce972f..4963e2fc947 100644 --- a/src/com/android/settings/display/AdaptiveSleepCameraStatePreferenceController.java +++ b/src/com/android/settings/display/AdaptiveSleepCameraStatePreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.display; import static android.hardware.SensorPrivacyManager.Sensors.CAMERA; +import static android.hardware.SensorPrivacyManager.Sources.DIALOG; import android.content.Context; import android.hardware.SensorPrivacyManager; @@ -77,7 +78,7 @@ public class AdaptiveSleepCameraStatePreferenceController { mPreference.setSummary(R.string.adaptive_sleep_camera_lock_summary); mPreference.setPositiveButtonText(R.string.allow); mPreference.setPositiveButtonOnClickListener( - p -> mPrivacyManager.setSensorPrivacy(CAMERA, false)); + p -> mPrivacyManager.setSensorPrivacy(DIALOG, CAMERA, false)); } } } diff --git a/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java b/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java index bb9e3d71024..abd14d25d9e 100644 --- a/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java +++ b/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java @@ -19,6 +19,8 @@ package com.android.settings.display; import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; +import android.os.SystemClock; +import android.view.Choreographer; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -58,14 +60,35 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc private View mLarger; private View mSmaller; + private static final long MIN_COMMIT_INTERVAL_MS = 800; + private long mLastCommitTime; + private class onPreviewSeekBarChangeListener implements OnSeekBarChangeListener { + private static final long CHANGE_BY_SEEKBAR_DELAY_MS = 100; + private static final long CHANGE_BY_BUTTON_DELAY_MS = 300; + private boolean mSeekByTouch; + private boolean mIsChanged; + private long mCommitDelayMs; + + private final Choreographer.FrameCallback mCommit = f -> { + commit(); + mLastCommitTime = SystemClock.elapsedRealtime(); + }; @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (mCurrentIndex == progress) { + mIsChanged = false; + return; + } + mIsChanged = true; setPreviewLayer(progress, false); - if (!mSeekByTouch) { - commit(); + if (mSeekByTouch) { + mCommitDelayMs = CHANGE_BY_SEEKBAR_DELAY_MS; + } else { + mCommitDelayMs = CHANGE_BY_BUTTON_DELAY_MS; + commitOnNextFrame(); } } @@ -76,18 +99,39 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc @Override public void onStopTrackingTouch(SeekBar seekBar) { - if (mPreviewPagerAdapter.isAnimating()) { - mPreviewPagerAdapter.setAnimationEndAction(() -> commit()); - } else { - commit(); - } mSeekByTouch = false; + if (!mIsChanged) { + return; + } + if (mPreviewPagerAdapter.isAnimating()) { + mPreviewPagerAdapter.setAnimationEndAction(this::commitOnNextFrame); + } else { + commitOnNextFrame(); + } } + + private void commitOnNextFrame() { + if (SystemClock.elapsedRealtime() - mLastCommitTime < MIN_COMMIT_INTERVAL_MS) { + mCommitDelayMs += MIN_COMMIT_INTERVAL_MS; + } + final Choreographer choreographer = Choreographer.getInstance(); + choreographer.removeFrameCallback(mCommit); + choreographer.postFrameCallbackDelayed(mCommit, mCommitDelayMs); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putLong("mLastCommitTime", mLastCommitTime); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + if (savedInstanceState != null) { + mLastCommitTime = savedInstanceState.getLong("mLastCommitTime"); + } final View root = super.onCreateView(inflater, container, savedInstanceState); final ViewGroup listContainer = root.findViewById(android.R.id.list_container); listContainer.removeAllViews(); @@ -240,4 +284,4 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc setPagerIndicatorContentDescription(position); } }; -} +} \ No newline at end of file diff --git a/src/com/android/settings/display/SmartAutoRotateCameraStateController.java b/src/com/android/settings/display/SmartAutoRotateCameraStateController.java index 39576a9dfee..d761edc9e3e 100644 --- a/src/com/android/settings/display/SmartAutoRotateCameraStateController.java +++ b/src/com/android/settings/display/SmartAutoRotateCameraStateController.java @@ -17,6 +17,7 @@ package com.android.settings.display; import static android.hardware.SensorPrivacyManager.Sensors.CAMERA; +import static android.hardware.SensorPrivacyManager.Sources.DIALOG; import static com.android.settings.display.SmartAutoRotateController.isRotationResolverServiceAvailable; @@ -63,7 +64,7 @@ public class SmartAutoRotateCameraStateController extends BasePreferenceControll ((BannerMessagePreference) mPreference) .setPositiveButtonText(R.string.allow) .setPositiveButtonOnClickListener(v -> { - mPrivacyManager.setSensorPrivacy(CAMERA, false); + mPrivacyManager.setSensorPrivacy(DIALOG, CAMERA, false); }); } diff --git a/src/com/android/settings/fuelgauge/BatteryEntry.java b/src/com/android/settings/fuelgauge/BatteryEntry.java index 0478c8b5630..5c9d07128d0 100644 --- a/src/com/android/settings/fuelgauge/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/BatteryEntry.java @@ -572,7 +572,8 @@ public class BatteryEntry { name = context.getResources().getString(R.string.process_kernel_label); } else if ("mediaserver".equals(name)) { name = context.getResources().getString(R.string.process_mediaserver_label); - } else if ("dex2oat".equals(name)) { + } else if ("dex2oat".equals(name) || "dex2oat32".equals(name) || + "dex2oat64".equals(name)) { name = context.getResources().getString(R.string.process_dex2oat_label); } return new NameAndIcon(name, icon, 0 /* iconId */); diff --git a/src/com/android/settings/network/telephony/NetworkProviderWorker.java b/src/com/android/settings/network/telephony/NetworkProviderWorker.java index a6b438a93e2..c731bfd2edd 100644 --- a/src/com/android/settings/network/telephony/NetworkProviderWorker.java +++ b/src/com/android/settings/network/telephony/NetworkProviderWorker.java @@ -20,7 +20,10 @@ import static com.android.settings.network.InternetUpdater.INTERNET_ETHERNET; import static com.android.settingslib.mobile.MobileMappings.getIconKey; import static com.android.settingslib.mobile.MobileMappings.mapIconSets; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; @@ -60,11 +63,22 @@ public class NetworkProviderWorker extends WifiScanWorker implements private SubscriptionsChangeListener mSubscriptionsListener; private MobileDataEnabledListener mDataEnabledListener; private DataConnectivityListener mConnectivityListener; - private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private final Context mContext; final Handler mHandler; @VisibleForTesting final NetworkProviderTelephonyCallback mTelephonyCallback; + private final BroadcastReceiver mConnectionChangeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (action.equals(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) { + Log.d(TAG, "ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED"); + updateListener(); + } + } + }; + private TelephonyManager mTelephonyManager; private Config mConfig = null; private TelephonyDisplayInfo mTelephonyDisplayInfo = @@ -80,10 +94,10 @@ public class NetworkProviderWorker extends WifiScanWorker implements mMobileDataObserver = new DataContentObserver(mHandler, this); mContext = context; - mDefaultDataSubid = getDefaultDataSubscriptionId(); - + mDefaultDataSubId = getDefaultDataSubscriptionId(); + Log.d(TAG, "Init, SubId: " + mDefaultDataSubId); mTelephonyManager = mContext.getSystemService( - TelephonyManager.class).createForSubscriptionId(mDefaultDataSubid); + TelephonyManager.class).createForSubscriptionId(mDefaultDataSubId); mTelephonyCallback = new NetworkProviderTelephonyCallback(); mSubscriptionsListener = new SubscriptionsChangeListener(context, this); mDataEnabledListener = new MobileDataEnabledListener(context, this); @@ -98,12 +112,15 @@ public class NetworkProviderWorker extends WifiScanWorker implements @Override protected void onSlicePinned() { Log.d(TAG, "onSlicePinned"); - mMobileDataObserver.register(mContext, mDefaultDataSubid); + mMobileDataObserver.register(mContext, mDefaultDataSubId); mSubscriptionsListener.start(); - mDataEnabledListener.start(mDefaultDataSubid); + mDataEnabledListener.start(mDefaultDataSubId); mConnectivityListener.start(); mSignalStrengthListener.resume(); mTelephonyManager.registerTelephonyCallback(mHandler::post, mTelephonyCallback); + IntentFilter filter = new IntentFilter(); + filter.addAction(TelephonyManager.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); + mContext.registerReceiver(mConnectionChangeReceiver, filter); super.onSlicePinned(); } @@ -116,6 +133,9 @@ public class NetworkProviderWorker extends WifiScanWorker implements mConnectivityListener.stop(); mSignalStrengthListener.pause(); mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); + if (mConnectionChangeReceiver != null) { + mContext.unregisterReceiver(mConnectionChangeReceiver); + } super.onSliceUnpinned(); } @@ -137,14 +157,14 @@ public class NetworkProviderWorker extends WifiScanWorker implements notifySliceChange(); } - @Override - public void onSubscriptionsChanged() { + private void updateListener() { int defaultDataSubId = getDefaultDataSubscriptionId(); - if (mDefaultDataSubid == defaultDataSubId) { - Log.d(TAG, "onSubscriptionsChanged: no change"); + if (mDefaultDataSubId == defaultDataSubId) { + Log.d(TAG, "DDS: no change"); return; } - Log.d(TAG, "onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId); + mDefaultDataSubId = defaultDataSubId; + Log.d(TAG, "DDS: defaultDataSubId:" + mDefaultDataSubId); if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) { mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mMobileDataObserver.unregister(mContext); @@ -160,6 +180,12 @@ public class NetworkProviderWorker extends WifiScanWorker implements updateSlice(); } + @Override + public void onSubscriptionsChanged() { + Log.d(TAG, "onSubscriptionsChanged"); + updateListener(); + } + @Override public void onSignalStrengthChanged() { Log.d(TAG, "onSignalStrengthChanged"); @@ -283,7 +309,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements */ public String getNetworkTypeDescription() { return updateNetworkTypeName(mContext, mConfig, mTelephonyDisplayInfo, - mDefaultDataSubid); + mDefaultDataSubId); } /** diff --git a/src/com/android/settings/privacy/SensorToggleController.java b/src/com/android/settings/privacy/SensorToggleController.java index 9e8aca2de2d..60f19d17128 100644 --- a/src/com/android/settings/privacy/SensorToggleController.java +++ b/src/com/android/settings/privacy/SensorToggleController.java @@ -16,6 +16,8 @@ package com.android.settings.privacy; +import static android.hardware.SensorPrivacyManager.Sources.SETTINGS; + import android.content.Context; import androidx.preference.PreferenceScreen; @@ -51,7 +53,7 @@ public abstract class SensorToggleController extends TogglePreferenceController @Override public boolean setChecked(boolean isChecked) { - mSensorPrivacyManagerHelper.setSensorBlocked(getSensor(), !isChecked); + mSensorPrivacyManagerHelper.setSensorBlocked(SETTINGS, getSensor(), !isChecked); return true; } diff --git a/src/com/android/settings/utils/SensorPrivacyManagerHelper.java b/src/com/android/settings/utils/SensorPrivacyManagerHelper.java index 13a987d73d4..8872f699478 100644 --- a/src/com/android/settings/utils/SensorPrivacyManagerHelper.java +++ b/src/com/android/settings/utils/SensorPrivacyManagerHelper.java @@ -153,21 +153,23 @@ public class SensorPrivacyManagerHelper { /** * Sets the sensor privacy for the current user. + * @param source The source with which sensor privacy is toggled. * @param sensor The sensor to set for * @param blocked The state to set to */ - public void setSensorBlocked(int sensor, boolean blocked) { - mSensorPrivacyManager.setSensorPrivacy(sensor, blocked); + public void setSensorBlocked(int source, int sensor, boolean blocked) { + mSensorPrivacyManager.setSensorPrivacy(source, sensor, blocked); } /** * Sets the sensor privacy for the given user. + * @param source The source with which sensor privacy is toggled. * @param sensor The sensor to set for * @param blocked The state to set to * @param userId The user to set for */ - public void setSensorBlocked(int sensor, boolean blocked, int userId) { - mSensorPrivacyManager.setSensorPrivacy(sensor, blocked, userId); + public void setSensorBlocked(int source, int sensor, boolean blocked, int userId) { + mSensorPrivacyManager.setSensorPrivacy(source, sensor, blocked, userId); } /** diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java index b6bbe8ad6fc..21ec48e0f06 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbConnectionBroadcastReceiverTest.java @@ -98,6 +98,20 @@ public class UsbConnectionBroadcastReceiverTest { POWER_ROLE_NONE, DATA_ROLE_NONE); } + @Test + public void onReceive_usbConnectedNcmEnabled_invokesCallback() { + Intent intent = new Intent(); + intent.setAction(UsbManager.ACTION_USB_STATE); + intent.putExtra(UsbManager.USB_CONNECTED, true); + intent.putExtra(UsbManager.USB_FUNCTION_NCM, true); + intent.putExtra(UsbManager.USB_DATA_UNLOCKED, true); + + mReceiver.onReceive(mContext, intent); + + verify(mListener).onUsbConnectionChanged(/* connected */ true, UsbManager.FUNCTION_NCM, + POWER_ROLE_NONE, DATA_ROLE_NONE); + } + @Test public void onReceive_usbPortStatus_invokeCallback() { final Intent intent = new Intent(); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java index f3e1bcedc7b..eee63980753 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDefaultFragmentTest.java @@ -103,6 +103,14 @@ public class UsbDefaultFragmentTest { .isEqualTo(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_MIDI)); } + @Test + public void getDefaultKey_isNcm_returnsRndis() { + when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_NCM); + + assertThat(mFragment.getDefaultKey()) + .isEqualTo(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_RNDIS)); + } + @Test public void setDefaultKey_isNone_shouldSetNone() { mFragment.setDefaultKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_NONE)); @@ -149,6 +157,19 @@ public class UsbDefaultFragmentTest { UsbManager.FUNCTION_MTP); } + @Test + public void setDefaultKey_functionNcm_invokesStartTethering() { + doReturn(UsbManager.FUNCTION_MTP).when(mUsbBackend).getCurrentFunctions(); + + mFragment.setDefaultKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_NCM)); + + verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB), + any(), + eq(mFragment.mOnStartTetheringCallback)); + assertThat(mFragment.mPreviousFunctions).isEqualTo( + UsbManager.FUNCTION_MTP); + } + @Test public void setDefaultKey_functionOther_setCurrentFunctionInvoked() { doReturn(UsbManager.FUNCTION_MTP).when(mUsbBackend).getCurrentFunctions(); @@ -161,14 +182,24 @@ public class UsbDefaultFragmentTest { } @Test - public void onTetheringStarted_setDefaultUsbFunctions() { - mFragment.mPreviousFunctions = UsbManager.FUNCTION_PTP; + public void onTetheringStarted_currentFunctionsIsRndis_setsRndisAsDefaultUsbFunctions() { + mFragment.mCurrentFunctions = UsbManager.FUNCTION_RNDIS; mFragment.mOnStartTetheringCallback.onTetheringStarted(); verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_RNDIS); } + @Test + public void onTetheringStarted_currentFunctionsIsNcm_setsNcmAsDefaultUsbFunctions() { + mFragment.mCurrentFunctions = UsbManager.FUNCTION_NCM; + + mFragment.mOnStartTetheringCallback.onTetheringStarted(); + + verify(mUsbBackend).setDefaultUsbFunctions(UsbManager.FUNCTION_NCM); + } + + @Test public void onPause_receivedRndis_shouldSetRndis() { mFragment.mIsStartTethering = true; @@ -229,6 +260,18 @@ public class UsbDefaultFragmentTest { assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_MIDI); } + @Test + public void onPause_receivedNcm_setsNcm() { + mFragment.mIsStartTethering = true; + mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected */ true, + UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE); + + mFragment.onPause(); + + verify(mUsbBackend, times(2)).setDefaultUsbFunctions(UsbManager.FUNCTION_NCM); + assertThat(mFragment.mCurrentFunctions).isEqualTo(UsbManager.FUNCTION_NCM); + } + @Test public void usbIsPluginAndUsbTetheringIsOn_startTetheringIsInvoked() { when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS); @@ -243,6 +286,20 @@ public class UsbDefaultFragmentTest { eq(mFragment.mOnStartTetheringCallback)); } + @Test + public void usbIsPluginAndUsbTetheringIsOn_receivedNcm_startsTethering() { + when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_NCM); + + mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected */ false, + UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE); + mFragment.mUsbConnectionListener.onUsbConnectionChanged(/* connected */ true, + UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, DATA_ROLE_DEVICE); + + verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB), + any(), + eq(mFragment.mOnStartTetheringCallback)); + } + @Test public void usbIsNotPluginAndUsbTetheringIsOn_startTetheringIsNotInvoked() { when(mUsbBackend.getDefaultUsbFunctions()).thenReturn(UsbManager.FUNCTION_RNDIS); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java index 9118645ce61..f94ab6a5d96 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/usb/UsbDetailsFunctionsControllerTest.java @@ -167,6 +167,19 @@ public class UsbDetailsFunctionsControllerTest { assertThat(prefs.get(0).isChecked()).isTrue(); } + @Test + public void displayRefresh_ncmEnabled_checksSwitches() { + when(mUsbBackend.areFunctionsSupported(anyLong())).thenReturn(true); + + mDetailsFunctionsController.refresh(true, UsbManager.FUNCTION_NCM, POWER_ROLE_SINK, + DATA_ROLE_DEVICE); + List prefs = getRadioPreferences(); + + assertThat(prefs.get(1).getKey()) + .isEqualTo(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_RNDIS)); + assertThat(prefs.get(1).isChecked()).isTrue(); + } + @Test public void onClickMtp_noneEnabled_shouldEnableMtp() { when(mUsbBackend.areFunctionsSupported(anyLong())).thenReturn(true); @@ -253,6 +266,20 @@ public class UsbDetailsFunctionsControllerTest { UsbManager.FUNCTION_MTP); } + @Test + public void onRadioButtonClicked_functionNcm_startsTethering() { + mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_NCM)); + doReturn(UsbManager.FUNCTION_MTP).when(mUsbBackend).getCurrentFunctions(); + + mDetailsFunctionsController.onRadioButtonClicked(mRadioButtonPreference); + + verify(mTetheringManager).startTethering(eq(TetheringManager.TETHERING_USB), + any(), + eq(mDetailsFunctionsController.mOnStartTetheringCallback)); + assertThat(mDetailsFunctionsController.mPreviousFunction).isEqualTo( + UsbManager.FUNCTION_MTP); + } + @Test public void onRadioButtonClicked_functionOther_setCurrentFunctionInvoked() { mRadioButtonPreference.setKey(UsbBackend.usbFunctionsToString(UsbManager.FUNCTION_PTP)); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java index 1faa75fb700..c3b3075612f 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryAppListPreferenceControllerTest.java @@ -25,6 +25,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.PackageManager; +import android.content.res.Resources; import android.os.UserManager; import android.text.format.DateUtils; @@ -72,11 +73,14 @@ public class BatteryAppListPreferenceControllerTest { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + final Resources resources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(resources); when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getApplicationContext()).thenReturn(mContext); when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); when(mUserManager.getProfileIdsWithDisabled(anyInt())).thenReturn(new int[] {}); - + when(resources.getTextArray(R.array.allowlist_hide_summary_in_battery_usage)) + .thenReturn(new String[] {"com.android.googlequicksearchbox"}); FakeFeatureFactory.setupForTest(); mPreference = new PowerGaugePreference(mContext); @@ -119,7 +123,7 @@ public class BatteryAppListPreferenceControllerTest { public void testSetUsageSummary_timeMoreThanOneMinute_GoogleApp_shouldNotSetScreenSummary() { when(mBatteryEntry.getTimeInForegroundMs()).thenReturn(2 * DateUtils.MINUTE_IN_MILLIS); when(mBatteryEntry.getDefaultPackageName()) - .thenReturn("com.google.android.googlequicksearchbox"); + .thenReturn("com.android.googlequicksearchbox"); doReturn(mContext.getText(R.string.battery_used_for)).when(mFragment).getText( R.string.battery_used_for); doReturn(mContext).when(mFragment).getContext(); diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index ef76eeeaa67..fd4e82d4b23 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -101,8 +101,11 @@ public final class BatteryChartPreferenceControllerTest { mFeatureFactory = FakeFeatureFactory.setupForTest(); mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; mContext = spy(RuntimeEnvironment.application); - mContext.getResources().getConfiguration().setLocales( - new LocaleList(new Locale("en_US"))); + final Resources resources = spy(mContext.getResources()); + resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US"))); + doReturn(resources).when(mContext).getResources(); + doReturn(new String[] {"com.android.googlequicksearchbox"}) + .when(resources).getTextArray(R.array.allowlist_hide_summary_in_battery_usage); mBatteryChartPreferenceController = createController(); mBatteryChartPreferenceController.mPrefContext = mContext; mBatteryChartPreferenceController.mAppListPrefGroup = mAppListGroup; @@ -467,7 +470,7 @@ public final class BatteryChartPreferenceControllerTest { spy(createBatteryDiffEntry( /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS)); - doReturn("com.google.android.googlequicksearchbox").when(batteryDiffEntry) + doReturn("com.android.googlequicksearchbox").when(batteryDiffEntry) .getPackageName(); mBatteryChartPreferenceController.setPreferenceSummary(pref, batteryDiffEntry); @@ -678,7 +681,7 @@ public final class BatteryChartPreferenceControllerTest { // Verifies the item which is defined in the array list. assertThat(mBatteryChartPreferenceController - .isValidToShowSummary("com.google.android.googlequicksearchbox")) + .isValidToShowSummary("com.android.googlequicksearchbox")) .isFalse(); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java index 96f0ec7e1b8..c1b17618073 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryEntryTest.java @@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; @@ -36,6 +37,7 @@ import android.os.UserBatteryConsumer; import android.os.UserManager; import com.android.settings.R; +import com.android.settings.fuelgauge.BatteryEntry.NameAndIcon; import org.junit.Before; import org.junit.Rule; @@ -64,6 +66,7 @@ public class BatteryEntryTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mMockContext; + private Context mContext; @Mock private Handler mockHandler; @Mock private PackageManager mockPackageManager; @Mock private UserManager mockUserManager; @@ -71,6 +74,7 @@ public class BatteryEntryTest { @Before public void stubContextToReturnMockPackageManager() { + mContext = spy(RuntimeEnvironment.application); when(mMockContext.getPackageManager()).thenReturn(mockPackageManager); } @@ -248,4 +252,77 @@ public class BatteryEntryTest { final String key = entry.getKey(); assertThat(key).isEqualTo("U|2"); } + + @Test + public void getNameAndIconFromUserId_nullUserInfo_returnDefaultNameAndIcon() { + final int userId = 1001; + doReturn(mockUserManager).when(mContext).getSystemService(UserManager.class); + doReturn(null).when(mockUserManager).getUserInfo(userId); + + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUserId( + mContext, userId); + assertThat(nameAndIcon.name).isEqualTo(getString( + R.string.running_process_item_removed_user_label)); + assertThat(nameAndIcon.icon).isNull(); + } + + @Test + public void getNameAndIconFromUid_rerturnExpectedName() { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid( + mContext, /* name */ null, /* uid */ 0); + assertThat(nameAndIcon.name).isEqualTo(getString(R.string.process_kernel_label)); + + assertNameAndIcon("mediaserver", R.string.process_mediaserver_label); + assertNameAndIcon("dex2oat32", R.string.process_dex2oat_label); + assertNameAndIcon("dex2oat64", R.string.process_dex2oat_label); + assertNameAndIcon("dex2oat", R.string.process_dex2oat_label); + } + + @Test + public void getNameAndIconFromPowerComponent_rerturnExpectedNameAndIcon() { + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, + R.string.ambient_display_screen_title, + R.drawable.ic_settings_aod); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, + R.string.power_bluetooth, + com.android.internal.R.drawable.ic_settings_bluetooth); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_CAMERA, + R.string.power_camera, + R.drawable.ic_settings_camera); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, + R.string.power_cell, + R.drawable.ic_cellular_1_bar); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, + R.string.power_flashlight, + R.drawable.ic_settings_display); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_PHONE, + R.string.power_phone, + R.drawable.ic_settings_voice_calls); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_SCREEN, + R.string.power_screen, + R.drawable.ic_settings_display); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_WIFI, + R.string.power_wifi, + R.drawable.ic_settings_wireless); + assertNameAndIcon(BatteryConsumer.POWER_COMPONENT_IDLE, + R.string.power_idle, + R.drawable.ic_settings_phone_idle); + } + + private void assertNameAndIcon(String name, int stringId) { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromUid( + mContext, name, /* uid */ 1000); + assertThat(nameAndIcon.name).isEqualTo(getString(stringId)); + } + + private void assertNameAndIcon(int powerComponentId, int stringId, int iconId) { + final NameAndIcon nameAndIcon = BatteryEntry.getNameAndIconFromPowerComponent( + mContext, powerComponentId); + assertThat(nameAndIcon.name).isEqualTo(getString(stringId)); + assertThat(nameAndIcon.iconId).isEqualTo(iconId); + } + + private String getString(int stringId) { + return mContext.getResources().getString(stringId); + } } diff --git a/tests/robotests/src/com/android/settings/privacy/SensorToggleControllerTest.java b/tests/robotests/src/com/android/settings/privacy/SensorToggleControllerTest.java index b38dbe8fd61..a6a16fc0e59 100644 --- a/tests/robotests/src/com/android/settings/privacy/SensorToggleControllerTest.java +++ b/tests/robotests/src/com/android/settings/privacy/SensorToggleControllerTest.java @@ -18,11 +18,13 @@ package com.android.settings.privacy; import static android.hardware.SensorPrivacyManager.Sensors.CAMERA; import static android.hardware.SensorPrivacyManager.Sensors.MICROPHONE; +import static android.hardware.SensorPrivacyManager.Sources.OTHER; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -91,14 +93,14 @@ public class SensorToggleControllerTest { listener.onSensorPrivacyChanged(MICROPHONE, mMicState); } return null; - }).when(mSensorPrivacyManager).setSensorPrivacy(eq(MICROPHONE), anyBoolean()); + }).when(mSensorPrivacyManager).setSensorPrivacy(anyInt(), eq(MICROPHONE), anyBoolean()); doAnswer(invocation -> { mCamState = invocation.getArgument(1); for (OnSensorPrivacyChangedListener listener : mMicListeners) { listener.onSensorPrivacyChanged(CAMERA, mMicState); } return null; - }).when(mSensorPrivacyManager).setSensorPrivacy(eq(CAMERA), anyBoolean()); + }).when(mSensorPrivacyManager).setSensorPrivacy(anyInt(), eq(CAMERA), anyBoolean()); doAnswer(invocation -> mMicListeners.add(invocation.getArgument(1))) .when(mSensorPrivacyManager).addSensorPrivacyListener(eq(MICROPHONE), any()); @@ -108,37 +110,37 @@ public class SensorToggleControllerTest { @Test public void isChecked_disableMicrophoneSensorPrivacy_returnTrue() { - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, false); MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle"); assertTrue(micToggleController.isChecked()); } @Test public void isChecked_enableMicrophoneSensorPrivacy_returnFalse() { - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, true); MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle"); assertFalse(micToggleController.isChecked()); } @Test public void isChecked_disableMicrophoneSensorPrivacyThenChanged_returnFalse() { - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, false); MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle"); - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, true); assertFalse(micToggleController.isChecked()); } @Test public void isChecked_enableMicrophoneSensorPrivacyThenChanged_returnTrue() { - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, true); MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle"); - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, false); assertTrue(micToggleController.isChecked()); } @Test public void isMicrophoneSensorPrivacyEnabled_uncheckMicToggle_returnTrue() { - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, false); MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle"); micToggleController.setChecked(false); assertTrue(mMicState); @@ -146,7 +148,7 @@ public class SensorToggleControllerTest { @Test public void isMicrophoneSensorPrivacyEnabled_checkMicToggle_returnFalse() { - mSensorPrivacyManager.setSensorPrivacy(MICROPHONE, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, MICROPHONE, true); MicToggleController micToggleController = new MicToggleController(mContext, "mic_toggle"); micToggleController.setChecked(true); assertFalse(mMicState); @@ -154,7 +156,7 @@ public class SensorToggleControllerTest { @Test public void isChecked_disableCameraSensorPrivacy_returnTrue() { - mSensorPrivacyManager.setSensorPrivacy(CAMERA, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, false); CameraToggleController camToggleController = new CameraToggleController(mContext, "cam_toggle"); assertTrue(camToggleController.isChecked()); @@ -162,7 +164,7 @@ public class SensorToggleControllerTest { @Test public void isChecked_enableCameraSensorPrivacy_returnFalse() { - mSensorPrivacyManager.setSensorPrivacy(CAMERA, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, true); CameraToggleController camToggleController = new CameraToggleController(mContext, "cam_toggle"); assertFalse(camToggleController.isChecked()); @@ -170,25 +172,25 @@ public class SensorToggleControllerTest { @Test public void isChecked_disableCameraSensorPrivacyThenChanged_returnFalse() { - mSensorPrivacyManager.setSensorPrivacy(CAMERA, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, false); CameraToggleController camToggleController = new CameraToggleController(mContext, "cam_toggle"); - mSensorPrivacyManager.setSensorPrivacy(CAMERA, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, true); assertFalse(camToggleController.isChecked()); } @Test public void isChecked_enableCameraSensorPrivacyThenChanged_returnTrue() { - mSensorPrivacyManager.setSensorPrivacy(CAMERA, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, true); CameraToggleController camToggleController = new CameraToggleController(mContext, "cam_toggle"); - mSensorPrivacyManager.setSensorPrivacy(CAMERA, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, false); assertTrue(camToggleController.isChecked()); } @Test public void isCameraSensorPrivacyEnabled_uncheckMicToggle_returnTrue() { - mSensorPrivacyManager.setSensorPrivacy(CAMERA, false); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, false); CameraToggleController camToggleController = new CameraToggleController(mContext, "cam_toggle"); camToggleController.setChecked(false); @@ -197,7 +199,7 @@ public class SensorToggleControllerTest { @Test public void isCameraSensorPrivacyEnabled_checkMicToggle_returnFalse() { - mSensorPrivacyManager.setSensorPrivacy(CAMERA, true); + mSensorPrivacyManager.setSensorPrivacy(OTHER, CAMERA, true); CameraToggleController camToggleController = new CameraToggleController(mContext, "cam_toggle"); camToggleController.setChecked(true);