Merge "[API Review] APIs in SubscriptionManager" into rvc-dev
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 98b9772..d01f8be 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3812,6 +3812,12 @@
<!-- Bluetooth Tethering settings. Message for untethering from a bluetooth device [CHAR LIMIT=50]-->
<string name="bluetooth_untether_blank"><xliff:g id="device_name">%1$s</xliff:g> will be untethered.</string>
+ <!-- Ethernet Tethering settings-->
+ <!-- Label for ethernet tether checkbox [CHAR LIMIT=25]-->
+ <string name="ethernet_tether_checkbox_text">Ethernet tethering</string>
+ <!-- Ethernet Tethering subtext [CHAR LIMIT=70]-->
+ <string name="ethernet_tethering_subtext" product="default">Share phone\u2019s internet connection via USB Ethernet</string>
+
<!-- Tethering footer info [CHAR LIMIT=NONE]-->
<string name="tethering_footer_info">Use hotspot and tethering to provide internet to other devices through your mobile data connection. Apps can also create a hotspot to share content with nearby devices.</string>
<!-- Tethering footer info for the device which supports Wi-Fi and Wi-Fi tethering enabled at the same time [CHAR LIMIT=NONE]-->
@@ -7005,7 +7011,7 @@
<string name="apps_with_restrictions_settings_button">Expand settings for application</string>
<!-- NFC payment settings --><skip/>
- <string name="nfc_payment_settings_title">Tap & pay</string>
+ <string name="nfc_payment_settings_title">Contactless payments</string>
<!-- Caption for button linking to a page explaining how Tap and Pay works-->
<string name="nfc_payment_how_it_works">How it works</string>
<!-- String shown when there are no NFC payment applications installed -->
@@ -9756,7 +9762,7 @@
<!-- Label for setting which controls whether app can display over other apps [CHAR LIMIT=45] -->
<string name="permit_draw_overlay">Allow display over other apps</string>
<!-- Description of allowing overlay setting [CHAR LIMIT=NONE] -->
- <string name="allow_overlay_description">Allow this app to display on top of other apps you\u2019re using. It may interfere with your use of those apps or change the way they seem to appear or behave.</string>
+ <string name="allow_overlay_description">Allow this app to display on top of other apps you\u2019re using. This app will be able to see where you tap or change what\u2019s displayed on the screen.</string>
<!-- Manager External Storage settings title [CHAR LIMIT=40] -->
<string name="manage_external_storage_title">All files access</string>
@@ -11806,4 +11812,9 @@
<!-- Button label to stop casting on media device. [CHAR LIMIT=40 -->
<string name="media_output_panel_stop_casting_button">Stop casting</string>
+
+ <!-- Title for the 5G limited VoLTE dialog. [CHAR LIMIT=50] -->
+ <string name="volte_5G_limited_title">Turn off VoLTE?</string>
+ <!-- Content description for the 5G limited VoLTE dialog. [CHAR LIMIT=NONE] -->
+ <string name="volte_5G_limited_text">This also turns off your 5G connection.\nDuring a voice call, you can\u2019t use the internet and some apps may not work.</string>
</resources>
diff --git a/res/xml/tether_prefs.xml b/res/xml/tether_prefs.xml
index abc49cc..9367a9b 100644
--- a/res/xml/tether_prefs.xml
+++ b/res/xml/tether_prefs.xml
@@ -38,6 +38,12 @@
android:summary="@string/bluetooth_tethering_subtext"
settings:keywords="@string/keywords_hotspot_tethering" />
+ <SwitchPreference
+ android:key="enable_ethernet_tethering"
+ android:title="@string/ethernet_tether_checkbox_text"
+ android:summary="@string/ethernet_tethering_subtext"
+ settings:keywords="@string/keywords_hotspot_tethering" />
+
<Preference
android:key="disabled_on_data_saver"
android:summary="@string/tether_settings_disabled_on_data_saver"
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index cce2010..c61e573 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -18,6 +18,7 @@
import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
import static android.net.ConnectivityManager.TETHERING_USB;
+import static android.net.TetheringManager.TETHERING_ETHERNET;
import android.app.Activity;
import android.app.settings.SettingsEnums;
@@ -31,12 +32,16 @@
import android.content.pm.PackageManager;
import android.hardware.usb.UsbManager;
import android.net.ConnectivityManager;
+import android.net.EthernetManager;
+import android.net.TetheringManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
+import android.os.HandlerExecutor;
import android.os.UserManager;
import android.provider.SearchIndexableResource;
+import android.text.TextUtils;
import android.util.FeatureFlagUtils;
import androidx.annotation.VisibleForTesting;
@@ -71,6 +76,7 @@
static final String KEY_USB_TETHER_SETTINGS = "usb_tether_settings";
@VisibleForTesting
static final String KEY_ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";
+ private static final String KEY_ENABLE_ETHERNET_TETHERING = "enable_ethernet_tethering";
private static final String KEY_DATA_SAVER_FOOTER = "disabled_on_data_saver";
@VisibleForTesting
static final String KEY_TETHER_PREFS_FOOTER = "tether_prefs_footer";
@@ -81,15 +87,22 @@
private SwitchPreference mBluetoothTether;
+ private SwitchPreference mEthernetTether;
+
private BroadcastReceiver mTetherChangeReceiver;
private String[] mUsbRegexs;
private String[] mBluetoothRegexs;
+ private String mEthernetRegex;
private AtomicReference<BluetoothPan> mBluetoothPan = new AtomicReference<>();
private Handler mHandler = new Handler();
private OnStartTetheringCallback mStartTetheringCallback;
private ConnectivityManager mCm;
+ private EthernetManager mEm;
+ private TetheringManager mTm;
+ private TetheringEventCallback mTetheringEventCallback;
+ private EthernetListener mEthernetListener;
private WifiTetherPreferenceController mWifiTetherPreferenceController;
@@ -144,17 +157,23 @@
mUsbTether = (SwitchPreference) findPreference(KEY_USB_TETHER_SETTINGS);
mBluetoothTether = (SwitchPreference) findPreference(KEY_ENABLE_BLUETOOTH_TETHERING);
+ mEthernetTether = (SwitchPreference) findPreference(KEY_ENABLE_ETHERNET_TETHERING);
setFooterPreferenceTitle();
mDataSaverBackend.addListener(this);
mCm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
+ mEm = (EthernetManager) getSystemService(Context.ETHERNET_SERVICE);
+ mTm = (TetheringManager) getSystemService(Context.TETHERING_SERVICE);
mUsbRegexs = mCm.getTetherableUsbRegexs();
mBluetoothRegexs = mCm.getTetherableBluetoothRegexs();
+ mEthernetRegex = getContext().getResources().getString(
+ com.android.internal.R.string.config_ethernet_iface_regex);
final boolean usbAvailable = mUsbRegexs.length != 0;
final boolean bluetoothAvailable = mBluetoothRegexs.length != 0;
+ final boolean ethernetAvailable = !TextUtils.isEmpty(mEthernetRegex);
if (!usbAvailable || Utils.isMonkeyRunning()) {
getPreferenceScreen().removePreference(mUsbTether);
@@ -172,6 +191,7 @@
mBluetoothTether.setChecked(false);
}
}
+ if (!ethernetAvailable) getPreferenceScreen().removePreference(mEthernetTether);
// Set initial state based on Data Saver mode.
onDataSaverChanged(mDataSaverBackend.isDataSaverEnabled());
}
@@ -194,6 +214,7 @@
mDataSaverEnabled = isDataSaving;
mUsbTether.setEnabled(!mDataSaverEnabled);
mBluetoothTether.setEnabled(!mDataSaverEnabled);
+ mEthernetTether.setEnabled(!mDataSaverEnabled);
mDataSaverFooter.setVisible(mDataSaverEnabled);
}
@@ -221,6 +242,7 @@
@Override
public void onReceive(Context content, Intent intent) {
String action = intent.getAction();
+ // TODO: stop using ACTION_TETHER_STATE_CHANGED and use mTetheringEventCallback instead.
if (action.equals(ConnectivityManager.ACTION_TETHER_STATE_CHANGED)) {
// TODO - this should understand the interface types
ArrayList<String> available = intent.getStringArrayListExtra(
@@ -279,6 +301,8 @@
final Activity activity = getActivity();
mStartTetheringCallback = new OnStartTetheringCallback(this);
+ mTetheringEventCallback = new TetheringEventCallback();
+ mTm.registerTetheringEventCallback(new HandlerExecutor(mHandler), mTetheringEventCallback);
mMassStorageActive = Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
mTetherChangeReceiver = new TetherChangeReceiver();
@@ -301,6 +325,9 @@
if (intent != null) mTetherChangeReceiver.onReceive(activity, intent);
+ mEthernetListener = new EthernetListener();
+ mEm.addListener(mEthernetListener);
+
updateState();
}
@@ -312,8 +339,12 @@
return;
}
getActivity().unregisterReceiver(mTetherChangeReceiver);
+ mTm.unregisterTetheringEventCallback(mTetheringEventCallback);
+ mEm.removeListener(mEthernetListener);
mTetherChangeReceiver = null;
mStartTetheringCallback = null;
+ mTetheringEventCallback = null;
+ mEthernetListener = null;
}
private void updateState() {
@@ -327,6 +358,7 @@
String[] errored) {
updateUsbState(available, tethered, errored);
updateBluetoothState();
+ updateEthernetState(available, tethered);
}
private void updateUsbState(String[] available, String[] tethered,
@@ -390,6 +422,31 @@
}
}
+ private void updateEthernetState(String[] available, String[] tethered) {
+
+ boolean isAvailable = false;
+ boolean isTethered = false;
+
+ for (String s : available) {
+ if (s.matches(mEthernetRegex)) isAvailable = true;
+ }
+
+ for (String s : tethered) {
+ if (s.matches(mEthernetRegex)) isTethered = true;
+ }
+
+ if (isTethered) {
+ mEthernetTether.setEnabled(!mDataSaverEnabled);
+ mEthernetTether.setChecked(true);
+ } else if (isAvailable || mEm.isAvailable()) {
+ mEthernetTether.setEnabled(!mDataSaverEnabled);
+ mEthernetTether.setChecked(false);
+ } else {
+ mEthernetTether.setEnabled(false);
+ mEthernetTether.setChecked(false);
+ }
+ }
+
public static boolean isProvisioningNeededButUnavailable(Context context) {
return (TetherUtil.isProvisioningNeeded(context)
&& !isIntentAvailable(context));
@@ -438,6 +495,12 @@
} else {
mCm.stopTethering(TETHERING_BLUETOOTH);
}
+ } else if (preference == mEthernetTether) {
+ if (mEthernetTether.isChecked()) {
+ startTethering(TETHERING_ETHERNET);
+ } else {
+ mCm.stopTethering(TETHERING_ETHERNET);
+ }
}
return super.onPreferenceTreeClick(preference);
@@ -495,6 +558,13 @@
if (!bluetoothAvailable) {
keys.add(KEY_ENABLE_BLUETOOTH_TETHERING);
}
+
+ final boolean ethernetAvailable = !TextUtils.isEmpty(
+ context.getResources().getString(
+ com.android.internal.R.string.config_ethernet_iface_regex));
+ if (!ethernetAvailable) {
+ keys.add(KEY_ENABLE_ETHERNET_TETHERING);
+ }
return keys;
}
};
@@ -524,4 +594,17 @@
}
}
}
+
+ private final class TetheringEventCallback implements TetheringManager.TetheringEventCallback {
+ @Override
+ public void onTetheredInterfacesChanged(List<String> interfaces) {
+ updateState();
+ }
+ }
+
+ private final class EthernetListener implements EthernetManager.Listener {
+ public void onAvailabilityChanged(String iface, boolean isAvailable) {
+ mHandler.post(TetherSettings.this::updateState);
+ }
+ }
}
diff --git a/src/com/android/settings/development/EnhancedConnectivityPreferenceController.java b/src/com/android/settings/development/EnhancedConnectivityPreferenceController.java
index 2dbd7d1..dc65973 100644
--- a/src/com/android/settings/development/EnhancedConnectivityPreferenceController.java
+++ b/src/com/android/settings/development/EnhancedConnectivityPreferenceController.java
@@ -37,7 +37,7 @@
@VisibleForTesting
static final int ENHANCED_CONNECTIVITY_ON = 1;
- // default is enhanced connectivity disabled.
+ // default is enhanced connectivity enabled.
@VisibleForTesting
static final int ENHANCED_CONNECTIVITY_OFF = 0;
@@ -65,7 +65,7 @@
public void updateState(Preference preference) {
final int enhancedConnectivityEnabled = Settings.Global.getInt(
mContext.getContentResolver(), Settings.Global.ENHANCED_CONNECTIVITY_ENABLED,
- ENHANCED_CONNECTIVITY_OFF);
+ ENHANCED_CONNECTIVITY_ON);
((SwitchPreference) mPreference).setChecked(
enhancedConnectivityEnabled == ENHANCED_CONNECTIVITY_ON);
}
@@ -75,7 +75,7 @@
super.onDeveloperOptionsSwitchDisabled();
Settings.Global.putInt(mContext.getContentResolver(),
Settings.Global.ENHANCED_CONNECTIVITY_ENABLED,
- ENHANCED_CONNECTIVITY_OFF);
- ((SwitchPreference) mPreference).setChecked(false);
+ ENHANCED_CONNECTIVITY_ON);
+ ((SwitchPreference) mPreference).setChecked(true);
}
}
diff --git a/src/com/android/settings/network/ims/ImsQueryController.java b/src/com/android/settings/network/ims/ImsQueryController.java
index 8fdad40..068a805 100644
--- a/src/com/android/settings/network/ims/ImsQueryController.java
+++ b/src/com/android/settings/network/ims/ImsQueryController.java
@@ -20,6 +20,7 @@
import android.telephony.SubscriptionManager;
import android.telephony.ims.ImsException;
import android.telephony.ims.ImsMmTelManager;
+import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
@@ -84,4 +85,20 @@
boolean isProvisionedOnDevice(int subId) {
return (new ImsQueryProvisioningStat(subId, mCapability, mTech)).query();
}
+
+ @VisibleForTesting
+ boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
+ IllegalArgumentException {
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ return false;
+ }
+
+ final ImsMmTelManager imsMmTelManager = ImsMmTelManager.createForSubscriptionId(subId);
+ // TODO: have a shared thread pool instead of create ExecutorService
+ // everytime to improve performance.
+ final ExecutorService executor = Executors.newSingleThreadExecutor();
+ final IntegerConsumer intResult = new IntegerConsumer();
+ imsMmTelManager.getFeatureState(executor, intResult);
+ return (intResult.get(TIMEOUT_MILLIS) == ImsFeature.STATE_READY);
+ }
}
diff --git a/src/com/android/settings/network/ims/IntegerConsumer.java b/src/com/android/settings/network/ims/IntegerConsumer.java
new file mode 100644
index 0000000..02c8227
--- /dev/null
+++ b/src/com/android/settings/network/ims/IntegerConsumer.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2020 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.settings.network.ims;
+
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
+
+class IntegerConsumer extends Semaphore implements Consumer<Integer> {
+
+ private static final String TAG = "IntegerConsumer";
+
+ IntegerConsumer() {
+ super(0);
+ mValue = new AtomicInteger();
+ }
+
+ private volatile AtomicInteger mValue;
+
+ /**
+ * Get boolean value reported from callback
+ *
+ * @param timeout callback waiting time in milliseconds
+ * @return int value reported
+ * @throws InterruptedException when thread get interrupted
+ */
+ int get(long timeout) throws InterruptedException {
+ tryAcquire(timeout, TimeUnit.MILLISECONDS);
+ return mValue.get();
+ }
+
+ /**
+ * Implementation of {@link Consumer#accept(Integer)}
+ *
+ * @param value int reported from {@link Consumer#accept(Integer)}
+ */
+ public void accept(Integer value) {
+ if (value != null) {
+ mValue.set(value.intValue());
+ }
+ release();
+ }
+}
diff --git a/src/com/android/settings/network/ims/VtQueryImsState.java b/src/com/android/settings/network/ims/VtQueryImsState.java
index 60bd729..c077603 100644
--- a/src/com/android/settings/network/ims/VtQueryImsState.java
+++ b/src/com/android/settings/network/ims/VtQueryImsState.java
@@ -20,20 +20,23 @@
import android.telecom.TelecomManager;
import android.telephony.AccessNetworkConstants;
import android.telephony.SubscriptionManager;
+import android.telephony.ims.ImsException;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.stub.ImsRegistrationImplBase;
+import android.util.Log;
import androidx.annotation.VisibleForTesting;
import com.android.ims.ImsManager;
import com.android.settings.network.SubscriptionUtil;
-import com.android.settings.network.telephony.MobileNetworkUtils;
/**
* Controller class for querying VT status
*/
public class VtQueryImsState extends ImsQueryController {
+ private static final String LOG_TAG = "VtQueryImsState";
+
private Context mContext;
private int mSubId;
@@ -71,14 +74,25 @@
* @return true when Video Call can be performed, otherwise false
*/
public boolean isReadyToVideoCall() {
+ if (!isProvisionedOnDevice(mSubId)) {
+ return false;
+ }
+
final ImsManager imsManager = getImsManager(mSubId);
if (imsManager == null) {
return false;
}
- return imsManager.isVtEnabledByPlatform()
- && isProvisionedOnDevice(mSubId)
- && MobileNetworkUtils.isImsServiceStateReady(imsManager);
+ if (!imsManager.isVtEnabledByPlatform()) {
+ return false;
+ }
+
+ try {
+ return isServiceStateReady(mSubId);
+ } catch (InterruptedException | IllegalArgumentException | ImsException exception) {
+ Log.w(LOG_TAG, "fail to get Vt service status. subId=" + mSubId, exception);
+ }
+ return false;
}
/**
diff --git a/src/com/android/settings/panel/MediaOutputPanel.java b/src/com/android/settings/panel/MediaOutputPanel.java
index 2a9669a..998cfc8 100644
--- a/src/com/android/settings/panel/MediaOutputPanel.java
+++ b/src/com/android/settings/panel/MediaOutputPanel.java
@@ -33,6 +33,7 @@
import android.media.MediaMetadata;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
+import android.media.session.PlaybackState;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
@@ -66,12 +67,11 @@
private final Context mContext;
private final String mPackageName;
- private PanelContentCallback mCallback;
- private boolean mIsCustomizedButtonUsed = true;
-
@VisibleForTesting
LocalMediaManager mLocalMediaManager;
+ private PanelContentCallback mCallback;
+ private boolean mIsCustomizedButtonUsed = true;
private MediaSessionManager mMediaSessionManager;
private MediaController mMediaController;
@@ -255,5 +255,12 @@
mCallback.onHeaderChanged();
}
}
+
+ @Override
+ public void onPlaybackStateChanged(PlaybackState state) {
+ if (mCallback != null && state.getState() != PlaybackState.STATE_PLAYING) {
+ mCallback.forceClose();
+ }
+ }
};
}
diff --git a/src/com/android/settings/panel/PanelContentCallback.java b/src/com/android/settings/panel/PanelContentCallback.java
index 989082f..63c2c55 100644
--- a/src/com/android/settings/panel/PanelContentCallback.java
+++ b/src/com/android/settings/panel/PanelContentCallback.java
@@ -32,4 +32,9 @@
* a group
*/
void onHeaderChanged();
+
+ /**
+ * It will be called when panel requests to close itself.
+ */
+ void forceClose();
}
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index ed5c755..28515fd 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -433,5 +433,16 @@
mHeaderSubtitle.setText(mPanel.getSubTitle());
});
}
+
+ @Override
+ public void forceClose() {
+ mPanelClosedKey = PanelClosedKeys.KEY_OTHERS;
+ getFragmentActivity().finish();
+ }
+
+ @VisibleForTesting
+ FragmentActivity getFragmentActivity() {
+ return getActivity();
+ }
}
}
diff --git a/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java b/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java
index 8d093c0..bf807a1 100644
--- a/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java
+++ b/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java
@@ -17,6 +17,7 @@
package com.android.settings.security;
import android.app.KeyguardManager;
+import android.app.settings.SettingsEnums;
import android.content.Context;
import android.provider.Settings;
@@ -26,19 +27,23 @@
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.network.telephony.MobileNetworkUtils;
+import com.android.settings.overlay.FeatureFactory;
import com.android.settings.wifi.dpp.WifiDppUtils;
+import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
/** Enable/disable user confirmation before deleting an eSim */
public class ConfirmSimDeletionPreferenceController extends BasePreferenceController implements
Preference.OnPreferenceChangeListener{
public static final String KEY_CONFIRM_SIM_DELETION = "confirm_sim_deletion";
private boolean mConfirmationDefaultOn;
+ private MetricsFeatureProvider mMetricsFeatureProvider;
public ConfirmSimDeletionPreferenceController(Context context, String key) {
super(context, key);
mConfirmationDefaultOn =
context.getResources()
.getBoolean(R.bool.config_sim_deletion_confirmation_default_on);
+ mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
}
@Override
@@ -72,11 +77,15 @@
return false;
}
if (!isChecked()) {
+ mMetricsFeatureProvider.action(mContext,
+ SettingsEnums.ACTION_CONFIRM_SIM_DELETION_ON);
setChecked(true);
return true;
} else {
// prevent disabling the feature until authorized
WifiDppUtils.showLockScreen(mContext, () -> {
+ mMetricsFeatureProvider.action(mContext,
+ SettingsEnums.ACTION_CONFIRM_SIM_DELETION_OFF);
// set data
setChecked(false);
// set UI
diff --git a/tests/robotests/src/com/android/settings/development/EnhancedConnectivityPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/EnhancedConnectivityPreferenceControllerTest.java
index 6fd6f55..171fc6b 100644
--- a/tests/robotests/src/com/android/settings/development/EnhancedConnectivityPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/EnhancedConnectivityPreferenceControllerTest.java
@@ -88,20 +88,20 @@
}
@Test
- public void onDeveloperOptionsDisabled_shouldDisablePreference() {
- mController.onDeveloperOptionsDisabled();
+ public void onDeveloperOptionsDisabled_shouldEnablePreference() {
+ mController.onDeveloperOptionsSwitchDisabled();
verify(mPreference).setEnabled(false);
- verify(mPreference).setChecked(false);
+ verify(mPreference).setChecked(true);
- assertThat(isSettingEnabled()).isFalse();
+ assertThat(isSettingEnabled()).isTrue();
}
private boolean isSettingEnabled() {
return Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.ENHANCED_CONNECTIVITY_ENABLED,
- EnhancedConnectivityPreferenceController.ENHANCED_CONNECTIVITY_OFF
- /* default off */)
+ EnhancedConnectivityPreferenceController.ENHANCED_CONNECTIVITY_ON
+ /* default on */)
== EnhancedConnectivityPreferenceController.ENHANCED_CONNECTIVITY_ON;
}
}
diff --git a/tests/robotests/src/com/android/settings/network/ims/MockVtQueryImsState.java b/tests/robotests/src/com/android/settings/network/ims/MockVtQueryImsState.java
index 4fd7d0c..3daf6cb 100644
--- a/tests/robotests/src/com/android/settings/network/ims/MockVtQueryImsState.java
+++ b/tests/robotests/src/com/android/settings/network/ims/MockVtQueryImsState.java
@@ -17,6 +17,7 @@
package com.android.settings.network.ims;
import android.content.Context;
+import android.telephony.ims.ImsException;
import com.android.ims.ImsManager;
@@ -29,6 +30,7 @@
private Boolean mIsTtyOnVolteEnabled;
private Boolean mIsProvisionedOnDevice;
private Boolean mIsEnabledByUser;
+ private Boolean mIsServiceStateReady;
/**
* Constructor
@@ -68,6 +70,19 @@
return super.isProvisionedOnDevice(subId);
}
+ public void setServiceStateReady(boolean isReady) {
+ mIsServiceStateReady = isReady;
+ }
+
+ @Override
+ boolean isServiceStateReady(int subId) throws InterruptedException, ImsException,
+ IllegalArgumentException {
+ if (mIsServiceStateReady != null) {
+ return mIsServiceStateReady;
+ }
+ return super.isServiceStateReady(subId);
+ }
+
public void setIsEnabledByUser(boolean enabled) {
mIsEnabledByUser = enabled;
}
diff --git a/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java
index c766289..04fc4b9 100644
--- a/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/telephony/VideoCallingPreferenceControllerTest.java
@@ -27,7 +27,6 @@
import android.telephony.CarrierConfigManager;
import android.telephony.TelephonyManager;
import android.telephony.ims.ProvisioningManager;
-import android.telephony.ims.feature.ImsFeature;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
@@ -98,7 +97,7 @@
doReturn(true).when(mImsManager).isVtEnabledByPlatform();
mQueryImsState.setIsProvisionedOnDevice(true);
- doReturn(ImsFeature.STATE_READY).when(mImsManager).getImsServiceState();
+ mQueryImsState.setServiceStateReady(true);
doReturn(true).when(mTelephonyManager).isDataEnabled();
mController.mCallState = TelephonyManager.CALL_STATE_IDLE;
diff --git a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
index 07f01fc..43cecfe 100644
--- a/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
+++ b/tests/robotests/src/com/android/settings/panel/MediaOutputPanelTest.java
@@ -22,6 +22,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -30,6 +31,7 @@
import android.media.MediaMetadata;
import android.media.session.MediaController;
import android.media.session.MediaSessionManager;
+import android.media.session.PlaybackState;
import android.net.Uri;
import com.android.settings.R;
@@ -67,6 +69,8 @@
private LocalMediaManager mLocalMediaManager;
@Mock
private PanelContentCallback mCallback;
+ @Mock
+ private PlaybackState mPlaybackState;
private MediaOutputPanel mPanel;
private Context mContext;
@@ -259,4 +263,19 @@
verify(mCallback).onHeaderChanged();
}
+
+ @Test
+ public void onPlaybackStateChanged_stateFromPlayingToStopped_verifyCallForceClose() {
+ mPanel.onStart();
+ verify(mMediaController).registerCallback(mControllerCbs.capture());
+ final MediaController.Callback controllerCallbacks = mControllerCbs.getValue();
+ when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_PLAYING);
+ controllerCallbacks.onPlaybackStateChanged(mPlaybackState);
+ verify(mCallback, never()).forceClose();
+
+ when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_STOPPED);
+ controllerCallbacks.onPlaybackStateChanged(mPlaybackState);
+
+ verify(mCallback).forceClose();
+ }
}
diff --git a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
index 07ca48b..9df5af1 100644
--- a/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/panel/PanelFragmentTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -236,4 +237,17 @@
assertThat(headerTitle.getText()).isEqualTo(TITLE2);
assertThat(headerSubtitle.getText()).isEqualTo(SUBTITLE2);
}
+
+ @Test
+ public void forceClose_verifyFinish() {
+ initFakeActivity();
+ verify(mFakePanelContent).registerCallback(mPanelContentCbs.capture());
+ final PanelContentCallback panelContentCallbacks = spy(mPanelContentCbs.getValue());
+ when(((PanelFragment.LocalPanelCallback) panelContentCallbacks).getFragmentActivity())
+ .thenReturn(mActivity);
+
+ panelContentCallbacks.forceClose();
+
+ verify(mActivity).finish();
+ }
}
\ No newline at end of file