diff --git a/res/drawable/ic_face_enroll_introduction_detail.xml b/res/drawable/ic_face_enroll_introduction_detail.xml index 7159148f830..386f8c7e1e7 100644 --- a/res/drawable/ic_face_enroll_introduction_detail.xml +++ b/res/drawable/ic_face_enroll_introduction_detail.xml @@ -14,7 +14,6 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> - + android:pathData="M0,0h24v24H0V0z" /> + + android:pathData="M12,2L3.82,5.64v5.45c0,5.05,3.49,9.76,8.18,10.91c4.69-1.15,8.18-5.86,8.18-10.91V5.64L12,2z M18.18,11.09 c0,1.55-0.41,3.05-1.1,4.38C15.77,14.5,13.4,14,12,14s-3.77,0.5-5.08,1.47c-0.69-1.33-1.1-2.83-1.1-4.38V6.94L12,4.19l6.18,2.75 V11.09z" /> + \ No newline at end of file diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml index 900f3781ce1..5107bd8b48d 100644 --- a/res/layout/face_enroll_introduction.xml +++ b/res/layout/face_enroll_introduction.xml @@ -45,14 +45,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> - - + android:layout_height="wrap_content" + android:layout_marginVertical="48dp"> - - + android:layout_gravity="center_horizontal|bottom"> + android:paddingEnd="16dp" + android:layout_marginTop="24dp"> Connect via %1$s To improve location accuracy and for other purposes, %1$s wants to turn on network scanning, even when Wi-Fi is off.\n\nAllow this for all apps that want to scan? - + To improve location accuracy and for other purposes, an unknown app wants to turn on network scanning, even when Wi\u2011Fi is off.\n\nAllow this for all apps that want to scan? To turn this off, go to Advanced in the overflow menu. @@ -2308,12 +2308,12 @@ 1 network %d networks - + 1 subscription %d subscriptions - + %d networks & subscriptions @@ -6994,6 +6994,10 @@ Preferred network type LTE (recommended) + + MMS messages + + Send & receive when mobile data is off Work SIM diff --git a/res/xml/adaptive_sleep_detail.xml b/res/xml/adaptive_sleep_detail.xml index cada2e846d9..2fa511bc247 100644 --- a/res/xml/adaptive_sleep_detail.xml +++ b/res/xml/adaptive_sleep_detail.xml @@ -21,7 +21,6 @@ android:key="adaptive_sleep_detail" android:title="@string/adaptive_sleep_title"> - + + getConnectableA2dpDevices() { - // Get A2dp devices on all states - // (STATE_DISCONNECTED, STATE_CONNECTING, STATE_CONNECTED, STATE_DISCONNECTING) + private List getConnectedA2dpDevices() { + // Get A2dp devices on states + // (STATE_CONNECTING, STATE_CONNECTED, STATE_DISCONNECTING) final A2dpProfile a2dpProfile = mProfileManager.getA2dpProfile(); if (a2dpProfile == null) { return new ArrayList<>(); } - return a2dpProfile.getConnectableDevices(); + return a2dpProfile.getConnectedDevices(); } - private List getConnectableHearingAidDevices() { - // Get hearing aid profile devices on all states - // (STATE_DISCONNECTED, STATE_CONNECTING, STATE_CONNECTED, STATE_DISCONNECTING) + private List getConnectedHearingAidDevices() { + // Get hearing aid profile devices on states + // (STATE_CONNECTING, STATE_CONNECTED, STATE_DISCONNECTING) final HearingAidProfile hapProfile = mProfileManager.getHearingAidProfile(); if (hapProfile == null) { return new ArrayList<>(); } - return hapProfile.getConnectableDevices(); + return hapProfile.getConnectedDevices(); } private CharSequence findActiveDeviceName() { diff --git a/src/com/android/settings/network/MobileDataContentObserver.java b/src/com/android/settings/network/MobileDataContentObserver.java new file mode 100644 index 00000000000..b8a1c8c1a5a --- /dev/null +++ b/src/com/android/settings/network/MobileDataContentObserver.java @@ -0,0 +1,72 @@ +/* + * 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.settings.network; + +import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.provider.Settings; +import android.telephony.TelephonyManager; + +/** + * {@link ContentObserver} to listen to update of mobile data change + */ +public class MobileDataContentObserver extends ContentObserver { + private OnMobileDataChangedListener mListener; + + public MobileDataContentObserver(Handler handler) { + super(handler); + } + + public static Uri getObservableUri(int subId) { + Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA); + if (TelephonyManager.getDefault().getSimCount() != 1) { + uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId); + } + return uri; + } + + public void setOnMobileDataChangedListener(OnMobileDataChangedListener lsn) { + mListener = lsn; + } + + @Override + public void onChange(boolean selfChange) { + super.onChange(selfChange); + if (mListener != null) { + mListener.onMobileDataChanged(); + } + } + + public void register(Context context, int subId) { + final Uri uri = getObservableUri(subId); + context.getContentResolver().registerContentObserver(uri, false, this); + + } + + public void unRegister(Context context) { + context.getContentResolver().unregisterContentObserver(this); + } + + /** + * Listener for update of mobile data(ON vs OFF) + */ + public interface OnMobileDataChangedListener { + void onMobileDataChanged(); + } +} diff --git a/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java new file mode 100644 index 00000000000..b8d2081f2ab --- /dev/null +++ b/src/com/android/settings/network/telephony/MmsMessagePreferenceController.java @@ -0,0 +1,106 @@ +/* + * 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.settings.network.telephony; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.telephony.data.ApnSetting; +import android.util.Log; + +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.SwitchPreference; + +import com.android.settings.network.MobileDataContentObserver; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; + +/** + * Preference controller for "Mobile data" + */ +public class MmsMessagePreferenceController extends TelephonyTogglePreferenceController implements + LifecycleObserver, OnStart, OnStop { + private TelephonyManager mTelephonyManager; + private SubscriptionManager mSubscriptionManager; + private MobileDataContentObserver mMobileDataContentObserver; + private SwitchPreference mPreference; + + public MmsMessagePreferenceController(Context context, String key) { + super(context, key); + mSubscriptionManager = context.getSystemService(SubscriptionManager.class); + mMobileDataContentObserver = new MobileDataContentObserver( + new Handler(Looper.getMainLooper())); + mMobileDataContentObserver.setOnMobileDataChangedListener(()->updateState(mPreference)); + } + + @Override + public int getAvailabilityStatus(int subId) { + final TelephonyManager telephonyManager = TelephonyManager + .from(mContext).createForSubscriptionId(subId); + return (subId != SubscriptionManager.INVALID_SUBSCRIPTION_ID + && !telephonyManager.isDataEnabled() + && telephonyManager.isApnMetered(ApnSetting.TYPE_MMS)) + ? AVAILABLE + : CONDITIONALLY_UNAVAILABLE; + } + + @Override + public void onStart() { + if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + mMobileDataContentObserver.register(mContext, mSubId); + } + } + + @Override + public void onStop() { + if (mSubId != SubscriptionManager.INVALID_SUBSCRIPTION_ID) { + mMobileDataContentObserver.unRegister(mContext); + } + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + preference.setVisible(isAvailable()); + ((SwitchPreference) preference).setChecked(isChecked()); + } + + public void init(int subId) { + mSubId = subId; + mTelephonyManager = TelephonyManager.from(mContext).createForSubscriptionId(mSubId); + } + + @Override + public boolean setChecked(boolean isChecked) { + return mSubscriptionManager.setAlwaysAllowMmsData(mSubId, isChecked); + } + + @Override + public boolean isChecked() { + return mTelephonyManager.isDataEnabledForApn(ApnSetting.TYPE_MMS); + } +} diff --git a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java index de54879abc2..a0e50fcbd80 100644 --- a/src/com/android/settings/network/telephony/MobileDataPreferenceController.java +++ b/src/com/android/settings/network/telephony/MobileDataPreferenceController.java @@ -27,6 +27,7 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; +import com.android.settings.network.MobileDataContentObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; @@ -48,7 +49,7 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon private SwitchPreference mPreference; private TelephonyManager mTelephonyManager; private SubscriptionManager mSubscriptionManager; - private DataContentObserver mDataContentObserver; + private MobileDataContentObserver mDataContentObserver; private FragmentManager mFragmentManager; @VisibleForTesting int mDialogType; @@ -58,7 +59,8 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon public MobileDataPreferenceController(Context context, String key) { super(context, key); mSubscriptionManager = context.getSystemService(SubscriptionManager.class); - mDataContentObserver = new DataContentObserver(new Handler(Looper.getMainLooper())); + mDataContentObserver = new MobileDataContentObserver(new Handler(Looper.getMainLooper())); + mDataContentObserver.setOnMobileDataChangedListener(()-> updateState(mPreference)); } @Override @@ -129,14 +131,6 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon return info != null && info.isOpportunistic(); } - public static Uri getObservableUri(int subId) { - Uri uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA); - if (TelephonyManager.getDefault().getSimCount() != 1) { - uri = Settings.Global.getUriFor(Settings.Global.MOBILE_DATA + subId); - } - return uri; - } - public void init(FragmentManager fragmentManager, int subId) { mFragmentManager = fragmentManager; mSubId = subId; @@ -170,30 +164,4 @@ public class MobileDataPreferenceController extends TelephonyTogglePreferenceCon mSubId); dialogFragment.show(mFragmentManager, DIALOG_TAG); } - - /** - * Listener that listens mobile data state change. - */ - public class DataContentObserver extends ContentObserver { - - public DataContentObserver(Handler handler) { - super(handler); - } - - @Override - public void onChange(boolean selfChange) { - super.onChange(selfChange); - updateState(mPreference); - } - - public void register(Context context, int subId) { - final Uri uri = getObservableUri(subId); - context.getContentResolver().registerContentObserver(uri, false, this); - - } - - public void unRegister(Context context) { - context.getContentResolver().unregisterContentObserver(this); - } - } } diff --git a/src/com/android/settings/network/telephony/MobileDataSlice.java b/src/com/android/settings/network/telephony/MobileDataSlice.java index 28cb11e248e..bf9fc044617 100644 --- a/src/com/android/settings/network/telephony/MobileDataSlice.java +++ b/src/com/android/settings/network/telephony/MobileDataSlice.java @@ -39,6 +39,7 @@ import androidx.slice.builders.SliceAction; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.network.AirplaneModePreferenceController; +import com.android.settings.network.MobileDataContentObserver; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.CustomSliceable; import com.android.settings.slices.SliceBackgroundWorker; @@ -267,7 +268,7 @@ public class MobileDataSlice implements CustomSliceable { } public void register(Context context, int subId) { - final Uri uri = MobileDataPreferenceController.getObservableUri(subId); + final Uri uri = MobileDataContentObserver.getObservableUri(subId); context.getContentResolver().registerContentObserver(uri, false, this); } diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index 35787927481..db99258a57b 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -136,6 +136,7 @@ public class MobileNetworkSettings extends RestrictedDashboardFragment { use(MobileNetworkSwitchController.class).init(getLifecycle(), mSubId); use(CarrierSettingsVersionPreferenceController.class).init(mSubId); use(BillingCyclePreferenceController.class).init(mSubId); + use(MmsMessagePreferenceController.class).init(mSubId); } use(MobileDataPreferenceController.class).init(getFragmentManager(), mSubId); use(RoamingPreferenceController.class).init(getFragmentManager(), mSubId); diff --git a/src/com/android/settings/sim/CallsSimListDialogFragment.java b/src/com/android/settings/sim/CallsSimListDialogFragment.java index bb5a0035fdf..7d3de443821 100644 --- a/src/com/android/settings/sim/CallsSimListDialogFragment.java +++ b/src/com/android/settings/sim/CallsSimListDialogFragment.java @@ -16,6 +16,7 @@ package com.android.settings.sim; +import android.app.settings.SettingsEnums; import android.content.Context; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; @@ -56,4 +57,9 @@ public class CallsSimListDialogFragment extends SimListDialogFragment { } return result; } + + @Override + public int getMetricsCategory() { + return SettingsEnums.DIALOG_CALL_SIM_LIST; + } } diff --git a/src/com/android/settings/sim/PreferredSimDialogFragment.java b/src/com/android/settings/sim/PreferredSimDialogFragment.java index 5b81e62e5d3..29f4c655340 100644 --- a/src/com/android/settings/sim/PreferredSimDialogFragment.java +++ b/src/com/android/settings/sim/PreferredSimDialogFragment.java @@ -18,6 +18,7 @@ package com.android.settings.sim; import android.app.Activity; import android.app.Dialog; +import android.app.settings.SettingsEnums; import android.content.DialogInterface; import android.os.Bundle; import android.telephony.SubscriptionInfo; @@ -98,4 +99,9 @@ public class PreferredSimDialogFragment extends SimDialogFragment implements protected SubscriptionManager getSubscriptionManager() { return getContext().getSystemService(SubscriptionManager.class); } + + @Override + public int getMetricsCategory() { + return SettingsEnums.DIALOG_PREFERRED_SIM_PICKER; + } } diff --git a/src/com/android/settings/sim/SimDialogFragment.java b/src/com/android/settings/sim/SimDialogFragment.java index 10815fd7679..de991ec14f8 100644 --- a/src/com/android/settings/sim/SimDialogFragment.java +++ b/src/com/android/settings/sim/SimDialogFragment.java @@ -20,10 +20,11 @@ import android.content.DialogInterface; import android.os.Bundle; import androidx.annotation.NonNull; -import androidx.fragment.app.DialogFragment; + +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; /** Common functionality for showing a dialog in SimDialogActivity. */ -public abstract class SimDialogFragment extends DialogFragment { +public abstract class SimDialogFragment extends InstrumentedDialogFragment { private static final String TAG = "SimDialogFragment"; private static final String KEY_TITLE_ID = "title_id"; diff --git a/src/com/android/settings/sim/SimListDialogFragment.java b/src/com/android/settings/sim/SimListDialogFragment.java index f78c4e76e44..1802d65420b 100644 --- a/src/com/android/settings/sim/SimListDialogFragment.java +++ b/src/com/android/settings/sim/SimListDialogFragment.java @@ -17,6 +17,7 @@ package com.android.settings.sim; import android.app.Dialog; +import android.app.settings.SettingsEnums; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; @@ -50,7 +51,7 @@ public class SimListDialogFragment extends SimDialogFragment implements protected SelectSubscriptionAdapter mAdapter; @VisibleForTesting - List mSubscriptions; + List mSubscriptions; public static SimListDialogFragment newInstance(int dialogType, int titleResId, boolean includeAskEveryTime) { @@ -122,6 +123,11 @@ public class SimListDialogFragment extends SimDialogFragment implements builder.setAdapter(mAdapter, this); } + @Override + public int getMetricsCategory() { + return SettingsEnums.DIALOG_SIM_LIST; + } + private static class SelectSubscriptionAdapter extends BaseAdapter { private Context mContext; private LayoutInflater mInflater; diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 56e4c30cea9..4d3f230db1e 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -469,13 +469,12 @@ public class WifiSettings extends RestrictedSettingsFragment return; } - // "forget" for normal saved network. And "disconnect" for ephemeral network because we - // could only disconnect it and put it in blacklists so it won't be used again. - if (mSelectedAccessPoint.isEphemeral()) { - menu.add(Menu.NONE, MENU_ID_FORGET, 0 /* order */, - R.string.wifi_disconnect_button_text); - } else if (mSelectedAccessPoint.isSaved()) { - menu.add(Menu.NONE, MENU_ID_FORGET, 0 /* order */, R.string.forget); + // "forget" for normal saved network. And "disconnect" for ephemeral network because it + // could only be disconnected and be put in blacklists so it won't be used again. + if (mSelectedAccessPoint.isSaved() || mSelectedAccessPoint.isEphemeral()) { + final int stringId = mSelectedAccessPoint.isEphemeral() ? + R.string.wifi_disconnect_button_text : R.string.forget; + menu.add(Menu.NONE, MENU_ID_FORGET, 0 /* order */, stringId); } if (mSelectedAccessPoint.isSaved() && !mSelectedAccessPoint.isActive()) { diff --git a/tests/robotests/assets/grandfather_slice_controller_not_in_xml b/tests/robotests/assets/grandfather_slice_controller_not_in_xml index d2274e65faf..4bc43391fdd 100644 --- a/tests/robotests/assets/grandfather_slice_controller_not_in_xml +++ b/tests/robotests/assets/grandfather_slice_controller_not_in_xml @@ -2,3 +2,4 @@ com.android.settings.testutils.FakeToggleController com.android.settings.testutils.FakeSliderController com.android.settings.core.TogglePreferenceControllerTest$FakeToggle com.android.settings.accessibility.AccessibilitySlicePreferenceController +com.android.settings.network.telephony.MmsMessagePreferenceController diff --git a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java index 5fdadb48662..ccc8cbd0934 100644 --- a/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java +++ b/tests/robotests/src/com/android/settings/core/codeinspection/CodeInspectionTest.java @@ -24,12 +24,11 @@ import com.android.settings.search.SearchIndexProviderCodeInspector; import com.android.settings.slices.SliceControllerInXmlCodeInspector; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; import java.util.List; -import org.robolectric.RobolectricTestRunner; /** * Test suite that scans all classes in app package, and performs different types of code inspection @@ -47,7 +46,6 @@ public class CodeInspectionTest { } @Test - @Ignore("b/130897640") public void runInstrumentableFragmentCodeInspection() { new InstrumentableFragmentCodeInspector(mClasses).run(); } diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java index b39f77ed732..1ba1dc924be 100644 --- a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java +++ b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorSliceTest.java @@ -106,9 +106,9 @@ public class MediaOutputIndicatorSliceTest { } @Test - public void getSlice_noConnectableDevice_returnNull() { + public void getSlice_noConnectedDevice_returnNull() { mDevicesList.clear(); - when(mA2dpProfile.getConnectableDevices()).thenReturn(mDevicesList); + when(mA2dpProfile.getConnectedDevices()).thenReturn(mDevicesList); assertThat(mMediaOutputIndicatorSlice.getSlice()).isNull(); } @@ -116,7 +116,7 @@ public class MediaOutputIndicatorSliceTest { @Test public void getSlice_noActiveDevice_verifyDefaultName() { mDevicesList.add(mA2dpDevice); - when(mA2dpProfile.getConnectableDevices()).thenReturn(mDevicesList); + when(mA2dpProfile.getConnectedDevices()).thenReturn(mDevicesList); when(mA2dpProfile.getActiveDevice()).thenReturn(null); // Verify slice title and subtitle @@ -130,7 +130,7 @@ public class MediaOutputIndicatorSliceTest { @Test public void getSlice_A2dpDeviceActive_verifyName() { mDevicesList.add(mA2dpDevice); - when(mA2dpProfile.getConnectableDevices()).thenReturn(mDevicesList); + when(mA2dpProfile.getConnectedDevices()).thenReturn(mDevicesList); when(mA2dpProfile.getActiveDevice()).thenReturn(mA2dpDevice); final Slice mediaSlice = mMediaOutputIndicatorSlice.getSlice(); @@ -142,7 +142,7 @@ public class MediaOutputIndicatorSliceTest { @Test public void getSlice_HADeviceActive_verifyName() { mDevicesList.add(mHapDevice); - when(mHearingAidProfile.getConnectableDevices()).thenReturn(mDevicesList); + when(mHearingAidProfile.getConnectedDevices()).thenReturn(mDevicesList); when(mHearingAidProfile.getActiveDevices()).thenReturn(mDevicesList); // Verify slice title and subtitle diff --git a/tests/robotests/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java new file mode 100644 index 00000000000..0263fe9fdcd --- /dev/null +++ b/tests/robotests/src/com/android/settings/network/telephony/MmsMessagePreferenceControllerTest.java @@ -0,0 +1,123 @@ +/* + * 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.settings.network.telephony; + +import static com.android.settings.core.BasePreferenceController.AVAILABLE; +import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.telephony.data.ApnSetting; + +import androidx.preference.SwitchPreference; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowSubscriptionManager; + +@RunWith(RobolectricTestRunner.class) +@Config(shadows = ShadowSubscriptionManager.class) +public class MmsMessagePreferenceControllerTest { + private static final int SUB_ID = 2; + + @Mock + private TelephonyManager mTelephonyManager; + @Mock + private SubscriptionManager mSubscriptionManager; + + private MmsMessagePreferenceController mController; + private SwitchPreference mPreference; + private Context mContext; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = spy(RuntimeEnvironment.application); + when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); + when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager); + when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager); + when(mTelephonyManager.createForSubscriptionId(SUB_ID)).thenReturn(mTelephonyManager); + + mPreference = new SwitchPreference(mContext); + mController = new MmsMessagePreferenceController(mContext, "mms_message"); + ShadowSubscriptionManager.setDefaultDataSubscriptionId(SUB_ID); + mController.init(SUB_ID); + mPreference.setKey(mController.getPreferenceKey()); + } + + @Test + public void getAvailabilityStatus_invalidSubscription_returnUnavailable() { + mController.init(SubscriptionManager.INVALID_SUBSCRIPTION_ID); + + assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); + } + + @Test + public void getAvailabilityStatus_mobileDataOn_returnUnavailable() { + when(mTelephonyManager.isDataEnabled()).thenReturn(true); + + assertThat(mController.getAvailabilityStatus(SUB_ID)).isEqualTo(CONDITIONALLY_UNAVAILABLE); + } + + @Test + public void getAvailabilityStatus_meteredOff_returnUnavailable() { + when(mTelephonyManager.isApnMetered(ApnSetting.TYPE_MMS)).thenReturn(false); + + assertThat(mController.getAvailabilityStatus(SUB_ID)).isEqualTo(CONDITIONALLY_UNAVAILABLE); + } + + @Test + public void getAvailabilityStatus_mobileDataOffWithValidSubId_returnAvailable() { + mController.init(SUB_ID); + when(mTelephonyManager.isDataEnabled()).thenReturn(false); + when(mTelephonyManager.isApnMetered(ApnSetting.TYPE_MMS)).thenReturn(true); + + assertThat(mController.getAvailabilityStatus(SUB_ID)).isEqualTo(AVAILABLE); + } + + @Test + public void isChecked_returnDataFromTelephonyManager() { + when(mTelephonyManager.isDataEnabledForApn(ApnSetting.TYPE_MMS)).thenReturn(false); + assertThat(mController.isChecked()).isFalse(); + + when(mTelephonyManager.isDataEnabledForApn(ApnSetting.TYPE_MMS)).thenReturn(true); + assertThat(mController.isChecked()).isTrue(); + } + + @Test + public void setChecked_setDataIntoSubscriptionManager() { + mController.setChecked(true); + verify(mSubscriptionManager).setAlwaysAllowMmsData(SUB_ID, true); + + mController.setChecked(false); + verify(mSubscriptionManager).setAlwaysAllowMmsData(SUB_ID, false); + } +}