Create special case mobile data slice
Build the special case mobile data slice for general use, and for the Internet Connectivity Panel. The Slice controls the default data subscription, and links to the subscriptions page. Bug: 117804089 Fixse: 119411534 Test: robotests & test app. Change-Id: I31b524a8fe3182a244d940848090e97250632f39
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
* 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.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.provider.Settings;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.core.graphics.drawable.IconCompat;
|
||||
import androidx.slice.Slice;
|
||||
import androidx.slice.SliceMetadata;
|
||||
import androidx.slice.SliceProvider;
|
||||
import androidx.slice.core.SliceAction;
|
||||
import androidx.slice.widget.SliceLiveData;
|
||||
|
||||
import com.android.settings.R;
|
||||
|
||||
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 java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class MobileDataSliceTest {
|
||||
|
||||
private static final int SUB_ID = 2;
|
||||
|
||||
@Mock
|
||||
private TelephonyManager mTelephonyManager;
|
||||
@Mock
|
||||
private SubscriptionManager mSubscriptionManager;
|
||||
@Mock
|
||||
private SubscriptionInfo mSubscriptionInfo;
|
||||
|
||||
private Context mContext;
|
||||
private MobileDataSlice mMobileDataSlice;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
|
||||
doReturn(mTelephonyManager).when(mContext).getSystemService(Context.TELEPHONY_SERVICE);
|
||||
doReturn(mSubscriptionManager).when(mContext).getSystemService(SubscriptionManager.class);
|
||||
doReturn(mTelephonyManager).when(mTelephonyManager).createForSubscriptionId(SUB_ID);
|
||||
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getDefaultDataSubscriptionInfo();
|
||||
doReturn(SUB_ID).when(mSubscriptionInfo).getSubscriptionId();
|
||||
|
||||
// Set-up specs for SliceMetadata.
|
||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||
|
||||
mMobileDataSlice = spy(new MobileDataSlice(mContext));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getSlice_shouldHaveTitleAndToggle() {
|
||||
final Slice mobileData = mMobileDataSlice.getSlice();
|
||||
|
||||
final SliceMetadata metadata = SliceMetadata.from(mContext, mobileData);
|
||||
assertThat(metadata.getTitle())
|
||||
.isEqualTo(mContext.getString(R.string.mobile_data_settings_title));
|
||||
|
||||
final List<SliceAction> toggles = metadata.getToggles();
|
||||
assertThat(toggles).hasSize(1);
|
||||
|
||||
final SliceAction primaryAction = metadata.getPrimaryAction();
|
||||
final IconCompat expectedToggleIcon = IconCompat.createWithResource(mContext,
|
||||
R.drawable.ic_network_cell);
|
||||
assertThat(primaryAction.getIcon().toString()).isEqualTo(expectedToggleIcon.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleUriChange_turnedOn_updatesMobileData() {
|
||||
doReturn(false).when(mMobileDataSlice).isAirplaneModeEnabled();
|
||||
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
|
||||
final Intent intent = mMobileDataSlice.getIntent();
|
||||
intent.putExtra(android.app.slice.Slice.EXTRA_TOGGLE_STATE, true);
|
||||
|
||||
mMobileDataSlice.onNotifyChange(intent);
|
||||
|
||||
verify(mTelephonyManager).setDataEnabled(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleUriChange_turnedOff_updatesMobileData() {
|
||||
doReturn(false).when(mMobileDataSlice).isAirplaneModeEnabled();
|
||||
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
|
||||
final Intent intent = mMobileDataSlice.getIntent();
|
||||
intent.putExtra(android.app.slice.Slice.EXTRA_TOGGLE_STATE, false);
|
||||
|
||||
mMobileDataSlice.onNotifyChange(intent);
|
||||
|
||||
verify(mTelephonyManager).setDataEnabled(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleUriChange_turnedOff_airplaneModeOn_mobileDataDoesNotUpdate() {
|
||||
doReturn(true).when(mMobileDataSlice).isAirplaneModeEnabled();
|
||||
doReturn(mSubscriptionInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(SUB_ID);
|
||||
final Intent intent = mMobileDataSlice.getIntent();
|
||||
intent.putExtra(android.app.slice.Slice.EXTRA_TOGGLE_STATE, false);
|
||||
|
||||
mMobileDataSlice.onNotifyChange(intent);
|
||||
|
||||
verify(mTelephonyManager, times(0)).setDataEnabled(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAirplaneModeEnabled_correctlyReturnsTrue() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 1);
|
||||
|
||||
final boolean isAirplaneModeEnabled = mMobileDataSlice.isAirplaneModeEnabled();
|
||||
|
||||
assertThat(isAirplaneModeEnabled).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isAirplaneModeEnabled_correctlyReturnsFalse() {
|
||||
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, 0);
|
||||
|
||||
final boolean isAirplaneModeEnabled = mMobileDataSlice.isAirplaneModeEnabled();
|
||||
|
||||
assertThat(isAirplaneModeEnabled).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isMobileDataEnabled_mobileDataEnabled() {
|
||||
final boolean seed = true;
|
||||
doReturn(seed).when(mTelephonyManager).isDataEnabled();
|
||||
|
||||
final boolean isMobileDataEnabled = mMobileDataSlice.isMobileDataEnabled();
|
||||
|
||||
assertThat(isMobileDataEnabled).isEqualTo(seed);
|
||||
}
|
||||
}
|
@@ -46,8 +46,10 @@ public class InternetConnectivityPanelTest {
|
||||
public void getSlices_containsNecessarySlices() {
|
||||
final List<Uri> uris = mPanel.getSlices();
|
||||
|
||||
assertThat(uris).containsExactly(CustomSliceRegistry.WIFI_SLICE_URI,
|
||||
CustomSliceRegistry.AIRPLANE_URI);
|
||||
assertThat(uris).containsExactly(
|
||||
CustomSliceRegistry.AIRPLANE_URI,
|
||||
CustomSliceRegistry.MOBILE_DATA_SLICE_URI,
|
||||
CustomSliceRegistry.WIFI_SLICE_URI);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -116,7 +116,8 @@ public class SettingsSliceProviderTest {
|
||||
|
||||
private static final List<Uri> SPECIAL_CASE_OEM_URIS = Arrays.asList(
|
||||
CustomSliceRegistry.ZEN_MODE_SLICE_URI,
|
||||
CustomSliceRegistry.FLASHLIGHT_SLICE_URI
|
||||
CustomSliceRegistry.FLASHLIGHT_SLICE_URI,
|
||||
CustomSliceRegistry.MOBILE_DATA_SLICE_URI
|
||||
);
|
||||
|
||||
@Before
|
||||
|
Reference in New Issue
Block a user