Merge changes from topic "Slice of Provider Model"
* changes: Slice of Provider Model: add slice structure The helper for slice of carrier and non-Carrier, used by ProviderModelSlice.
This commit is contained in:
committed by
Android (Google) Code Review
commit
a12003a9ac
@@ -0,0 +1,307 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Network;
|
||||
import android.net.NetworkCapabilities;
|
||||
import android.net.Uri;
|
||||
import android.os.PersistableBundle;
|
||||
import android.telephony.CarrierConfigManager;
|
||||
import android.telephony.ServiceState;
|
||||
import android.telephony.SubscriptionInfo;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.slice.Slice;
|
||||
import androidx.slice.builders.GridRowBuilder;
|
||||
import androidx.slice.builders.GridRowBuilder.CellBuilder;
|
||||
import androidx.slice.builders.ListBuilder;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.slices.CustomSliceable;
|
||||
import com.android.settings.testutils.ResourcesUtils;
|
||||
import com.android.settings.wifi.slice.WifiSliceItem;
|
||||
import com.android.wifitrackerlib.WifiEntry;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ProviderModelSliceHelperTest {
|
||||
private Context mContext;
|
||||
private MockProviderModelSliceHelper mProviderModelSliceHelper;
|
||||
private PersistableBundle mBundle;
|
||||
private Network mNetwork;
|
||||
private NetworkCapabilities mNetworkCapabilities;
|
||||
|
||||
@Mock
|
||||
private SubscriptionManager mSubscriptionManager;
|
||||
@Mock
|
||||
private CarrierConfigManager mCarrierConfigManager;
|
||||
@Mock
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
@Mock
|
||||
private TelephonyManager mTelephonyManager;
|
||||
@Mock
|
||||
private ServiceState mServiceState;
|
||||
@Mock
|
||||
private WifiSliceItem mWifiSliceItem1;
|
||||
@Mock
|
||||
private WifiSliceItem mWifiSliceItem2;
|
||||
@Mock
|
||||
private SubscriptionInfo mDefaultDataSubscriptionInfo;
|
||||
@Mock
|
||||
private Drawable mDrawableWithSignalStrength;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||
mBundle = new PersistableBundle();
|
||||
mNetwork = new Network(anyInt());
|
||||
|
||||
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
|
||||
when(mContext.getSystemService(CarrierConfigManager.class)).thenReturn(
|
||||
mCarrierConfigManager);
|
||||
when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
|
||||
when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
|
||||
when(mConnectivityManager.getActiveNetwork()).thenReturn(mNetwork);
|
||||
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
|
||||
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
|
||||
|
||||
TestCustomSliceable testCustomSliceable = new TestCustomSliceable();
|
||||
mProviderModelSliceHelper = new MockProviderModelSliceHelper(mContext, testCustomSliceable);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createMessageGridRow_inputTheResourceId_verifyTitle() {
|
||||
int messageResId = ResourcesUtils.getResourcesId(mContext, "string",
|
||||
"non_carrier_network_unavailable");
|
||||
CharSequence title = ResourcesUtils.getResourcesString(mContext,
|
||||
"non_carrier_network_unavailable");
|
||||
|
||||
GridRowBuilder testGridRow = mProviderModelSliceHelper.createMessageGridRow(messageResId);
|
||||
List<CellBuilder> cellItem = testGridRow.getCells();
|
||||
|
||||
assertThat(cellItem.get(0).getTitle()).isEqualTo(title);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectedWifiItem_inputListInvolveOneConnectedWifiItem_verifyReturnItem() {
|
||||
when(mWifiSliceItem1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED);
|
||||
when(mWifiSliceItem2.getConnectedState()).thenReturn(
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED);
|
||||
List<WifiSliceItem> wifiList = new ArrayList<>();
|
||||
wifiList.add(mWifiSliceItem1);
|
||||
wifiList.add(mWifiSliceItem2);
|
||||
|
||||
WifiSliceItem testItem = mProviderModelSliceHelper.getConnectedWifiItem(wifiList);
|
||||
|
||||
assertThat(testItem).isNotNull();
|
||||
assertEquals(mWifiSliceItem1, testItem);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectedWifiItem_inputListInvolveNoConnectedWifiItem_verifyReturnItem() {
|
||||
when(mWifiSliceItem1.getConnectedState()).thenReturn(
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED);
|
||||
when(mWifiSliceItem2.getConnectedState()).thenReturn(
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED);
|
||||
List<WifiSliceItem> wifiList = new ArrayList<>();
|
||||
wifiList.add(mWifiSliceItem1);
|
||||
wifiList.add(mWifiSliceItem2);
|
||||
|
||||
WifiSliceItem testItem = mProviderModelSliceHelper.getConnectedWifiItem(wifiList);
|
||||
|
||||
assertThat(testItem).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectedWifiItem_inputNull_verifyReturnItem() {
|
||||
List<WifiSliceItem> wifiList = null;
|
||||
|
||||
WifiSliceItem testItem = mProviderModelSliceHelper.getConnectedWifiItem(wifiList);
|
||||
|
||||
assertThat(testItem).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createCarrierRow_hasDefaultDataSubscriptionId_verifyTitle() {
|
||||
String expectDisplayName = "Name1";
|
||||
int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
|
||||
when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
|
||||
mDefaultDataSubscriptionInfo);
|
||||
when(mDefaultDataSubscriptionInfo.getDisplayName()).thenReturn(expectDisplayName);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
|
||||
mBundle.putBoolean(CarrierConfigManager.KEY_INFLATE_SIGNAL_STRENGTH_BOOL, false);
|
||||
|
||||
ListBuilder.RowBuilder testRowBuild = mProviderModelSliceHelper.createCarrierRow();
|
||||
|
||||
assertThat(testRowBuild.getTitle()).isEqualTo(expectDisplayName);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isNoCarrierData_mobileDataOnAndNoData_returnTrue() {
|
||||
when(mTelephonyManager.isDataEnabled()).thenReturn(true);
|
||||
when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
|
||||
when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
|
||||
|
||||
assertThat(mProviderModelSliceHelper.isNoCarrierData()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isNoCarrierData_mobileDataOffAndOutOfService_returnTrue() {
|
||||
when(mTelephonyManager.isDataEnabled()).thenReturn(false);
|
||||
when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
|
||||
when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
|
||||
|
||||
assertThat(mProviderModelSliceHelper.isNoCarrierData()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isNoCarrierData_mobileDataOnAndDataConnected_returnFalse() {
|
||||
when(mTelephonyManager.isDataEnabled()).thenReturn(true);
|
||||
when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_CONNECTED);
|
||||
when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
|
||||
|
||||
assertThat(mProviderModelSliceHelper.isNoCarrierData()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isNoCarrierData_mobileDataOffAndVoiceIsInService_returnFalse() {
|
||||
when(mTelephonyManager.isDataEnabled()).thenReturn(false);
|
||||
when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
|
||||
when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
|
||||
|
||||
assertThat(mProviderModelSliceHelper.isNoCarrierData()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getMobileDrawable_noCarrierData_getMobileDrawable() throws Throwable {
|
||||
when(mTelephonyManager.isDataEnabled()).thenReturn(false);
|
||||
when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_DISCONNECTED);
|
||||
when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE);
|
||||
int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
|
||||
when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
|
||||
mDefaultDataSubscriptionInfo);
|
||||
when(mConnectivityManager.getActiveNetwork()).thenReturn(null);
|
||||
Drawable expectDrawable = mock(Drawable.class);
|
||||
|
||||
assertThat(mProviderModelSliceHelper.getMobileDrawable(expectDrawable)).isEqualTo(
|
||||
expectDrawable);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getMobileDrawable_hasCarrierDataAndDataIsOnCellular_getMobileDrawable()
|
||||
throws Throwable {
|
||||
when(mTelephonyManager.isDataEnabled()).thenReturn(true);
|
||||
when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_CONNECTED);
|
||||
when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
|
||||
Drawable drawable = mock(Drawable.class);
|
||||
int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
|
||||
when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
|
||||
mDefaultDataSubscriptionInfo);
|
||||
addNetworkTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
|
||||
|
||||
assertThat(mProviderModelSliceHelper.getMobileDrawable(drawable)).isEqualTo(
|
||||
mDrawableWithSignalStrength);
|
||||
|
||||
verify(mDrawableWithSignalStrength).setTint(Utils.getColorAccentDefaultColor(mContext));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getMobileDrawable_hasCarrierDataAndDataIsOnWifi_getMobileDrawable()
|
||||
throws Throwable {
|
||||
when(mTelephonyManager.isDataEnabled()).thenReturn(true);
|
||||
when(mTelephonyManager.getDataState()).thenReturn(mTelephonyManager.DATA_CONNECTED);
|
||||
when(mTelephonyManager.getServiceState()).thenReturn(mServiceState);
|
||||
when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE);
|
||||
Drawable drawable = mock(Drawable.class);
|
||||
int defaultDataSubId = SubscriptionManager.getDefaultDataSubscriptionId();
|
||||
when(mSubscriptionManager.getActiveSubscriptionInfo(defaultDataSubId)).thenReturn(
|
||||
mDefaultDataSubscriptionInfo);
|
||||
addNetworkTransportType(NetworkCapabilities.TRANSPORT_WIFI);
|
||||
|
||||
assertThat(mProviderModelSliceHelper.getMobileDrawable(drawable)).isEqualTo(
|
||||
mDrawableWithSignalStrength);
|
||||
}
|
||||
|
||||
private void addNetworkTransportType(int networkType) {
|
||||
mNetworkCapabilities = new NetworkCapabilities().addTransportType(networkType);
|
||||
when(mConnectivityManager.getNetworkCapabilities(mNetwork)).thenReturn(
|
||||
mNetworkCapabilities);
|
||||
}
|
||||
|
||||
private class TestCustomSliceable implements CustomSliceable {
|
||||
TestCustomSliceable() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Slice getSlice() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Uri getUri() {
|
||||
return Uri.parse("content://android.settings.slices/action/provider_model");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Intent getIntent() {
|
||||
return new Intent();
|
||||
}
|
||||
}
|
||||
|
||||
private class MockProviderModelSliceHelper extends ProviderModelSliceHelper {
|
||||
MockProviderModelSliceHelper(Context context, CustomSliceable sliceable) {
|
||||
super(context, sliceable);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Drawable getDrawableWithSignalStrength() {
|
||||
return mDrawableWithSignalStrength;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,333 @@
|
||||
/*
|
||||
* 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;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.drawable.ColorDrawable;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Uri;
|
||||
import android.net.wifi.WifiManager;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.slice.Slice;
|
||||
import androidx.slice.SliceProvider;
|
||||
import androidx.slice.builders.GridRowBuilder;
|
||||
import androidx.slice.builders.ListBuilder;
|
||||
import androidx.slice.builders.SliceAction;
|
||||
import androidx.slice.widget.SliceLiveData;
|
||||
import androidx.test.annotation.UiThreadTest;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.network.telephony.NetworkProviderWorker;
|
||||
import com.android.settings.testutils.ResourcesUtils;
|
||||
import com.android.settings.wifi.slice.WifiSliceItem;
|
||||
import com.android.wifitrackerlib.WifiEntry;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ProviderModelSliceTest {
|
||||
private static final Uri PROVIDER_MODEL_SLICE_URI =
|
||||
Uri.parse("content://com.android.settings.slices/action/provider_model");
|
||||
private static final int MOCK_SLICE_LEVEL = 3;
|
||||
|
||||
private Context mContext;
|
||||
private MockProviderModelSlice mMockProviderModelSlice;
|
||||
List<WifiSliceItem> mWifiList = new ArrayList<>();
|
||||
private ListBuilder mListBuilder;
|
||||
private MockNetworkProviderWorker mMockNetworkProviderWorker;
|
||||
|
||||
@Mock
|
||||
private SubscriptionManager mSubscriptionManager;
|
||||
@Mock
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
@Mock
|
||||
private TelephonyManager mTelephonyManager;
|
||||
@Mock
|
||||
private WifiManager mWifiManager;
|
||||
@Mock
|
||||
private ProviderModelSliceHelper mProviderModelSliceHelper;
|
||||
@Mock
|
||||
private WifiSliceItem mMockWifiSliceItem1;
|
||||
@Mock
|
||||
private WifiSliceItem mMockWifiSliceItem2;
|
||||
@Mock
|
||||
private WifiSliceItem mMockWifiSliceItem3;
|
||||
@Mock
|
||||
ListBuilder.RowBuilder mMockCarrierRowBuild;
|
||||
@Mock
|
||||
ListBuilder.HeaderBuilder mMockHeader;
|
||||
@Mock
|
||||
GridRowBuilder mMockGridRowBuilderNonCarrierNetworkUnavailable;
|
||||
@Mock
|
||||
GridRowBuilder mMockGridRowBuilderAllNetworkUnavailable;
|
||||
|
||||
@Before
|
||||
@UiThreadTest
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||
|
||||
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
|
||||
when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
|
||||
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
|
||||
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
|
||||
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
|
||||
|
||||
|
||||
// Set-up specs for SliceMetadata.
|
||||
SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS);
|
||||
mMockNetworkProviderWorker = new MockNetworkProviderWorker(mContext,
|
||||
PROVIDER_MODEL_SLICE_URI);
|
||||
mMockProviderModelSlice = new MockProviderModelSlice(mContext, mMockNetworkProviderWorker);
|
||||
mListBuilder = spy(new ListBuilder(mContext, PROVIDER_MODEL_SLICE_URI,
|
||||
ListBuilder.INFINITY).setAccentColor(-1));
|
||||
when(mProviderModelSliceHelper.createListBuilder(PROVIDER_MODEL_SLICE_URI)).thenReturn(
|
||||
mListBuilder);
|
||||
|
||||
mWifiList = new ArrayList<>();
|
||||
mMockNetworkProviderWorker.updateSelfResults(mWifiList);
|
||||
|
||||
mockBuilder();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_noWorkerAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() {
|
||||
mWifiList.clear();
|
||||
mMockProviderModelSlice = new MockProviderModelSlice(mContext, null);
|
||||
mockHelperCondition(false, false, false, null);
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(1)).setHeader(mMockHeader);
|
||||
verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_noWifiAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() {
|
||||
mWifiList.clear();
|
||||
mMockNetworkProviderWorker.updateSelfResults(null);
|
||||
mockHelperCondition(false, false, false, null);
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(1)).setHeader(mMockHeader);
|
||||
verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_noWifiAndHasCarrierNoData_oneCarrierOneGridRowWithAllNetworkUnavailable() {
|
||||
mWifiList.clear();
|
||||
mMockNetworkProviderWorker.updateSelfResults(null);
|
||||
mockHelperCondition(false, true, true, null);
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
|
||||
verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_noWifiAndNoCarrier_oneCarrierOneGridRowWithNonCarrierNetworkUnavailable() {
|
||||
mWifiList.clear();
|
||||
mMockProviderModelSlice = new MockProviderModelSlice(mContext, null);
|
||||
mockHelperCondition(false, true, false, null);
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
|
||||
verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderNonCarrierNetworkUnavailable);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveTwoWifiAndOneCarrier_getCarrierAndTwoWiFi() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
|
||||
mWifiList.add(mMockWifiSliceItem1);
|
||||
mockWifiItemCondition(mMockWifiSliceItem2, "wifi2", "wifi2",
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
|
||||
mWifiList.add(mMockWifiSliceItem2);
|
||||
mMockNetworkProviderWorker.updateSelfResults(mWifiList);
|
||||
mockHelperCondition(false, true, false, mWifiList.get(0));
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild);
|
||||
verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getTwoRow() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true);
|
||||
mWifiList.add(mMockWifiSliceItem1);
|
||||
mockWifiItemCondition(mMockWifiSliceItem2, "wifi2", "wifi2",
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
|
||||
mWifiList.add(mMockWifiSliceItem2);
|
||||
mockWifiItemCondition(mMockWifiSliceItem3, "wifi3", "wifi3",
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi3_key", true);
|
||||
mWifiList.add(mMockWifiSliceItem3);
|
||||
mMockNetworkProviderWorker.updateSelfResults(mWifiList);
|
||||
mockHelperCondition(false, false, false, mWifiList.get(0));
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getTwoRow() {
|
||||
mWifiList.clear();
|
||||
mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1",
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true);
|
||||
mWifiList.add(mMockWifiSliceItem1);
|
||||
mockWifiItemCondition(mMockWifiSliceItem2, "wifi2", "wifi2",
|
||||
WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi2_key", true);
|
||||
mWifiList.add(mMockWifiSliceItem2);
|
||||
mMockNetworkProviderWorker.updateSelfResults(mWifiList);
|
||||
mockHelperCondition(false, false, false, null);
|
||||
|
||||
final Slice slice = mMockProviderModelSlice.getSlice();
|
||||
|
||||
assertThat(slice).isNotNull();
|
||||
verify(mListBuilder, times(2)).addRow(any(ListBuilder.RowBuilder.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void providerModelSlice_hasCorrectUri() {
|
||||
assertThat(mMockProviderModelSlice.getUri()).isEqualTo(PROVIDER_MODEL_SLICE_URI);
|
||||
}
|
||||
|
||||
private void mockHelperCondition(boolean airplaneMode, boolean hasCarrier,
|
||||
boolean isNoCarrierData, WifiSliceItem connectedWifiItem) {
|
||||
when(mProviderModelSliceHelper.isAirplaneModeEnabled()).thenReturn(airplaneMode);
|
||||
when(mProviderModelSliceHelper.hasCarrier()).thenReturn(hasCarrier);
|
||||
when(mProviderModelSliceHelper.isNoCarrierData()).thenReturn(isNoCarrierData);
|
||||
when(mProviderModelSliceHelper.getConnectedWifiItem(any())).thenReturn(connectedWifiItem);
|
||||
}
|
||||
|
||||
private void mockWifiItemCondition(WifiSliceItem mockWifiItem, String title, String summary,
|
||||
int connectedState, String key, boolean shouldEditBeforeConnect) {
|
||||
when(mockWifiItem.getTitle()).thenReturn(title);
|
||||
when(mockWifiItem.getSummary()).thenReturn(summary);
|
||||
when(mockWifiItem.getConnectedState()).thenReturn(connectedState);
|
||||
when(mockWifiItem.getLevel()).thenReturn(MOCK_SLICE_LEVEL);
|
||||
when(mockWifiItem.getKey()).thenReturn(key);
|
||||
when(mockWifiItem.shouldEditBeforeConnect()).thenReturn(shouldEditBeforeConnect);
|
||||
}
|
||||
|
||||
private void mockBuilder() {
|
||||
SliceAction mockSliceAction = getPrimarySliceAction();
|
||||
when(mMockHeader.getTitle()).thenReturn("mockHeader");
|
||||
when(mMockHeader.getPrimaryAction()).thenReturn(mockSliceAction);
|
||||
when(mProviderModelSliceHelper.createHeader()).thenReturn(mMockHeader);
|
||||
|
||||
int resId = ResourcesUtils.getResourcesId(mContext, "string",
|
||||
"non_carrier_network_unavailable");
|
||||
when(mProviderModelSliceHelper.createMessageGridRow(resId)).thenReturn(
|
||||
mMockGridRowBuilderNonCarrierNetworkUnavailable);
|
||||
resId = ResourcesUtils.getResourcesId(mContext, "string",
|
||||
"all_network_unavailable");
|
||||
when(mProviderModelSliceHelper.createMessageGridRow(resId)).thenReturn(
|
||||
mMockGridRowBuilderAllNetworkUnavailable);
|
||||
|
||||
when(mMockCarrierRowBuild.getTitle()).thenReturn("mockRow");
|
||||
when(mMockCarrierRowBuild.getPrimaryAction()).thenReturn(mockSliceAction);
|
||||
when(mProviderModelSliceHelper.createCarrierRow()).thenReturn(mMockCarrierRowBuild);
|
||||
}
|
||||
|
||||
private SliceAction getPrimarySliceAction() {
|
||||
return SliceAction.createDeeplink(
|
||||
getPrimaryAction(),
|
||||
Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT)),
|
||||
ListBuilder.ICON_IMAGE,
|
||||
ResourcesUtils.getResourcesString(mContext, "summary_placeholder"));
|
||||
}
|
||||
|
||||
private PendingIntent getPrimaryAction() {
|
||||
final Intent intent = new Intent("android.settings.NETWORK_PROVIDER_SETTINGS")
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
return PendingIntent.getActivity(mContext, 0 /* requestCode */,
|
||||
intent, PendingIntent.FLAG_IMMUTABLE /* flags */);
|
||||
}
|
||||
|
||||
public class MockNetworkProviderWorker extends NetworkProviderWorker {
|
||||
MockNetworkProviderWorker(Context context, Uri uri) {
|
||||
super(context, uri);
|
||||
}
|
||||
|
||||
public void updateSelfResults(List<WifiSliceItem> results) {
|
||||
this.updateResults(results);
|
||||
}
|
||||
}
|
||||
|
||||
public class MockProviderModelSlice extends ProviderModelSlice {
|
||||
private MockNetworkProviderWorker mNetworkProviderWorker;
|
||||
|
||||
MockProviderModelSlice(Context context, MockNetworkProviderWorker networkProviderWorker) {
|
||||
super(context);
|
||||
mNetworkProviderWorker = networkProviderWorker;
|
||||
}
|
||||
|
||||
@Override
|
||||
ProviderModelSliceHelper getHelper() {
|
||||
return mProviderModelSliceHelper;
|
||||
}
|
||||
|
||||
@Override
|
||||
NetworkProviderWorker getWorker() {
|
||||
return mNetworkProviderWorker;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,264 @@
|
||||
/*
|
||||
* 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.telephony;
|
||||
|
||||
import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyInt;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.Context;
|
||||
import android.net.ConnectivityManager;
|
||||
import android.net.Uri;
|
||||
import android.telephony.ServiceState;
|
||||
import android.telephony.SubscriptionManager;
|
||||
import android.telephony.TelephonyDisplayInfo;
|
||||
import android.telephony.TelephonyManager;
|
||||
|
||||
import androidx.lifecycle.Lifecycle;
|
||||
import androidx.test.annotation.UiThreadTest;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||
|
||||
import com.android.wifitrackerlib.WifiEntry;
|
||||
import com.android.wifitrackerlib.WifiPickerTracker;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class NetworkProviderWorkerTest {
|
||||
private Context mContext;
|
||||
private MockNetworkProviderWorker mMockNetworkProviderWorker;
|
||||
|
||||
@Mock
|
||||
WifiPickerTracker mMockWifiPickerTracker;
|
||||
@Mock
|
||||
private SubscriptionManager mSubscriptionManager;
|
||||
@Mock
|
||||
private ConnectivityManager mConnectivityManager;
|
||||
@Mock
|
||||
private TelephonyManager mTelephonyManager;
|
||||
|
||||
@Before
|
||||
@UiThreadTest
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||
|
||||
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
|
||||
when(mContext.getSystemService(ConnectivityManager.class)).thenReturn(mConnectivityManager);
|
||||
when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
|
||||
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager);
|
||||
|
||||
mMockNetworkProviderWorker = new MockNetworkProviderWorker(mContext,
|
||||
PROVIDER_MODEL_SLICE_URI);
|
||||
mMockNetworkProviderWorker.setWifiPickerTracker(mMockWifiPickerTracker);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onConstructor_shouldBeInCreatedState() {
|
||||
assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
|
||||
.isEqualTo(Lifecycle.State.CREATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onSlicePinned_shouldBeInResumedState() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
|
||||
.isEqualTo(Lifecycle.State.RESUMED);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onSliceUnpinned_shouldBeInCreatedState() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.onSliceUnpinned();
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
|
||||
.isEqualTo(Lifecycle.State.CREATED);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void close_shouldBeInDestroyedState() {
|
||||
mMockNetworkProviderWorker.close();
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.getLifecycle().getCurrentState())
|
||||
.isEqualTo(Lifecycle.State.DESTROYED);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getWifiEntry_connectedWifiKey_shouldGetConnectedWifi() {
|
||||
final String key = "key";
|
||||
final WifiEntry connectedWifiEntry = mock(WifiEntry.class);
|
||||
when(connectedWifiEntry.getKey()).thenReturn(key);
|
||||
when(mMockWifiPickerTracker.getConnectedWifiEntry()).thenReturn(connectedWifiEntry);
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.getWifiEntry(key)).isEqualTo(connectedWifiEntry);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void getWifiEntry_reachableWifiKey_shouldGetReachableWifi() {
|
||||
final String key = "key";
|
||||
final WifiEntry reachableWifiEntry = mock(WifiEntry.class);
|
||||
when(reachableWifiEntry.getKey()).thenReturn(key);
|
||||
when(mMockWifiPickerTracker.getWifiEntries()).thenReturn(Arrays.asList(reachableWifiEntry));
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.getWifiEntry(key)).isEqualTo(reachableWifiEntry);
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onSubscriptionsChanged_notifySubscriptionChanged_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.onSubscriptionsChanged();
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onAirplaneModeChanged_airplaneModeOn_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.onAirplaneModeChanged(false);
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onAirplaneModeChanged_airplaneModeOff_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.onAirplaneModeChanged(true);
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onSignalStrengthChanged_notifySignalStrengthChanged_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.onSignalStrengthChanged();
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onMobileDataEnabledChange_notifyMobileDataEnabledChanged_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.onMobileDataEnabledChange();
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onDataConnectivityChange_notifyDataConnectivityChanged_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.onDataConnectivityChange();
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onServiceStateChanged_notifyPhoneStateListener_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.mPhoneStateListener.onServiceStateChanged(new ServiceState());
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onActiveDataSubscriptionIdChanged_notifyPhoneStateListener_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.mPhoneStateListener.onActiveDataSubscriptionIdChanged(1);
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
@UiThreadTest
|
||||
public void onDisplayInfoChanged_notifyPhoneStateListener_callUpdateSlice() {
|
||||
mMockNetworkProviderWorker.onSlicePinned();
|
||||
mMockNetworkProviderWorker.receiveNotification(false);
|
||||
|
||||
mMockNetworkProviderWorker.mPhoneStateListener.onDisplayInfoChanged(
|
||||
new TelephonyDisplayInfo(14, 0));
|
||||
|
||||
assertThat(mMockNetworkProviderWorker.hasNotification()).isTrue();
|
||||
}
|
||||
|
||||
public class MockNetworkProviderWorker extends NetworkProviderWorker {
|
||||
private boolean mHasNotification = false;
|
||||
|
||||
MockNetworkProviderWorker(Context context, Uri uri) {
|
||||
super(context, uri);
|
||||
}
|
||||
|
||||
public void receiveNotification(boolean inputValue) {
|
||||
mHasNotification = inputValue;
|
||||
}
|
||||
|
||||
public boolean hasNotification() {
|
||||
return mHasNotification;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSlice() {
|
||||
super.updateSlice();
|
||||
receiveNotification(true);
|
||||
}
|
||||
|
||||
public void setWifiPickerTracker(WifiPickerTracker wifiPickerTracker) {
|
||||
mWifiPickerTracker = wifiPickerTracker;
|
||||
}
|
||||
}
|
||||
}
|
@@ -17,15 +17,43 @@ package com.android.settings.testutils;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
/**
|
||||
* Test util to provide the correct resources.
|
||||
*/
|
||||
public final class ResourcesUtils {
|
||||
/**
|
||||
* Return a resource identifier for the given resource name.
|
||||
* @param context Context to use.
|
||||
* @param type Optional default resource type to find, if "type/" is not included in the name.
|
||||
* Can be null to require an explicit type.
|
||||
* @param name The name of the desired resource.
|
||||
* @return The associated resource identifier. Returns 0 if no such resource was found.
|
||||
* (0 is not a valid resource ID.)
|
||||
*/
|
||||
public static int getResourcesId(Context context, String type, String name) {
|
||||
return context.getResources().getIdentifier(name, type, context.getPackageName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a localized string from the application's package's default string table.
|
||||
* @param context Context to use.
|
||||
* @param name The name of the desired resource.
|
||||
* @return The string data associated with the resource, stripped of styled text information.
|
||||
*/
|
||||
public static String getResourcesString(Context context, String name) {
|
||||
return context.getResources().getString(getResourcesId(context, "string", name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the string value associated with a particular neame of resource,
|
||||
* substituting the format arguments as defined in {@link java.util.Formatter}
|
||||
* and {@link java.lang.String#format}. It will be stripped of any styled text
|
||||
* information.
|
||||
* @param context Context to use.
|
||||
* @param name The name of the desired resource.
|
||||
* @param value The format arguments that will be used for substitution.
|
||||
* @return The string data associated with the resource, stripped of styled text information.
|
||||
*/
|
||||
public static String getResourcesString(Context context, String name, Object... value) {
|
||||
return context.getResources().getString(getResourcesId(context, "string", name), value);
|
||||
}
|
||||
|
Reference in New Issue
Block a user