Merge "Change title to aspect ratio (experimental)" into main
diff --git a/aconfig/settings_connecteddevice_flag_declarations.aconfig b/aconfig/settings_connecteddevice_flag_declarations.aconfig
index db42fff..eda2de6 100644
--- a/aconfig/settings_connecteddevice_flag_declarations.aconfig
+++ b/aconfig/settings_connecteddevice_flag_declarations.aconfig
@@ -4,5 +4,5 @@
name: "enable_subsequent_pair_settings_integration"
namespace: "pixel_cross_device_control"
description: "Gates whether to enable subsequent pair Settings integration."
- bug: "296507968"
+ bug: "299405720"
}
diff --git a/src/com/android/settings/connecteddevice/fastpair/FastPairDevicePreferenceController.java b/src/com/android/settings/connecteddevice/fastpair/FastPairDevicePreferenceController.java
index 47b2dae..6a5b6b9 100644
--- a/src/com/android/settings/connecteddevice/fastpair/FastPairDevicePreferenceController.java
+++ b/src/com/android/settings/connecteddevice/fastpair/FastPairDevicePreferenceController.java
@@ -142,7 +142,7 @@
// The insertion point is defined as the point at which the key would be inserted into the
// list: the index of the first element greater than the key, or list.size() if all elements
// in the list are less than the specified key.
- if (idx > 0) {
+ if (idx >= 0) {
if (DEBUG) {
Log.d(TAG, "onDeviceAdd receives duplicate preference. Ignore.");
}
diff --git a/src/com/android/settings/datausage/BillingCyclePreference.java b/src/com/android/settings/datausage/BillingCyclePreference.java
deleted file mode 100644
index 1bd2be8..0000000
--- a/src/com/android/settings/datausage/BillingCyclePreference.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2016 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.datausage;
-
-import android.app.settings.SettingsEnums;
-import android.content.Context;
-import android.content.Intent;
-import android.net.NetworkTemplate;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.telephony.TelephonyManager;
-import android.telephony.data.ApnSetting;
-import android.util.AttributeSet;
-
-import androidx.preference.Preference;
-
-import com.android.settings.R;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.network.MobileDataEnabledListener;
-
-/**
- * Preference which displays billing cycle of subscription
- */
-public class BillingCyclePreference extends Preference
- implements TemplatePreference, MobileDataEnabledListener.Client {
-
- private NetworkTemplate mTemplate;
- private NetworkServices mServices;
- private int mSubId;
- private MobileDataEnabledListener mListener;
-
- /**
- * Preference constructor
- *
- * @param context Context of preference
- * @param arrts The attributes of the XML tag that is inflating the preference
- */
- public BillingCyclePreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- mListener = new MobileDataEnabledListener(context, this);
- }
-
- @Override
- public void onAttached() {
- super.onAttached();
- mListener.start(mSubId);
- }
-
- @Override
- public void onDetached() {
- mListener.stop();
- super.onDetached();
- }
-
- @Override
- public void setTemplate(NetworkTemplate template, int subId,
- NetworkServices services) {
- mTemplate = template;
- mSubId = subId;
- mServices = services;
- setSummary(null);
-
- setIntent(getIntent());
- }
-
- private void updateEnabled() {
- try {
- setEnabled(mServices.mNetworkService.isBandwidthControlEnabled()
- && mServices.mTelephonyManager.createForSubscriptionId(mSubId)
- .isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER)
- && mServices.mUserManager.isAdminUser());
- } catch (RemoteException e) {
- setEnabled(false);
- }
- }
-
- @Override
- public Intent getIntent() {
- final Bundle args = new Bundle();
- args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
- return new SubSettingLauncher(getContext())
- .setDestination(BillingCycleSettings.class.getName())
- .setArguments(args)
- .setTitleRes(R.string.billing_cycle)
- .setSourceMetricsCategory(SettingsEnums.PAGE_UNKNOWN)
- .toIntent();
- }
-
- /**
- * Implementation of {@code MobileDataEnabledListener.Client}
- */
- public void onMobileDataEnabledChange() {
- updateEnabled();
- }
-}
diff --git a/src/com/android/settings/datausage/BillingCyclePreference.kt b/src/com/android/settings/datausage/BillingCyclePreference.kt
new file mode 100644
index 0000000..05066be
--- /dev/null
+++ b/src/com/android/settings/datausage/BillingCyclePreference.kt
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2023 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.datausage
+
+import android.app.settings.SettingsEnums
+import android.content.Context
+import android.content.Intent
+import android.net.NetworkTemplate
+import android.os.Bundle
+import android.util.AttributeSet
+import androidx.preference.Preference
+import com.android.settings.R
+import com.android.settings.core.SubSettingLauncher
+import com.android.settings.datausage.lib.BillingCycleRepository
+import com.android.settings.network.MobileDataEnabledListener
+
+/**
+ * Preference which displays billing cycle of subscription
+ *
+ * @param context Context of preference
+ * @param attrs The attributes of the XML tag that is inflating the preference
+ */
+class BillingCyclePreference @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet?,
+ private val repository: BillingCycleRepository = BillingCycleRepository(context),
+) : Preference(context, attrs), TemplatePreference {
+ private lateinit var template: NetworkTemplate
+ private var subId = 0
+
+ private val listener = MobileDataEnabledListener(context) {
+ updateEnabled()
+ }
+
+ override fun setTemplate(template: NetworkTemplate, subId: Int) {
+ this.template = template
+ this.subId = subId
+ summary = null
+ updateEnabled()
+ }
+
+ override fun onAttached() {
+ super.onAttached()
+ listener.start(subId)
+ }
+
+ override fun onDetached() {
+ listener.stop()
+ super.onDetached()
+ }
+
+ private fun updateEnabled() {
+ isEnabled = repository.isModifiable(subId)
+ }
+
+ override fun getIntent(): Intent {
+ val args = Bundle().apply {
+ putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, template)
+ }
+ return SubSettingLauncher(context).apply {
+ setDestination(BillingCycleSettings::class.java.name)
+ setArguments(args)
+ setTitleRes(R.string.billing_cycle)
+ setSourceMetricsCategory(SettingsEnums.PAGE_UNKNOWN)
+ }.toIntent()
+ }
+}
diff --git a/src/com/android/settings/datausage/BillingCyclePreferenceController.java b/src/com/android/settings/datausage/BillingCyclePreferenceController.java
index 73216ab..8b55585 100644
--- a/src/com/android/settings/datausage/BillingCyclePreferenceController.java
+++ b/src/com/android/settings/datausage/BillingCyclePreferenceController.java
@@ -17,20 +17,12 @@
package com.android.settings.datausage;
import android.content.Context;
-import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
-import android.os.INetworkManagementService;
-import android.os.ServiceManager;
-import android.os.UserManager;
-import android.telephony.SubscriptionManager;
-import android.telephony.TelephonyManager;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.BasePreferenceController;
-import com.android.settings.datausage.DataUsageUtils;
import com.android.settings.datausage.lib.DataUsageLib;
-import com.android.settingslib.NetworkPolicyEditor;
public class BillingCyclePreferenceController extends BasePreferenceController {
private int mSubscriptionId;
@@ -48,18 +40,9 @@
super.displayPreference(screen);
BillingCyclePreference preference = screen.findPreference(getPreferenceKey());
- TemplatePreference.NetworkServices services = new TemplatePreference.NetworkServices();
- services.mNetworkService = INetworkManagementService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE));
- services.mPolicyManager = mContext.getSystemService(NetworkPolicyManager.class);
- services.mPolicyEditor = new NetworkPolicyEditor(services.mPolicyManager);
- services.mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
- services.mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
- services.mUserManager = mContext.getSystemService(UserManager.class);
-
NetworkTemplate template = DataUsageLib.getMobileTemplate(mContext, mSubscriptionId);
- preference.setTemplate(template, mSubscriptionId, services);
+ preference.setTemplate(template, mSubscriptionId);
}
@Override
diff --git a/src/com/android/settings/datausage/CellDataPreference.java b/src/com/android/settings/datausage/CellDataPreference.java
index aa763ae..9374217 100644
--- a/src/com/android/settings/datausage/CellDataPreference.java
+++ b/src/com/android/settings/datausage/CellDataPreference.java
@@ -99,7 +99,7 @@
}
@Override
- public void setTemplate(NetworkTemplate template, int subId, NetworkServices services) {
+ public void setTemplate(NetworkTemplate template, int subId) {
if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
throw new IllegalArgumentException("CellDataPreference needs a SubscriptionInfo");
}
diff --git a/src/com/android/settings/datausage/DataUsagePreference.java b/src/com/android/settings/datausage/DataUsagePreference.java
index 0ed0ad3..0f7bf58 100644
--- a/src/com/android/settings/datausage/DataUsagePreference.java
+++ b/src/com/android/settings/datausage/DataUsagePreference.java
@@ -49,7 +49,7 @@
}
@Override
- public void setTemplate(NetworkTemplate template, int subId, NetworkServices services) {
+ public void setTemplate(NetworkTemplate template, int subId) {
mTemplate = template;
mSubId = subId;
final DataUsageController controller = getDataUsageController();
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index d176402..6966611 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -183,9 +183,8 @@
private void addMobileSection(int subId, SubscriptionInfo subInfo) {
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
inflatePreferences(R.xml.data_usage_cellular);
- category.setTemplate(DataUsageLib.getMobileTemplate(getContext(), subId),
- subId, services);
- category.pushTemplates(services);
+ category.setTemplate(DataUsageLib.getMobileTemplate(getContext(), subId), subId);
+ category.pushTemplates();
final CharSequence displayName = SubscriptionUtil.getUniqueSubscriptionDisplayName(
subInfo, getContext());
if (subInfo != null && !TextUtils.isEmpty(displayName)) {
@@ -198,15 +197,14 @@
void addWifiSection() {
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
inflatePreferences(R.xml.data_usage_wifi);
- category.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build(),
- 0, services);
+ category.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI).build(), 0);
}
private void addEthernetSection() {
TemplatePreferenceCategory category = (TemplatePreferenceCategory)
inflatePreferences(R.xml.data_usage_ethernet);
- category.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build(),
- 0, services);
+ category.setTemplate(
+ new NetworkTemplate.Builder(NetworkTemplate.MATCH_ETHERNET).build(), 0);
}
private Preference inflatePreferences(int resId) {
@@ -259,10 +257,10 @@
private void updateState() {
PreferenceScreen screen = getPreferenceScreen();
for (int i = 1; i < screen.getPreferenceCount(); i++) {
- Preference currentPreference = screen.getPreference(i);
- if (currentPreference instanceof TemplatePreferenceCategory) {
- ((TemplatePreferenceCategory) currentPreference).pushTemplates(services);
- }
+ Preference currentPreference = screen.getPreference(i);
+ if (currentPreference instanceof TemplatePreferenceCategory) {
+ ((TemplatePreferenceCategory) currentPreference).pushTemplates();
+ }
}
}
diff --git a/src/com/android/settings/datausage/NetworkRestrictionsPreference.java b/src/com/android/settings/datausage/NetworkRestrictionsPreference.java
deleted file mode 100644
index 9afc0c3..0000000
--- a/src/com/android/settings/datausage/NetworkRestrictionsPreference.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2016 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.datausage;
-
-import android.content.Context;
-import android.net.NetworkTemplate;
-import android.util.AttributeSet;
-
-import androidx.preference.Preference;
-
-public class NetworkRestrictionsPreference extends Preference implements TemplatePreference {
-
- public NetworkRestrictionsPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- @Override
- public void setTemplate(NetworkTemplate template, int subId,
- NetworkServices services) {
- // TODO: Summary
- }
-}
diff --git a/src/com/android/settings/datausage/TemplatePreference.java b/src/com/android/settings/datausage/TemplatePreference.java
index 43dda0a..6182229 100644
--- a/src/com/android/settings/datausage/TemplatePreference.java
+++ b/src/com/android/settings/datausage/TemplatePreference.java
@@ -25,7 +25,8 @@
public interface TemplatePreference {
- void setTemplate(NetworkTemplate template, int subId, NetworkServices services);
+ /** Sets the network template. */
+ void setTemplate(NetworkTemplate template, int subId);
class NetworkServices {
INetworkManagementService mNetworkService;
diff --git a/src/com/android/settings/datausage/TemplatePreferenceCategory.java b/src/com/android/settings/datausage/TemplatePreferenceCategory.java
index d26b9b1..9173676 100644
--- a/src/com/android/settings/datausage/TemplatePreferenceCategory.java
+++ b/src/com/android/settings/datausage/TemplatePreferenceCategory.java
@@ -31,8 +31,7 @@
}
@Override
- public void setTemplate(NetworkTemplate template, int subId,
- NetworkServices services) {
+ public void setTemplate(NetworkTemplate template, int subId) {
mTemplate = template;
mSubId = subId;
}
@@ -46,12 +45,13 @@
return super.addPreference(preference);
}
- public void pushTemplates(NetworkServices services) {
+ /** Pushes the templates. */
+ public void pushTemplates() {
if (mTemplate == null) {
throw new RuntimeException("null mTemplate for " + getKey());
}
for (int i = 0; i < getPreferenceCount(); i++) {
- ((TemplatePreference) getPreference(i)).setTemplate(mTemplate, mSubId, services);
+ ((TemplatePreference) getPreference(i)).setTemplate(mTemplate, mSubId);
}
}
diff --git a/src/com/android/settings/datausage/lib/BillingCycleRepository.kt b/src/com/android/settings/datausage/lib/BillingCycleRepository.kt
new file mode 100644
index 0000000..779ae4a
--- /dev/null
+++ b/src/com/android/settings/datausage/lib/BillingCycleRepository.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2023 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.datausage.lib
+
+import android.content.Context
+import android.os.INetworkManagementService
+import android.os.ServiceManager
+import android.telephony.TelephonyManager
+import android.util.Log
+import com.android.settingslib.spaprivileged.framework.common.userManager
+
+class BillingCycleRepository(
+ context: Context,
+ private val networkService: INetworkManagementService =
+ INetworkManagementService.Stub.asInterface(
+ ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)
+ ),
+) {
+ private val userManager = context.userManager
+ private val telephonyManager = context.getSystemService(TelephonyManager::class.java)!!
+
+ fun isModifiable(subId: Int): Boolean =
+ isBandwidthControlEnabled() && userManager.isAdminUser && isDataEnabled(subId)
+
+ fun isBandwidthControlEnabled(): Boolean = try {
+ networkService.isBandwidthControlEnabled
+ } catch (e: Exception) {
+ Log.w(TAG, "problem talking with INetworkManagementService: ", e)
+ false
+ }
+
+ private fun isDataEnabled(subId: Int): Boolean =
+ telephonyManager.createForSubscriptionId(subId)
+ .isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER)
+
+ companion object {
+ private const val TAG = "BillingCycleRepository"
+ }
+}
diff --git a/src/com/android/settings/network/NetworkProviderSettings.java b/src/com/android/settings/network/NetworkProviderSettings.java
index ee398a4..f2688c6 100644
--- a/src/com/android/settings/network/NetworkProviderSettings.java
+++ b/src/com/android/settings/network/NetworkProviderSettings.java
@@ -329,7 +329,7 @@
mDataUsagePreference = findPreference(PREF_KEY_DATA_USAGE);
mDataUsagePreference.setVisible(DataUsageUtils.hasWifiRadio(getContext()));
mDataUsagePreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI)
- .build(), 0 /*subId*/, null /*service*/);
+ .build(), 0 /*subId*/);
mResetInternetPreference = findPreference(PREF_KEY_RESET_INTERNET);
if (mResetInternetPreference != null) {
mResetInternetPreference.setVisible(false);
diff --git a/src/com/android/settings/network/apn/ApnEditPageProvider.kt b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
index 756d90f..90d96c6 100644
--- a/src/com/android/settings/network/apn/ApnEditPageProvider.kt
+++ b/src/com/android/settings/network/apn/ApnEditPageProvider.kt
@@ -148,13 +148,13 @@
stringResource(R.string.apn_mnc),
enabled = apnData.mncEnabled
) { apnData = apnData.copy(mnc = it) }
+ // Warning: apnProtocol, apnRoaming, mvnoType string2Int
SettingsExposedDropdownMenuBox(
- label = stringResource(R.string.apn_auth_type),
- options = authTypeOptions,
- selectedOptionText =
- authTypeOptions.getOrElse(apnData.authType) { "" },
- enabled = apnData.authTypeEnabled,
- ) { apnData = apnData.copy(authType = authTypeOptions.indexOf(it)) }
+ stringResource(R.string.apn_auth_type),
+ authTypeOptions,
+ apnData.authType,
+ apnData.authTypeEnabled,
+ ) { apnData = apnData.copy(authType = it) }
SettingsOutlinedTextField(
apnData.apnType,
stringResource(R.string.apn_type),
diff --git a/src/com/android/settings/network/apn/ApnStatus.kt b/src/com/android/settings/network/apn/ApnStatus.kt
index 8a2d613..7f4c297 100644
--- a/src/com/android/settings/network/apn/ApnStatus.kt
+++ b/src/com/android/settings/network/apn/ApnStatus.kt
@@ -34,11 +34,11 @@
val mnc: String = "",
val authType: Int = -1,
val apnType: String = "",
- val apnProtocol: String = "",
- val apnRoaming: String = "",
+ val apnProtocol: Int = -1,
+ val apnRoaming: Int = -1,
val apnEnable: Boolean = true,
val bearer: Int = 0,
- val mvnoType: String = "",
+ val mvnoType: Int = -1,
var mvnoValue: String = "",
val bearerBitmask: Int = 0,
val edited: Int = Telephony.Carriers.USER_EDITED,
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
index 02f683a..4db2fe0 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsagePreferenceTest.java
@@ -61,7 +61,7 @@
mPreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
.setMeteredness(NetworkStats.METERED_YES).build(),
- 5 /* subId */, null /* services */);
+ 5 /* subId */);
verify(mPreference).setEnabled(false);
verify(mPreference).setIntent(null);
@@ -73,7 +73,7 @@
mPreference.setTemplate(new NetworkTemplate.Builder(NetworkTemplate.MATCH_MOBILE)
.setMeteredness(NetworkStats.METERED_YES).build(),
- 5 /* subId */, null /* services */);
+ 5 /* subId */);
verify(mPreference, never()).setEnabled(false);
verify(mPreference).setIntent(any(Intent.class));
diff --git a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
index 643d364..a91af12 100644
--- a/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/network/NetworkProviderSettingsTest.java
@@ -317,7 +317,7 @@
mNetworkProviderSettings.onCreate(Bundle.EMPTY);
verify(mDataUsagePreference).setVisible(true);
- verify(mDataUsagePreference).setTemplate(any(), eq(0) /*subId*/, eq(null) /*service*/);
+ verify(mDataUsagePreference).setTemplate(any(), eq(0) /*subId*/);
}
@Test
diff --git a/tests/spa_unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.kt b/tests/spa_unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.kt
new file mode 100644
index 0000000..2e2620b
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2023 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.datausage
+
+import android.content.Context
+import android.net.NetworkTemplate
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.datausage.lib.BillingCycleRepository
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+
+@RunWith(AndroidJUnit4::class)
+class BillingCyclePreferenceTest {
+
+ private val mockBillingCycleRepository = mock<BillingCycleRepository> {
+ on { isModifiable(SUB_ID) } doReturn false
+ }
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ private val preference = BillingCyclePreference(context, null, mockBillingCycleRepository)
+
+ @Test
+ fun isEnabled_initialState() {
+ val enabled = preference.isEnabled
+
+ assertThat(enabled).isTrue()
+ }
+
+ @Test
+ fun isEnabled_afterSetTemplate_updated() {
+ preference.setTemplate(mock<NetworkTemplate>(), SUB_ID)
+
+ val enabled = preference.isEnabled
+
+ assertThat(enabled).isFalse()
+ }
+
+ private companion object {
+ const val SUB_ID = 1
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/datausage/lib/BillingCycleRepositoryTest.kt b/tests/spa_unit/src/com/android/settings/datausage/lib/BillingCycleRepositoryTest.kt
new file mode 100644
index 0000000..deaaf2d
--- /dev/null
+++ b/tests/spa_unit/src/com/android/settings/datausage/lib/BillingCycleRepositoryTest.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2023 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.datausage.lib
+
+import android.content.Context
+import android.os.INetworkManagementService
+import android.os.UserManager
+import android.telephony.TelephonyManager
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.spaprivileged.framework.common.userManager
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.whenever
+
+@RunWith(AndroidJUnit4::class)
+class BillingCycleRepositoryTest {
+
+ private val mockNetworkManagementService = mock<INetworkManagementService> {
+ on { isBandwidthControlEnabled } doReturn true
+ }
+
+ private val mockUserManager = mock<UserManager> {
+ on { isAdminUser } doReturn true
+ }
+
+ private val mockTelephonyManager = mock<TelephonyManager> {
+ on { createForSubscriptionId(SUB_ID) } doReturn mock
+ on { isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER) } doReturn false
+ }
+
+ private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
+ on { userManager } doReturn mockUserManager
+ on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
+ }
+
+ private val repository = BillingCycleRepository(context, mockNetworkManagementService)
+
+ @Test
+ fun isModifiable_bandwidthControlDisabled_returnFalse() {
+ whenever(mockNetworkManagementService.isBandwidthControlEnabled).thenReturn(false)
+
+ val modifiable = repository.isModifiable(SUB_ID)
+
+ assertThat(modifiable).isFalse()
+ }
+
+ @Test
+ fun isModifiable_notAdminUser_returnFalse() {
+ whenever(mockUserManager.isAdminUser).thenReturn(false)
+
+ val modifiable = repository.isModifiable(SUB_ID)
+
+ assertThat(modifiable).isFalse()
+ }
+
+ @Test
+ fun isModifiable_dataDisabled_returnFalse() {
+ whenever(
+ mockTelephonyManager.isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER)
+ ).thenReturn(false)
+
+ val modifiable = repository.isModifiable(SUB_ID)
+
+ assertThat(modifiable).isFalse()
+ }
+
+ @Test
+ fun isModifiable_meetAllRequirements_returnTrue() {
+ whenever(mockNetworkManagementService.isBandwidthControlEnabled).thenReturn(true)
+ whenever(mockUserManager.isAdminUser).thenReturn(true)
+ whenever(
+ mockTelephonyManager.isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER)
+ ).thenReturn(true)
+
+ val modifiable = repository.isModifiable(SUB_ID)
+
+ assertThat(modifiable).isTrue()
+ }
+
+ @Test
+ fun isBandwidthControlEnabled_bandwidthControlDisabled_returnFalse() {
+ whenever(mockNetworkManagementService.isBandwidthControlEnabled).thenReturn(false)
+
+ val enabled = repository.isBandwidthControlEnabled()
+
+ assertThat(enabled).isFalse()
+ }
+
+ @Test
+ fun isBandwidthControlEnabled_bandwidthControlEnabled_returnTrue() {
+ whenever(mockNetworkManagementService.isBandwidthControlEnabled).thenReturn(true)
+
+ val enabled = repository.isBandwidthControlEnabled()
+
+ assertThat(enabled).isTrue()
+ }
+
+ private companion object {
+ const val SUB_ID = 1
+ }
+}
diff --git a/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt b/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt
index c6c37d5..590fe9e 100644
--- a/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt
+++ b/tests/spa_unit/src/com/android/settings/network/apn/ApnEditPageProviderTest.kt
@@ -49,13 +49,14 @@
private val apnType = "apn_type"
private val apnRoaming = "IPv4"
private val apnEnable = context.resources.getString(R.string.carrier_enabled)
+ private val apnProtocolOptions = context.resources.getStringArray(R.array.apn_protocol_entries).toList()
private val apnData = ApnData(
name = apnName,
mmsc = mmsc,
mmsProxy = mmsProxy,
mnc = mnc,
apnType = apnType,
- apnRoaming = apnRoaming,
+ apnRoaming = apnProtocolOptions.indexOf(apnRoaming),
apnEnable = true
)
diff --git a/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java b/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java
deleted file mode 100644
index f74768f..0000000
--- a/tests/unit/src/com/android/settings/datausage/BillingCyclePreferenceTest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2022 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.datausage;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.os.INetworkManagementService;
-import android.os.RemoteException;
-import android.os.UserManager;
-import android.telephony.TelephonyManager;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@RunWith(AndroidJUnit4.class)
-public class BillingCyclePreferenceTest {
-
- private Context mContext;
- private BillingCyclePreference mPreference;
- private TemplatePreference.NetworkServices mServices;
- @Mock
- private INetworkManagementService mNetManageSerice;
- @Mock
- private TelephonyManager mTelephonyManager;
- @Mock
- private UserManager mUserManager;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
- mContext = spy(ApplicationProvider.getApplicationContext());
-
- mServices = new TemplatePreference.NetworkServices();
- mServices.mNetworkService = mNetManageSerice;
- mServices.mTelephonyManager = mTelephonyManager;
- mServices.mUserManager = mUserManager;
-
- doReturn(mTelephonyManager).when(mTelephonyManager)
- .createForSubscriptionId(anyInt());
-
- mPreference = spy(new BillingCyclePreference(mContext, null /* attrs */));
- mPreference.setTemplate(null, 0, mServices);
- }
-
- @Test
- public void testPreferenceUpdate_onMobileDataEnabledChange_accessDataEnabledApi() {
- try {
- doReturn(true).when(mNetManageSerice).isBandwidthControlEnabled();
- } catch (RemoteException exception) {}
- doReturn(true).when(mUserManager).isAdminUser();
- mPreference.onMobileDataEnabledChange();
-
- verify(mTelephonyManager)
- .isDataEnabledForReason(TelephonyManager.DATA_ENABLED_REASON_USER);
- }
-}
\ No newline at end of file