From 5d33ca912011a8f881bce3e323de4c31f49c80cc Mon Sep 17 00:00:00 2001 From: Mill Chen Date: Fri, 22 Apr 2022 13:05:23 +0800 Subject: [PATCH 01/18] Remove loading spinner from Premium SMS access The loading spinner in the page is displayed by default, regardless of whether or not how many apps are in the page. This change is trying to remove the loading spinner from the page since this page doesn't have many apps in it. Bug: 222441974 Test: visual verify Change-Id: I9b2b031122e6b6d521466ccf53e39185cfcab687 --- res/values/dimens.xml | 1 + .../specialaccess/premiumsms/PremiumSmsAccess.java | 4 +--- src/com/android/settings/widget/EmptyTextSettings.java | 4 +++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 4db51c65480..ad158772eea 100755 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -443,6 +443,7 @@ 24dp + 450dp 24dp diff --git a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java index f1c578e81df..3df19beeec6 100644 --- a/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java +++ b/src/com/android/settings/applications/specialaccess/premiumsms/PremiumSmsAccess.java @@ -68,7 +68,7 @@ public class PremiumSmsAccess extends EmptyTextSettings @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - setLoading(true, false); + setEmptyText(R.string.premium_sms_none); } @Override @@ -138,8 +138,6 @@ public class PremiumSmsAccess extends EmptyTextSettings private void updatePrefs(ArrayList apps) { if (apps == null) return; - setEmptyText(R.string.premium_sms_none); - setLoading(false, true); final PreferenceScreen screen = getPreferenceScreen(); screen.removeAll(); screen.setOrderingAsAdded(true); diff --git a/src/com/android/settings/widget/EmptyTextSettings.java b/src/com/android/settings/widget/EmptyTextSettings.java index 87513dd5fe3..a6e5c60ce8e 100644 --- a/src/com/android/settings/widget/EmptyTextSettings.java +++ b/src/com/android/settings/widget/EmptyTextSettings.java @@ -43,8 +43,10 @@ public abstract class EmptyTextSettings extends SettingsPreferenceFragment { TypedValue value = new TypedValue(); getContext().getTheme().resolveAttribute(android.R.attr.textAppearanceMedium, value, true); mEmpty.setTextAppearance(value.resourceId); + final int layoutHeight = getContext().getResources() + .getDimensionPixelSize(R.dimen.empty_text_layout_height); ((ViewGroup) view.findViewById(android.R.id.list_container)).addView(mEmpty, - new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + new LayoutParams(LayoutParams.MATCH_PARENT, layoutHeight)); setEmptyView(mEmpty); } From 2818dedc284dd7afd3ced6165b9850c689b6b624 Mon Sep 17 00:00:00 2001 From: changbetty Date: Tue, 26 Apr 2022 07:47:23 +0000 Subject: [PATCH 02/18] [LE] Launch the MediaOutputBroadcastDialog when the current device is broadcasting Bug: 229577323 Test: Manual test Change-Id: I0bfc9ecac2a0b6d68d41c4d17d4642f927581ccb --- .../notification/MediaVolumePreferenceController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/notification/MediaVolumePreferenceController.java b/src/com/android/settings/notification/MediaVolumePreferenceController.java index 978a4b40237..c0d5610c932 100644 --- a/src/com/android/settings/notification/MediaVolumePreferenceController.java +++ b/src/com/android/settings/notification/MediaVolumePreferenceController.java @@ -35,6 +35,7 @@ import com.android.settings.media.MediaOutputIndicatorWorker; import com.android.settings.slices.CustomSliceRegistry; import com.android.settings.slices.SliceBackgroundWorker; import com.android.settingslib.media.MediaDevice; +import com.android.settingslib.media.MediaOutputConstants; public class MediaVolumePreferenceController extends VolumeSeekBarPreferenceController { private static final String TAG = "MediaVolumePreCtrl"; @@ -106,8 +107,10 @@ public class MediaVolumePreferenceController extends VolumeSeekBarPreferenceCont final Intent intent = new Intent(); if (getWorker().isDeviceBroadcasting()) { - // TODO(b/229577323) : Get the intent action for the Media Output Broadcast Dialog - // in SystemUI + intent.setPackage(MediaOutputConstants.SYSTEMUI_PACKAGE_NAME); + intent.setAction(MediaOutputConstants.ACTION_LAUNCH_MEDIA_OUTPUT_BROADCAST_DIALOG); + intent.putExtra(MediaOutputConstants.EXTRA_PACKAGE_NAME, + getWorker().getActiveLocalMediaController().getPackageName()); } else { // TODO(b/229577518) : Get the intent action of the Bluetooth Broadcast Dialog // for user to choose the action From 263592e3dd2cba5769bdede8cc11244de94f4fd9 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Thu, 6 Jan 2022 10:58:58 +0800 Subject: [PATCH 03/18] Prevent side channel package installation enumeration From Android 11, apps need the permission QUERY_ALL_PACKAGES to probe existence of arbitrary installed packages. However, an Activity which declares android:scheme="package in intent-filter may be vulnerable and attacker app can use it to probe installed packages. This change add permission QUERY_ALL_PACKAGES to protect vulnerable Activity. Bug: 185477439 Test: Install POC and check if it can probe installed packages by each vulnerable Activity. Change-Id: I521545436102f72f2e0c5053e30fd03bd6bc756f --- AndroidManifest.xml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4d3b6d0e3f9..1f9c9086c48 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -1451,7 +1451,8 @@ + android:noHistory="true" + android:permission="android.permission.QUERY_ALL_PACKAGES"> @@ -1521,6 +1522,7 @@ @@ -1534,7 +1536,8 @@ + android:exported="true" + android:permission="android.permission.QUERY_ALL_PACKAGES"> @@ -1893,7 +1896,8 @@ + android:label="@string/usage_access_title" + android:permission="android.permission.QUERY_ALL_PACKAGES"> From 646e9e4ff8f75578b015f2d9d0633cf8a85b3bc8 Mon Sep 17 00:00:00 2001 From: Yuri Lin Date: Wed, 20 Apr 2022 15:49:05 -0400 Subject: [PATCH 04/18] Move REVIEW_PERMISSIONS_NOTIFICATION_STATE to Global from Secure This is a global setting that is not per-user, so adjusting it accordingly. Bug: 225373531 Test: manual Change-Id: I100cd53a5ffef6ce5f9a01e6add9465a00ceaeb5 --- .../applications/manageapplications/ManageApplications.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index 3eae8855959..062bfc576b2 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -330,8 +330,8 @@ public class ManageApplications extends InstrumentedFragment if (className.equals(Settings.NotificationReviewPermissionsActivity.class.getName())) { // Special-case for a case where a user is directed to the all apps notification // preferences page via a notification prompt to review permissions settings. - android.provider.Settings.Secure.putInt(getContext().getContentResolver(), - android.provider.Settings.Secure.REVIEW_PERMISSIONS_NOTIFICATION_STATE, + android.provider.Settings.Global.putInt(getContext().getContentResolver(), + android.provider.Settings.Global.REVIEW_PERMISSIONS_NOTIFICATION_STATE, 1); // USER_INTERACTED } } else if (className.equals(AppLocaleDetails.class.getName())) { From f1dfa76dba57e6da578d7ea31d3af39ec4a158a7 Mon Sep 17 00:00:00 2001 From: Amy Hsu Date: Thu, 28 Apr 2022 15:35:18 +0800 Subject: [PATCH 05/18] [ScreenResolutionController] UI string update Bug: b/230626771 Test: Check the string manually Change-Id: Ibe8cde0ef743ef398edbc438ead130215f7294d0 --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index cc66b3b432b..ee69ae9866c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2939,13 +2939,13 @@ High resolution - Highest resolution + Full resolution 1080p FHD+ 1440p QHD+ - Switching your resolution might cause some apps currently running to close. + Full resolution uses more of your battery. Switching to full resolution may cause some apps to restart. Colors From 049aa73cb1018dcbfea10650dec26e3a0de2d552 Mon Sep 17 00:00:00 2001 From: Calvin Pan Date: Mon, 25 Apr 2022 11:29:39 +0000 Subject: [PATCH 06/18] Add unit test for AppLocalePickerActivity Bug: 223503670 Test: atest Change-Id: I0e92be43d661dd3bff19c3274d1572ef1f4e9c46 --- .../localepicker/AppLocalePickerActivity.java | 8 +- .../AppLocalePickerActivityTest.java | 118 ++++++++++++++++++ 2 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java diff --git a/src/com/android/settings/localepicker/AppLocalePickerActivity.java b/src/com/android/settings/localepicker/AppLocalePickerActivity.java index 4700f3f5383..1ed6f5be3b1 100644 --- a/src/com/android/settings/localepicker/AppLocalePickerActivity.java +++ b/src/com/android/settings/localepicker/AppLocalePickerActivity.java @@ -30,7 +30,6 @@ import android.view.View; import android.widget.FrameLayout; import android.widget.ListView; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.LocalePickerWithRegion; import com.android.internal.app.LocaleStore; import com.android.settings.R; @@ -38,10 +37,6 @@ import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.appinfo.AppLocaleDetails; import com.android.settings.core.SettingsBaseActivity; -/** - * TODO(b/223503670): Add unit test for AppLocalePickerActivity. - * A activity to show the locale picker and information page. - */ public class AppLocalePickerActivity extends SettingsBaseActivity implements LocalePickerWithRegion.LocaleSelectedListener { private static final String TAG = AppLocalePickerActivity.class.getSimpleName(); @@ -128,8 +123,7 @@ public class AppLocalePickerActivity extends SettingsBaseActivity return appLocaleDetailsContainer; } - @VisibleForTesting - void launchLocalePickerPage() { + private void launchLocalePickerPage() { // LocalePickerWithRegion use android.app.ListFragment. Thus, it can not use // getSupportFragmentManager() to add this into container. android.app.FragmentManager fragmentManager = getFragmentManager(); diff --git a/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java new file mode 100644 index 00000000000..4d5e0b98172 --- /dev/null +++ b/tests/robotests/src/com/android/settings/localepicker/AppLocalePickerActivityTest.java @@ -0,0 +1,118 @@ +/* + * 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.localepicker; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.Activity; +import android.app.ApplicationPackageManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.InstallSourceInfo; +import android.net.Uri; +import android.os.Process; +import android.os.UserHandle; +import android.telephony.TelephonyManager; + +import androidx.fragment.app.Fragment; + +import com.android.settings.R; +import com.android.settings.applications.AppInfoBase; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.Robolectric; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.Shadows; +import org.robolectric.android.controller.ActivityController; +import org.robolectric.annotation.Config; +import org.robolectric.annotation.Implementation; +import org.robolectric.annotation.Implements; +import org.robolectric.shadows.ShadowTelephonyManager; + +@RunWith(RobolectricTestRunner.class) +@Config( + shadows = { + AppLocalePickerActivityTest.ShadowApplicationPackageManager.class, + }) +public class AppLocalePickerActivityTest { + private static final String TEST_PACKAGE_NAME = "com.android.settings"; + private static final Uri TEST_PACKAGE_URI = Uri.parse("package:" + TEST_PACKAGE_NAME); + + @Rule + public MockitoRule rule = MockitoJUnit.rule(); + + @Test + public void launchAppLocalePickerActivity_hasPackageName_success() { + ActivityController controller = + initActivityController(true); + + controller.create(); + + assertThat(controller.get().isFinishing()).isFalse(); + } + + @Test + public void launchAppLocalePickerActivity_intentWithoutPackageName_failed() { + ActivityController controller = + initActivityController(false); + + controller.create(); + + assertThat(controller.get().isFinishing()).isTrue(); + } + + private ActivityController initActivityController( + boolean hasPackageName) { + Intent data = new Intent(); + if (hasPackageName) { + data.setData(TEST_PACKAGE_URI); + } + data.putExtra(AppInfoBase.ARG_PACKAGE_UID, UserHandle.getUserId(Process.myUid())); + ActivityController activityController = + Robolectric.buildActivity(TestAppLocalePickerActivity.class, data); + Activity activity = activityController.get(); + + ShadowTelephonyManager shadowTelephonyManager = Shadows.shadowOf( + activity.getSystemService(TelephonyManager.class)); + shadowTelephonyManager.setSimCountryIso("US"); + shadowTelephonyManager.setNetworkCountryIso("US"); + + return activityController; + } + + private static class TestAppLocalePickerActivity extends AppLocalePickerActivity { + @Override + public Context createContextAsUser(UserHandle user, int flags) { + // return the current context as a work profile + return this; + } + } + + @Implements(ApplicationPackageManager.class) + public static class ShadowApplicationPackageManager extends + org.robolectric.shadows.ShadowApplicationPackageManager { + + @Implementation + protected Object getInstallSourceInfo(String packageName) { + return new InstallSourceInfo("", null, null, ""); + } + } +} From b899bd3690e8b7a0040e041c0f44a700a8d8a133 Mon Sep 17 00:00:00 2001 From: tom hsu Date: Thu, 28 Apr 2022 21:32:33 +0800 Subject: [PATCH 07/18] [Panlingual] Avoid activity restart during rotation Bug: 230680942 Test: local Change-Id: Ib64509fb73fb363ad4dd5c2163659346295f581d --- AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 762d84da36e..15c5272665b 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -866,6 +866,7 @@ From 3e2d7f4581ffd8f72c16f871361c7bd0951aee20 Mon Sep 17 00:00:00 2001 From: Prabal Singh Date: Wed, 27 Apr 2022 22:32:36 +0100 Subject: [PATCH 08/18] Remove extra argument WorkPolicyUtil constructor Only constructor is required for WorkPolicyInfo constructor. The other dependencies can be derives Test: make ROBOTEST_FILTER=EnterprisePrivacyFeatureProviderImplTest RunSettingsRoboTests -j40 Change-Id: I7f35e5ed344d452190b333aad7fa823a010d17b3 --- .../enterprise/EnterprisePrivacyFeatureProviderImpl.java | 2 +- .../enterprise/EnterprisePrivacyFeatureProviderImplTest.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java index f3085bccbfb..b1ffcf145b4 100644 --- a/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java +++ b/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImpl.java @@ -69,7 +69,7 @@ public class EnterprisePrivacyFeatureProviderImpl implements EnterprisePrivacyFe mCm = cm; mVm = vm; mResources = resources; - mWorkPolicyUtils = new WorkPolicyUtils(mContext, mPm, mUm, mDpm); + mWorkPolicyUtils = new WorkPolicyUtils(mContext); } @Override diff --git a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java index 0005e71628a..87a447d1fbb 100644 --- a/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java +++ b/tests/robotests/src/com/android/settings/enterprise/EnterprisePrivacyFeatureProviderImplTest.java @@ -105,6 +105,10 @@ public class EnterprisePrivacyFeatureProviderImplTest { when(mContext.getApplicationContext()).thenReturn(mContext); resetAndInitializePackageManager(); when(mUserManager.getProfiles(mUserId)).thenReturn(mProfiles); + when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)) + .thenReturn(mDevicePolicyManager); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + when(mContext.getPackageManager()).thenReturn(mPackageManager); mProfiles.add(new UserInfo(mUserId, "", "", 0 /* flags */)); mResources = RuntimeEnvironment.application.getResources(); From ddedb31f6e94253b35c413e8e0bdca98355cc37e Mon Sep 17 00:00:00 2001 From: Chaohui Wang Date: Thu, 28 Apr 2022 19:09:02 +0800 Subject: [PATCH 09/18] Fix flicker for Mobile data & Wi-Fi page Both "Mobile data usage" & "Non-carrier data usage". By, 1. Add header in onCreate() instead of onViewCreated() 2. Keep the space for Spinner, and preload initial cycles 3. Keep the space for 3 usage summaries Bug: 191730864 Test: manual Change-Id: I8c309c5f51ce6290383a2d10f75e41d0f207d61a --- res/xml/app_data_usage.xml | 12 +- .../settings/datausage/AppDataUsage.java | 26 +++- .../settings/datausage/CycleAdapter.java | 141 +----------------- .../settings/datausage/SpinnerPreference.java | 14 ++ .../settings/datausage/AppDataUsageTest.java | 20 +-- 5 files changed, 53 insertions(+), 160 deletions(-) diff --git a/res/xml/app_data_usage.xml b/res/xml/app_data_usage.xml index e64a1c5cc63..e94c4ff4ca2 100644 --- a/res/xml/app_data_usage.xml +++ b/res/xml/app_data_usage.xml @@ -21,8 +21,7 @@ android:title="@string/data_usage_app_summary_title"> + android:key="cycle" /> @@ -31,19 +30,22 @@ android:key="total_usage" android:title="@string/total_size_label" android:selectable="false" - android:layout="@layout/horizontal_preference" /> + android:layout="@layout/horizontal_preference" + android:summary="@string/summary_placeholder" /> + android:layout="@layout/horizontal_preference" + android:summary="@string/summary_placeholder" /> + android:layout="@layout/horizontal_preference" + android:summary="@string/summary_placeholder" /> diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java index 460f3909f74..531a341c95a 100644 --- a/src/com/android/settings/datausage/AppDataUsage.java +++ b/src/com/android/settings/datausage/AppDataUsage.java @@ -144,8 +144,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC mForegroundUsage = findPreference(KEY_FOREGROUND_USAGE); mBackgroundUsage = findPreference(KEY_BACKGROUND_USAGE); - mCycle = findPreference(KEY_CYCLE); - mCycleAdapter = new CycleAdapter(mContext, mCycle, mCycleListener); + initCycle(); final UidDetailProvider uidDetailProvider = getUidDetailProvider(); @@ -211,6 +210,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC removePreference(KEY_RESTRICT_BACKGROUND); removePreference(KEY_APP_LIST); } + + addEntityHeader(); } @Override @@ -276,6 +277,17 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC return new UidDetailProvider(mContext); } + private void initCycle() { + mCycle = findPreference(KEY_CYCLE); + mCycleAdapter = new CycleAdapter(mContext, mCycle, mCycleListener); + if (mCycles != null) { + // If coming from a page like DataUsageList where already has a selected cycle, display + // that before loading to reduce flicker. + mCycleAdapter.setInitialCycleList(mCycles, mSelectedCycle); + mCycle.setHasCycles(true); + } + } + private void updatePrefs(boolean restrictBackground, boolean unrestrictData) { final EnforcedAdmin admin = RestrictedLockUtilsInternal.checkIfMeteredDataRestricted( mContext, mPackageName, UserHandle.getUserId(mAppItem.key)); @@ -308,9 +320,9 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC final long backgroundBytes, foregroundBytes; if (mUsageData == null || position >= mUsageData.size()) { backgroundBytes = foregroundBytes = 0; - mCycle.setVisible(false); + mCycle.setHasCycles(false); } else { - mCycle.setVisible(true); + mCycle.setHasCycles(true); final NetworkCycleDataForUid data = mUsageData.get(position); backgroundBytes = data.getBackgroudUsage(); foregroundBytes = data.getForegroudUsage(); @@ -335,10 +347,8 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC return false; } - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - + @VisibleForTesting + void addEntityHeader() { String pkg = mPackages.size() != 0 ? mPackages.valueAt(0) : null; int uid = 0; if (pkg != null) { diff --git a/src/com/android/settings/datausage/CycleAdapter.java b/src/com/android/settings/datausage/CycleAdapter.java index 2cabd8de452..b41b6aad91b 100644 --- a/src/com/android/settings/datausage/CycleAdapter.java +++ b/src/com/android/settings/datausage/CycleAdapter.java @@ -13,24 +13,13 @@ */ package com.android.settings.datausage; -import android.annotation.NonNull; -import android.app.usage.NetworkStats; import android.content.Context; -import android.net.NetworkPolicy; -import android.net.NetworkPolicyManager; -import android.text.format.DateUtils; -import android.util.Pair; -import android.util.Range; import android.widget.AdapterView; -import com.android.net.module.util.NetworkStatsUtils; import com.android.settings.Utils; -import com.android.settingslib.net.ChartData; import com.android.settingslib.net.NetworkCycleData; import com.android.settingslib.widget.SettingsSpinnerAdapter; -import java.time.ZonedDateTime; -import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -45,7 +34,6 @@ public class CycleAdapter extends SettingsSpinnerAdapter mSpinner = spinner; mListener = listener; mSpinner.setAdapter(this); - mSpinner.setOnItemSelectedListener(mListener); } /** @@ -65,128 +53,14 @@ public class CycleAdapter extends SettingsSpinnerAdapter return 0; } - protected static long getTotalBytesForTimeRange(List stats, - Range range) { - long bytes = 0L; - for (NetworkStats.Bucket bucket : stats) { - final Range bucketSpan = new Range<>( - bucket.getStartTimeStamp(), bucket.getEndTimeStamp()); - // Only record bytes that overlapped with the given time range. For partially - // overlapped bucket, record rational bytes assuming the traffic is uniform - // distributed within the bucket. - try { - final Range overlapped = range.intersect(bucketSpan); - final long totalOfBucket = bucket.getRxBytes() + bucket.getTxBytes(); - bytes += NetworkStatsUtils.multiplySafeByRational(totalOfBucket, - overlapped.getUpper() - overlapped.getLower(), - bucketSpan.getUpper() - bucketSpan.getLower()); - } catch (IllegalArgumentException e) { - // Range disjoint, ignore. - continue; - } - } - return bytes; - } - - @NonNull - private Range getTimeRangeOf(@NonNull List stats) { - long start = Long.MAX_VALUE; - long end = Long.MIN_VALUE; - for (NetworkStats.Bucket bucket : stats) { - start = Math.min(start, bucket.getStartTimeStamp()); - end = Math.max(end, bucket.getEndTimeStamp()); - } - return new Range(start, end); - } - - /** - * Rebuild list based on {@link NetworkPolicy} and available - * {@link List} data. Always selects the newest item, - * updating the inspection range on chartData. - */ - @Deprecated - public boolean updateCycleList(NetworkPolicy policy, ChartData chartData) { - // stash away currently selected cycle to try restoring below - final CycleAdapter.CycleItem previousItem = (CycleAdapter.CycleItem) - mSpinner.getSelectedItem(); + void setInitialCycleList(List cycles, long selectedCycle) { clear(); - - final Context context = getContext(); - - long historyStart; - long historyEnd; - try { - final Range historyTimeRange = getTimeRangeOf(chartData.network); - historyStart = historyTimeRange.getLower(); - historyEnd = historyTimeRange.getUpper(); - } catch (IllegalArgumentException e) { - // Empty history. - final long now = System.currentTimeMillis(); - historyStart = now; - historyEnd = now + 1; - } - - boolean hasCycles = false; - if (policy != null) { - final Iterator> it = NetworkPolicyManager - .cycleIterator(policy); - while (it.hasNext()) { - final Pair cycle = it.next(); - final long cycleStart = cycle.first.toInstant().toEpochMilli(); - final long cycleEnd = cycle.second.toInstant().toEpochMilli(); - - final boolean includeCycle; - if (chartData != null) { - final long bytesInCycle = getTotalBytesForTimeRange(chartData.network, - new Range<>(cycleStart, cycleEnd)); - includeCycle = bytesInCycle > 0; - } else { - includeCycle = true; - } - - if (includeCycle) { - add(new CycleAdapter.CycleItem(context, cycleStart, cycleEnd)); - hasCycles = true; - } + for (int i = 0; i < cycles.size() - 1; i++) { + add(new CycleAdapter.CycleItem(getContext(), cycles.get(i + 1), cycles.get(i))); + if (cycles.get(i) == selectedCycle) { + mSpinner.setSelection(i); } } - - if (!hasCycles) { - // no policy defined cycles; show entry for each four-week period - long cycleEnd = historyEnd; - while (cycleEnd > historyStart) { - final long cycleStart = cycleEnd - (DateUtils.WEEK_IN_MILLIS * 4); - - final boolean includeCycle; - if (chartData != null) { - final long bytesInCycle = getTotalBytesForTimeRange(chartData.network, - new Range<>(cycleStart, cycleEnd)); - includeCycle = bytesInCycle > 0; - } else { - includeCycle = true; - } - - if (includeCycle) { - add(new CycleAdapter.CycleItem(context, cycleStart, cycleEnd)); - } - cycleEnd = cycleStart; - } - } - - // force pick the current cycle (first item) - if (getCount() > 0) { - final int position = findNearestPosition(previousItem); - mSpinner.setSelection(position); - - // only force-update cycle when changed; skipping preserves any - // user-defined inspection region. - final CycleAdapter.CycleItem selectedItem = getItem(position); - if (!Objects.equals(selectedItem, previousItem)) { - mListener.onItemSelected(null, null, position, 0); - return false; - } - } - return true; } /** @@ -194,6 +68,7 @@ public class CycleAdapter extends SettingsSpinnerAdapter * updating the inspection range on chartData. */ public boolean updateCycleList(List cycleData) { + mSpinner.setOnItemSelectedListener(mListener); // stash away currently selected cycle to try restoring below final CycleAdapter.CycleItem previousItem = (CycleAdapter.CycleItem) mSpinner.getSelectedItem(); @@ -228,10 +103,6 @@ public class CycleAdapter extends SettingsSpinnerAdapter public long start; public long end; - public CycleItem(CharSequence label) { - this.label = label; - } - public CycleItem(Context context, long start, long end) { this.label = Utils.formatDateRange(context, start, end); this.start = start; diff --git a/src/com/android/settings/datausage/SpinnerPreference.java b/src/com/android/settings/datausage/SpinnerPreference.java index 867930baa97..c4b7a4e18da 100644 --- a/src/com/android/settings/datausage/SpinnerPreference.java +++ b/src/com/android/settings/datausage/SpinnerPreference.java @@ -31,6 +31,8 @@ public class SpinnerPreference extends Preference implements CycleAdapter.Spinne private AdapterView.OnItemSelectedListener mListener; private Object mCurrentObject; private int mPosition; + private View mItemView; + private boolean mItemViewVisible = false; public SpinnerPreference(Context context, AttributeSet attrs) { super(context, attrs); @@ -63,12 +65,24 @@ public class SpinnerPreference extends Preference implements CycleAdapter.Spinne @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); + mItemView = holder.itemView; + mItemView.setVisibility(mItemViewVisible ? View.VISIBLE : View.INVISIBLE); Spinner spinner = (Spinner) holder.findViewById(R.id.cycles_spinner); spinner.setAdapter(mAdapter); spinner.setSelection(mPosition); spinner.setOnItemSelectedListener(mOnSelectedListener); } + void setHasCycles(boolean hasData) { + setVisible(hasData); + if (hasData) { + mItemViewVisible = true; + if (mItemView != null) { + mItemView.setVisibility(View.VISIBLE); + } + } + } + @Override protected void performClick(View view) { view.findViewById(R.id.cycles_spinner).performClick(); diff --git a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java index 09c57340d60..f043ec737e3 100644 --- a/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java +++ b/tests/robotests/src/com/android/settings/datausage/AppDataUsageTest.java @@ -43,7 +43,6 @@ import android.os.Process; import android.telephony.SubscriptionManager; import android.text.format.DateUtils; import android.util.ArraySet; -import android.view.View; import androidx.fragment.app.FragmentActivity; import androidx.preference.Preference; @@ -96,6 +95,10 @@ public class AppDataUsageTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + + ShadowEntityHeaderController.setUseMock(mHeaderController); + when(mHeaderController.setRecyclerView(any(), any())).thenReturn(mHeaderController); + when(mHeaderController.setUid(anyInt())).thenReturn(mHeaderController); } @After @@ -163,10 +166,6 @@ public class AppDataUsageTest { @Test public void bindAppHeader_allWorkApps_shouldNotShowAppInfoLink() { - ShadowEntityHeaderController.setUseMock(mHeaderController); - when(mHeaderController.setRecyclerView(any(), any())).thenReturn(mHeaderController); - when(mHeaderController.setUid(anyInt())).thenReturn(mHeaderController); - mFragment = spy(new AppDataUsage()); when(mFragment.getPreferenceManager()) @@ -174,7 +173,7 @@ public class AppDataUsageTest { doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); ReflectionHelpers.setField(mFragment, "mAppItem", mock(AppItem.class)); - mFragment.onViewCreated(new View(RuntimeEnvironment.application), new Bundle()); + mFragment.addEntityHeader(); verify(mHeaderController).setHasAppInfoLink(false); } @@ -196,16 +195,13 @@ public class AppDataUsageTest { when(mPackageManager.getPackageUidAsUser(anyString(), anyInt())) .thenReturn(fakeUserId); - ShadowEntityHeaderController.setUseMock(mHeaderController); - when(mHeaderController.setRecyclerView(any(), any())).thenReturn(mHeaderController); - when(mHeaderController.setUid(fakeUserId)).thenReturn(mHeaderController); when(mHeaderController.setHasAppInfoLink(anyBoolean())).thenReturn(mHeaderController); when(mFragment.getPreferenceManager()) .thenReturn(mock(PreferenceManager.class, RETURNS_DEEP_STUBS)); doReturn(mock(PreferenceScreen.class)).when(mFragment).getPreferenceScreen(); - mFragment.onViewCreated(new View(RuntimeEnvironment.application), new Bundle()); + mFragment.addEntityHeader(); verify(mHeaderController).setHasAppInfoLink(true); verify(mHeaderController).setUid(fakeUserId); @@ -268,7 +264,7 @@ public class AppDataUsageTest { mFragment.bindData(0 /* position */); - verify(cycle).setVisible(false); + verify(cycle).setHasCycles(false); } @Test @@ -293,7 +289,7 @@ public class AppDataUsageTest { mFragment.bindData(0 /* position */); - verify(cycle).setVisible(true); + verify(cycle).setHasCycles(true); verify(totalPref).setSummary( DataUsageUtils.formatDataUsage(context, backgroundBytes + foregroundBytes)); verify(backgroundPref).setSummary(DataUsageUtils.formatDataUsage(context, backgroundBytes)); From c15fb9ed814e02e51292f823623e0b81968b6707 Mon Sep 17 00:00:00 2001 From: Jan Tomljanovic Date: Thu, 28 Apr 2022 17:09:05 +0100 Subject: [PATCH 10/18] Update the SafetyCenter icon Test: manual Bug: 230731934 Change-Id: I11a82348b77b5e162e9dfaf5bfa91642db709f6f --- res/drawable/ic_settings_safety_center.xml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/res/drawable/ic_settings_safety_center.xml b/res/drawable/ic_settings_safety_center.xml index f43359fefd4..e817b7194bb 100644 --- a/res/drawable/ic_settings_safety_center.xml +++ b/res/drawable/ic_settings_safety_center.xml @@ -13,17 +13,19 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - + android:viewportHeight="24" + android:tint="?android:attr/textColorPrimary"> + + android:pathData="M 0 0 H 24 V 24 H 0 V 0 Z" /> + android:fillColor="#000000" + android:pathData="M12,4.14l6,2.25v4.71c0,2.12-0.62,4-1.88,5.74c-1.13,1.55-2.48,2.56-4.12,3.09c-1.64-0.52-2.99-1.54-4.12-3.09 C6.62,15.1,6,13.22,6,11.1V6.39L12,4.14 M12,2L4,5v6.1c0,2.53,0.75,4.84,2.26,6.91C7.77,20.09,9.68,21.42,12,22 c2.32-0.58,4.23-1.91,5.74-3.99C19.25,15.94,20,13.63,20,11.1V5L12,2L12,2z" /> + \ No newline at end of file From c12b9500e6f64ccef372ce888e2c0cd0ae483012 Mon Sep 17 00:00:00 2001 From: ykhung Date: Thu, 28 Apr 2022 22:41:24 +0800 Subject: [PATCH 11/18] Refine the BatteryUsageStats close() method invoke timing Refine invoke batteryUsageStats.close() timing to 1) avoid closing it before the UI is ready to ignore showing the battery usage app list data for AOSP version, and 2) avoid close the BatteryUsageStats which is passed from caller components in the BatteryInfo with unexpected behavior. Bug: 220717612 Test: make RunSettingsRoboTests -j56 ROBOTEST_FILTER="com.android.settings.fuelgauge" Change-Id: I0f75580ac68d72b41fa9a7f43aa6ea694f0992ff --- .../settings/fuelgauge/BatteryInfo.java | 12 ++++++--- .../settings/fuelgauge/PowerUsageBase.java | 25 +++++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryInfo.java b/src/com/android/settings/fuelgauge/BatteryInfo.java index 98f19fedb3d..b1e4c34e6ea 100644 --- a/src/com/android/settings/fuelgauge/BatteryInfo.java +++ b/src/com/android/settings/fuelgauge/BatteryInfo.java @@ -153,6 +153,7 @@ public class BatteryInfo { new AsyncTask() { @Override protected BatteryInfo doInBackground(Void... params) { + boolean shouldCloseBatteryUsageStats = false; BatteryUsageStats stats; if (batteryUsageStats != null) { stats = batteryUsageStats; @@ -160,6 +161,7 @@ public class BatteryInfo { try { stats = context.getSystemService(BatteryStatsManager.class) .getBatteryUsageStats(); + shouldCloseBatteryUsageStats = true; } catch (RuntimeException e) { Log.e(TAG, "getBatteryInfo() from getBatteryUsageStats()", e); // Use default BatteryUsageStats. @@ -168,10 +170,12 @@ public class BatteryInfo { } final BatteryInfo batteryInfo = getBatteryInfo(context, stats, shortString); - try { - stats.close(); - } catch (Exception e) { - Log.e(TAG, "BatteryUsageStats.close() failed", e); + if (shouldCloseBatteryUsageStats) { + try { + stats.close(); + } catch (Exception e) { + Log.e(TAG, "BatteryUsageStats.close() failed", e); + } } return batteryInfo; } diff --git a/src/com/android/settings/fuelgauge/PowerUsageBase.java b/src/com/android/settings/fuelgauge/PowerUsageBase.java index e95067936d6..6563155fb75 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageBase.java +++ b/src/com/android/settings/fuelgauge/PowerUsageBase.java @@ -83,6 +83,7 @@ public abstract class PowerUsageBase extends DashboardFragment { public void onStop() { super.onStop(); mBatteryBroadcastReceiver.unRegister(); + closeBatteryUsageStatsIfNeeded(); } protected void restartBatteryStatsLoader(int refreshType) { @@ -104,16 +105,6 @@ public abstract class PowerUsageBase extends DashboardFragment { final long startTime = System.currentTimeMillis(); historyPref.setBatteryUsageStats(mBatteryUsageStats); BatteryUtils.logRuntime(TAG, "updatePreference", startTime); - if (mBatteryUsageStats == null) { - return; - } - try { - mBatteryUsageStats.close(); - } catch (Exception e) { - Log.e(TAG, "BatteryUsageStats.close() failed", e); - } finally { - mBatteryUsageStats = null; - } } private class BatteryUsageStatsLoaderCallbacks @@ -130,6 +121,7 @@ public abstract class PowerUsageBase extends DashboardFragment { @Override public void onLoadFinished(Loader loader, BatteryUsageStats batteryUsageStats) { + closeBatteryUsageStatsIfNeeded(); mBatteryUsageStats = batteryUsageStats; PowerUsageBase.this.onLoadFinished(mRefreshType); } @@ -138,4 +130,17 @@ public abstract class PowerUsageBase extends DashboardFragment { public void onLoaderReset(Loader loader) { } } + + private void closeBatteryUsageStatsIfNeeded() { + if (mBatteryUsageStats == null) { + return; + } + try { + mBatteryUsageStats.close(); + } catch (Exception e) { + Log.e(TAG, "BatteryUsageStats.close() failed", e); + } finally { + mBatteryUsageStats = null; + } + } } From 4e34e65228a9350dbb561e77761c7bad0a23a9fc Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 29 Apr 2022 02:22:05 +0800 Subject: [PATCH 12/18] Show restricted message in Wi-Fi hotspot summary - Refine WifiTetherPreferenceController - See the result screenshot in b/203168953#comment8 Bug: 203168953 Test: manual test make RunSettingsRoboTests \ ROBOTEST_FILTER=WifiTetherPreferenceControllerTest Change-Id: If094178eb0cd9ccf20ff3899dc4b087b45c66f6b --- .../WifiTetherPreferenceController.java | 48 +++++++++++------- .../WifiTetherPreferenceControllerTest.java | 49 ++++++++----------- 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java index 94bd78a9c09..73ff31d4e47 100644 --- a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java +++ b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java @@ -46,12 +46,9 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController private static final String WIFI_TETHER_SETTINGS = "wifi_tether"; - private final TetheringManager mTetheringManager; - private final String[] mWifiRegexs; - private final WifiManager mWifiManager; - private final Lifecycle mLifecycle; - @VisibleForTesting - boolean mIsWifiTetheringAllow; + private boolean mIsWifiTetherable; + private WifiManager mWifiManager; + private boolean mIsWifiTetheringAllow; private int mSoftApState; @VisibleForTesting Preference mPreference; @@ -59,18 +56,32 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController WifiTetherSoftApManager mWifiTetherSoftApManager; public WifiTetherPreferenceController(Context context, Lifecycle lifecycle) { - this(context, lifecycle, true /* initSoftApManager */); + this(context, lifecycle, + context.getSystemService(WifiManager.class), + context.getSystemService(TetheringManager.class), + true /* initSoftApManager */, + WifiEnterpriseRestrictionUtils.isWifiTetheringAllowed(context)); } @VisibleForTesting - WifiTetherPreferenceController(Context context, Lifecycle lifecycle, - boolean initSoftApManager) { + WifiTetherPreferenceController( + Context context, + Lifecycle lifecycle, + WifiManager wifiManager, + TetheringManager tetheringManager, + boolean initSoftApManager, + boolean isWifiTetheringAllow) { super(context); - mTetheringManager = context.getSystemService(TetheringManager.class); - mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - mWifiRegexs = mTetheringManager.getTetherableWifiRegexs(); - mIsWifiTetheringAllow = WifiEnterpriseRestrictionUtils.isWifiTetheringAllowed(context); - mLifecycle = lifecycle; + final String[] wifiRegexs = tetheringManager.getTetherableWifiRegexs(); + if (wifiRegexs != null && wifiRegexs.length != 0) { + mIsWifiTetherable = true; + } + + mIsWifiTetheringAllow = isWifiTetheringAllow; + if (!isWifiTetheringAllow) return; + + mWifiManager = wifiManager; + if (lifecycle != null) { lifecycle.addObserver(this); } @@ -81,9 +92,7 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController @Override public boolean isAvailable() { - return mWifiRegexs != null - && mWifiRegexs.length != 0 - && !Utils.isMonkeyRunning(); + return mIsWifiTetherable && !Utils.isMonkeyRunning(); } @Override @@ -94,7 +103,10 @@ public class WifiTetherPreferenceController extends AbstractPreferenceController // unavailable return; } - mPreference.setEnabled(mIsWifiTetheringAllow); + if (!mIsWifiTetheringAllow && mPreference.isEnabled()) { + mPreference.setEnabled(false); + mPreference.setSummary(R.string.not_allowed_by_ent); + } } @Override diff --git a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java index 7ce2bf3b32c..e8ee7c3b90e 100644 --- a/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/tether/WifiTetherPreferenceControllerTest.java @@ -19,30 +19,29 @@ package com.android.settings.wifi.tether; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; import android.content.Context; import android.net.TetheringManager; import android.net.wifi.SoftApConfiguration; import android.net.wifi.WifiManager; -import android.os.Bundle; -import android.os.UserManager; -import androidx.lifecycle.LifecycleOwner; import androidx.preference.PreferenceScreen; +import androidx.test.core.app.ApplicationProvider; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; -import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; @@ -56,53 +55,44 @@ public class WifiTetherPreferenceControllerTest { private static final String SSID = "Pixel"; - private Context mContext; + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Spy + Context mContext = ApplicationProvider.getApplicationContext(); + @Mock + private Lifecycle mLifecycle; @Mock private TetheringManager mTetheringManager; @Mock private WifiManager mWifiManager; @Mock - private UserManager mUserManager; - @Mock - private Bundle mBundle; - @Mock private PreferenceScreen mScreen; private SoftApConfiguration mSoftApConfiguration; private WifiTetherPreferenceController mController; - private Lifecycle mLifecycle; - private LifecycleOwner mLifecycleOwner; private PrimarySwitchPreference mPreference; @Before public void setUp() { - MockitoAnnotations.initMocks(this); - - mContext = spy(RuntimeEnvironment.application); - mLifecycleOwner = () -> mLifecycle; - mLifecycle = new Lifecycle(mLifecycleOwner); FakeFeatureFactory.setupForTest(); - mPreference = new PrimarySwitchPreference(RuntimeEnvironment.application); + mPreference = new PrimarySwitchPreference(mContext); when(mContext.getSystemService(Context.TETHERING_SERVICE)).thenReturn(mTetheringManager); when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager); - when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); - when(mUserManager.getUserRestrictions()).thenReturn(mBundle); when(mScreen.findPreference(anyString())).thenReturn(mPreference); mSoftApConfiguration = new SoftApConfiguration.Builder().setSsid(SSID).build(); when(mWifiManager.getSoftApConfiguration()).thenReturn(mSoftApConfiguration); when(mTetheringManager.getTetherableWifiRegexs()).thenReturn(new String[]{"1", "2"}); - mController = new WifiTetherPreferenceController(mContext, mLifecycle, - false /* initSoftApManager */); - mController.mIsWifiTetheringAllow = true; + mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, + mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); mController.displayPreference(mScreen); } @Test public void isAvailable_noTetherRegex_shouldReturnFalse() { when(mTetheringManager.getTetherableWifiRegexs()).thenReturn(new String[]{}); - mController = new WifiTetherPreferenceController(mContext, mLifecycle, - false /* initSoftApManager */); + mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, + mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); assertThat(mController.isAvailable()).isFalse(); } @@ -114,16 +104,19 @@ public class WifiTetherPreferenceControllerTest { @Test public void displayPreference_wifiTetheringNotAllowed_shouldDisable() { - mController.mIsWifiTetheringAllow = false; + mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, + mTetheringManager, false /* initSoftApManager */, false /* isWifiTetheringAllow */); mController.displayPreference(mScreen); assertThat(mPreference.isEnabled()).isFalse(); + assertThat(mPreference.getSummary()).isEqualTo("Not allowed by your organization"); } @Test public void displayPreference_wifiTetheringAllowed_shouldEnable() { - mController.mIsWifiTetheringAllow = true; + mController = new WifiTetherPreferenceController(mContext, mLifecycle, mWifiManager, + mTetheringManager, false /* initSoftApManager */, true /* isWifiTetheringAllow */); mController.displayPreference(mScreen); From aedbfeb8b85eff1f28fcaaf71d0826f76f7afab7 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Thu, 28 Apr 2022 18:46:21 +0000 Subject: [PATCH 13/18] Import translations. DO NOT MERGE ANYWHERE BUG:205460459 Auto-generated-cl: translation import Change-Id: I5bb2a5d970bbdff0ea715cef8f0fca7bd052a670 --- res/values-af/strings.xml | 2 +- res/values-am/strings.xml | 2 +- res/values-ar/strings.xml | 2 +- res/values-as/strings.xml | 2 +- res/values-az/strings.xml | 2 +- res/values-b+sr+Latn/strings.xml | 2 +- res/values-be/strings.xml | 2 +- res/values-bg/strings.xml | 2 +- res/values-bn/strings.xml | 2 +- res/values-bs/strings.xml | 2 +- res/values-ca/strings.xml | 2 +- res/values-cs/strings.xml | 2 +- res/values-da/strings.xml | 2 +- res/values-de/strings.xml | 2 +- res/values-el/strings.xml | 2 +- res/values-en-rAU/strings.xml | 2 +- res/values-en-rCA/strings.xml | 2 +- res/values-en-rGB/strings.xml | 2 +- res/values-en-rIN/strings.xml | 2 +- res/values-en-rXC/strings.xml | 2 +- res/values-es-rUS/strings.xml | 2 +- res/values-es/strings.xml | 2 +- res/values-et/strings.xml | 2 +- res/values-eu/strings.xml | 2 +- res/values-fa/strings.xml | 2 +- res/values-fi/strings.xml | 2 +- res/values-fr-rCA/strings.xml | 2 +- res/values-fr/strings.xml | 2 +- res/values-gl/strings.xml | 2 +- res/values-gu/strings.xml | 2 +- res/values-hi/strings.xml | 2 +- res/values-hr/strings.xml | 2 +- res/values-hu/strings.xml | 2 +- res/values-hy/strings.xml | 2 +- res/values-in/strings.xml | 2 +- res/values-is/strings.xml | 2 +- res/values-it/strings.xml | 2 +- res/values-iw/strings.xml | 2 +- res/values-ja/strings.xml | 2 +- res/values-ka/strings.xml | 2 +- res/values-kk/strings.xml | 2 +- res/values-km/strings.xml | 2 +- res/values-kn/strings.xml | 2 +- res/values-ko/strings.xml | 2 +- res/values-ky/strings.xml | 2 +- res/values-lo/strings.xml | 2 +- res/values-lt/strings.xml | 2 +- res/values-lv/strings.xml | 2 +- res/values-mk/strings.xml | 2 +- res/values-ml/strings.xml | 2 +- res/values-mn/strings.xml | 2 +- res/values-mr/strings.xml | 2 +- res/values-ms/strings.xml | 2 +- res/values-my/strings.xml | 2 +- res/values-nb/strings.xml | 2 +- res/values-ne/strings.xml | 2 +- res/values-nl/strings.xml | 2 +- res/values-or/strings.xml | 2 +- res/values-pa/strings.xml | 2 +- res/values-pl/strings.xml | 2 +- res/values-pt-rBR/strings.xml | 2 +- res/values-pt-rPT/strings.xml | 2 +- res/values-pt/strings.xml | 2 +- res/values-ro/strings.xml | 2 +- res/values-ru/strings.xml | 2 +- res/values-si/strings.xml | 2 +- res/values-sk/strings.xml | 2 +- res/values-sl/strings.xml | 2 +- res/values-sq/strings.xml | 2 +- res/values-sr/strings.xml | 2 +- res/values-sv/strings.xml | 2 +- res/values-sw/strings.xml | 2 +- res/values-ta/strings.xml | 2 +- res/values-te/strings.xml | 2 +- res/values-th/strings.xml | 2 +- res/values-tl/strings.xml | 2 +- res/values-tr/strings.xml | 2 +- res/values-uk/strings.xml | 2 +- res/values-ur/strings.xml | 2 +- res/values-uz/strings.xml | 2 +- res/values-vi/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 2 +- res/values-zh-rHK/strings.xml | 2 +- res/values-zh-rTW/strings.xml | 2 +- res/values-zu/strings.xml | 2 +- 85 files changed, 85 insertions(+), 85 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 73032af8110..45b4aef3bf7 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -3227,7 +3227,7 @@ "Koppel aan %s" "Ontkoppel hierdie VPN?" "Ontkoppel" - "Weergawe %s" + "Weergawe" "Vergeet VPN" "Vervang bestaande VPN?" "Stel altyd-aan VPN?" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 8d638aa5855..5e18990aa9c 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -3227,7 +3227,7 @@ "ከ%s ጋር ተገናኝ" "የዚህ ቪፒኤን ግንኙነት ይቋረጥ?" "ግንኙነት አቋርጥ" - "ሥሪት %s" + "ስሪት" "VPNን እርሳ" "አሁን ያለው VPN ይተካ?" "ሁልጊዜ-የበራ VPN ይቀናበር?" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 39f3586b879..100c2f0d6ea 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -3387,7 +3387,7 @@ "الاتصال بـ %s" "‏هل تريد قطع الاتصال بهذه الشبكة الافتراضية الخاصة (VPN)؟" "قطع الاتصال" - "الإصدار %s" + "الإصدار" "نسيان الشبكة الافتراضية الخاصة" "هل تريد استبدال الشبكة الافتراضية الخاصة الحالية؟" "هل تريد تشغيل الشبكة الافتراضية الخاصة باستمرار؟" diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 3c248752b59..43e197b2a80 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -3227,7 +3227,7 @@ "%sৰ সৈতে সংযোগ কৰক" "এই ভিপিএনটোৰ সৈতে সংযোগ বিচ্ছিন্ন কৰিবনে?" "সংযোগ বিচ্ছিন্ন কৰক" - "সংস্কৰণ %s" + "সংস্কৰণ" "ভিপিএন পাহৰক" "পূৰ্বৰ ভিপিএনটো সলনি কৰেনে?" "ভিপিএনক যিকোনো সময়ত অন থকা অবস্থাত ছেট কৰিবনে?" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index 27eaee3fd6f..37c2fae0a92 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -3227,7 +3227,7 @@ "%s profilinə qoşulun" "Bu VPN bağlantısı kəsilsin?" "Bağlantını kəsin" - "Versiya %s" + "Versiya" "VPN\'i unudun" "Mövcud VPN əvəz edilsin?" "Hər zaman aktiv VPN quraşdırılsın?" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 08c2d7ec65a..0a548765ad3 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -3267,7 +3267,7 @@ "Povezivanje na profil %s" "Želite li da prekinete vezu sa ovim VPN-om?" "Prekini vezu" - "Verzija %s" + "Verzija" "Zaboravi VPN" "Želite li da zamenite postojeći VPN?" "Želite li da podesite uvek uključeni VPN?" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index c17451ae74b..a933baa371a 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -3309,7 +3309,7 @@ "Падключэнне да профiлю %s" "Адключыць гэту VPN?" "Адключыць" - "Версія %s" + "Версія" "Забыць VPN" "Замяніць існуючую VPN?" "Наладзіць заўсёды ўключаную VPN?" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index ee182964d0f..bb58ec92898 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -3229,7 +3229,7 @@ "Свързване със: %s" "Да се прекрати ли връзката с тази виртуална частна мрежа (VPN)?" "Прекратяване на връзката" - "Версия %s" + "Версия" "Забравяне на вирт. частна мрежа (VPN)" "Да се замени ли съществуващата VPN?" "Да се зададе ли винаги включена виртуална частна мрежа (VPN)?" diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index 3c9d1b7794b..0c1f4126c29 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -3227,7 +3227,7 @@ "%s এতে কানেক্ট করুন" "এই VPN থেকে ডিসকানেক্ট করবেন?" "ডিসকানেক্ট করুন" - "ভার্সন %s" + "ভার্সন" "VPN সরিয়ে দিন" "বিদ্যমান VPN প্রতিস্থাপন করতে চান?" "সর্বদা-চালু VPN সেট করতে চান?" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 483ea87a194..dc1d8a2be69 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -3267,7 +3267,7 @@ "Poveži se na %s" "Želite li prekinuti vezu s ovim VPN-om?" "Prekini vezu" - "Verzija %s" + "Verzija" "Zaboravi VPN" "Želite li zamijeniti postojeći VPN?" "Želite li postaviti uvijek uključen VPN?" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index b9c4bb25862..39676f207d1 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -3227,7 +3227,7 @@ "Connexió amb %s" "Vols desconnectar aquesta VPN?" "Desconnecta" - "Versió %s" + "Versió" "Oblida la VPN" "Vols substituir la VPN actual?" "Vols definir la VPN sempre activa?" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 2705aa10f03..a6dc51af2bd 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -3307,7 +3307,7 @@ "Připojit k profilu %s" "Odpojit tuto síť VPN?" "Odpojit" - "Verze %s" + "Verze" "Zapomenout VPN" "Nahradit stávající síť VPN?" "Nastavit trvalou síť VPN?" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 88cc2a19ff7..fb3799c8721 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -3227,7 +3227,7 @@ "Opret forbindelse til %s" "Vil du afbryde dette VPN?" "Afbryd" - "Version %s" + "Version" "Glem VPN" "Erstat det eksisterende VPN-netværk?" "Vil du konfigurere konstant VPN?" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 2dde2eec94f..70558475783 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -3230,7 +3230,7 @@ "Mit %s verbinden" "Verbindung zu diesem VPN trennen?" "Verbindung trennen" - "Version %s" + "Version" "VPN entfernen" "Aktuelles VPN ersetzen?" "Durchgehend aktives VPN aktivieren?" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index ac5783f4049..eb5a0a11d56 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -3227,7 +3227,7 @@ "Σύνδεση στο προφίλ %s" "Να αποσυνδεθεί αυτό το VPN;" "Αποσύνδεση" - "Έκδοση %s" + "Έκδοση" "Διαγραφή VPN" "Αντικατάσταση υπάρχοντος VPN;" "Ενεργοποίηση του μονίμως ενεργού VPN;" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index 1b093934a20..9885399d7b7 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -3227,7 +3227,7 @@ "Connect to %s" "Disconnect this VPN?" "Disconnect" - "Version %s" + "Version" "Forget VPN" "Replace existing VPN?" "Set always-on VPN?" diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml index 1d8ff825f5e..d802bd728b2 100644 --- a/res/values-en-rCA/strings.xml +++ b/res/values-en-rCA/strings.xml @@ -3227,7 +3227,7 @@ "Connect to %s" "Disconnect this VPN?" "Disconnect" - "Version %s" + "Version" "Forget VPN" "Replace existing VPN?" "Set always-on VPN?" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 47e75ec3438..581cedea5ff 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -3227,7 +3227,7 @@ "Connect to %s" "Disconnect this VPN?" "Disconnect" - "Version %s" + "Version" "Forget VPN" "Replace existing VPN?" "Set always-on VPN?" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index 02d24233822..02d305ce7c2 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -3227,7 +3227,7 @@ "Connect to %s" "Disconnect this VPN?" "Disconnect" - "Version %s" + "Version" "Forget VPN" "Replace existing VPN?" "Set always-on VPN?" diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml index 6f56a440efd..cc421a06256 100644 --- a/res/values-en-rXC/strings.xml +++ b/res/values-en-rXC/strings.xml @@ -3227,7 +3227,7 @@ "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‎‏‏‎‎‎‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‏‎‏‎‏‎‎‎‏‎‎‏‏‎‎‎‏‏‎‎‎‏‏‎‏‎‎Connect to ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‏‏‎‏‏‏‏‏‎‏‏‎‏‎‎‎‏‏‏‎‏‏‏‎‏‎‏‎‎‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‎‏‏‎Disconnect this VPN?‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‎‏‏‎‏‏‎‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‎‏‎‏‏‎‏‏‏‎‎‎‎‏‏‏‎‎‎‎‏‎‏‎‏‎‏‎‎‎‏‎Disconnect‎‏‎‎‏‎" - "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‏‎‏‎‎‎‏‎‏‎‎‎‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‏‎‏‏‎‎‏‏‏‎‎‏‏‎‏‏‏‏‎Version ‎‏‎‎‏‏‎%s‎‏‎‎‏‏‏‎‎‏‎‎‏‎" + "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‏‏‎‏‏‎‎‎‎‎‎‎‏‎‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‏‎‏‏‎‎‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‎‏‎‏‎‎‏‎‏‎‎‎‎‎Version‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‎‏‎‏‎‎‎‎‏‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‎‏‏‏‏‏‎‎‎‏‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‎‎‏‏‏‏‏‏‏‎‏‎Forget VPN‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‏‎‏‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎‏‏‏‏‏‏‎‎‏‎‏‎‏‎‎‏‏‎‎‎‏‏‏‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‏‎‎‎‎Replace existing VPN?‎‏‎‎‏‎" "‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‏‏‏‎‎‏‎‎‏‎‎‎‏‎‎‏‎‏‎‎‏‎‏‎‎‏‏‎‎‏‎‎‏‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‏‏‏‏‎‏‎‎Set always-on VPN?‎‏‎‎‏‎" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 83415df4740..7d4dc212090 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -3229,7 +3229,7 @@ "Conectar a %s" "¿Deseas desconectar esta VPN?" "Desconectar" - "Versión %s" + "Versión" "Borrar VPN" "¿Reemplazar VPN existente?" "¿Configurar la VPN siempre activa?" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 47629d2e33f..8a3b8fe3b9a 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -3227,7 +3227,7 @@ "Conectar a %s" "¿Desconectar esta VPN?" "Desconectar" - "Versión %s" + "Versión" "Olvidar VPN" "¿Reemplazar VPN actual?" "¿Configurar el modo de VPN siempre activada?" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 698db93d8b3..8c8372232dc 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -3229,7 +3229,7 @@ "Profiiliga %s ühendamine" "Kas soovite katkestada ühenduse selle VPN-iga?" "Katkesta ühendus" - "Versioon %s" + "Versioon" "Unusta VPN" "Kas asendada olemasolev VPN?" "Kas määrata alati sisselülitatud VPN?" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 80dc05df496..0d114ba6966 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -3227,7 +3227,7 @@ "Konektatu %s profilera" "VPN saretik deskonektatu nahi duzu?" "Deskonektatu" - "%s bertsioa" + "Bertsioa" "Ahaztu VPN konexioa" "Dagoen VPN konexioa ordeztu nahi duzu?" "VPNa beti aktibatuta egoteko aukera ezarri nahi duzu?" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 6d9f31b1232..6441aca319d 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -3227,7 +3227,7 @@ "اتصال به %s" "‏اتصال به این VPN.قطع‌ شود؟" "قطع ارتباط" - "نسخه %s" + "نسخه" "‏فراموش کردن VPN" "‏VPN موجود جایگزین شود؟" "‏VPN همیشه روشن تنظیم شود؟" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index 6eb9f31e1b2..1b30d014edd 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -3227,7 +3227,7 @@ "Yhdistä profiiliin %s" "Katkaistaanko VPN-yhteys?" "Katkaise yhteys" - "Versio %s" + "Versio" "Unohda VPN" "Korvataanko nykyinen VPN?" "Määritetäänkö aina käytössä oleva VPN?" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 231fa4c734a..b9431f661be 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -3227,7 +3227,7 @@ "Se connecter à %s" "Déconnecter ce RPV?" "Déconnecter" - "Version %s" + "Version" "Oublier le profil RPV" "Remplacer le RPV existant?" "Définir le RPV permanent?" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index a0af18914c4..090c452c531 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -3227,7 +3227,7 @@ "Se connecter à %s" "Déconnecter ce VPN ?" "Déconnecter" - "Version %s" + "Version" "Supprimer le VPN" "Remplacer le VPN existant ?" "Définir le VPN permanent ?" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 4b22471e959..52a741f8b52 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -3227,7 +3227,7 @@ "Conectar con %s" "Queres desconectar esta VPN?" "Desconectar" - "Versión %s" + "Versión" "Esquecer perfil da VPN" "Queres substituír a VPN existente?" "Queres definir a VPN como sempre activa?" diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index a03f4f30156..78180e99479 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -3227,7 +3227,7 @@ "%s સાથે કનેક્ટ કરો" "આ VPNને ડિસ્કનેક્ટ કરીએ?" "ડિસ્કનેક્ટ કરો" - "વર્ઝન %s" + "વર્ઝન" "VPN ભૂલી ગયાં" "અસ્તિત્વમાંની VPN ને બદલીએ?" "હંમેશાં ચાલુ VPN સેટ કરીએ?" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index e2b834960bd..b435d5e6b09 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -3227,7 +3227,7 @@ " %s से कनेक्ट करें" "इस VPN को डिसकनेक्ट करना चाहते हैं?" "डिसकनेक्ट करें" - "वर्शन %s" + "वर्शन" "वीपीएन भूल जाएं" "मौजूदा VPN को बदलें?" "हमेशा-चालू VPN सेट करें?" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 1b5f9732e63..4cef823b105 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -3269,7 +3269,7 @@ "Povezivanje s profilom %s" "Prekinuti vezu s VPN-om?" "Prekini vezu" - "Verzija %s" + "Verzija" "Zaboravi VPN" "Želite li zamijeniti dosadašnji VPN?" "Želite li postaviti uvijek uključeni VPN?" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 2c4ac072b86..75484b9cac7 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -3227,7 +3227,7 @@ "Csatlakozás a következőhöz: %s" "Leválasztja a VPN-t?" "Leválasztás" - "Verzió: %s" + "Verzió" "VPN elfelejtése" "Lecseréli a meglévő VPN-t?" "Beállítja a mindig bekapcsolt VPN-t?" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index c4ec1315ef7..1aed5e96f19 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -3227,7 +3227,7 @@ "Միանալ %s-ին" "Անջատե՞լ այս VPN-ը:" "Անջատել" - "Տարբերակ %s" + "Տարբերակ" "Մոռանալ VPN-ը" "Փոխարինե՞լ ընթացիկ VPN-ը:" "Սահմանե՞լ որպես «միշտ միացված» VPN:" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 82ce83fe68c..c561483379c 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -3227,7 +3227,7 @@ "Menghubungkan ke %s" "Putuskan sambungan VPN ini?" "Putuskan koneksi" - "Versi %s" + "Versi" "Lupakan VPN" "Ganti VPN yang sudah ada?" "Setel VPN selalu aktif?" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 0d153d66ac6..a523a6a0262 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -3227,7 +3227,7 @@ "Tengjast %s" "Aftengja þessa VPN-tengingu?" "Aftengja" - "Útgáfa %s" + "Útgáfa" "Gleyma VPN" "Skipta út núverandi VPN?" "Velja VPN sem alltaf er kveikt á?" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 9554f802ce2..5d783935c07 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -3227,7 +3227,7 @@ "Connessione a %s" "Disconnettere questa VPN?" "Disconnetti" - "Versione %s" + "Versione" "Rimuovi VPN" "Sostituire la rete VPN esistente?" "Impostare la rete VPN sempre attiva?" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index cd2f808524e..4aad1055a84 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -3309,7 +3309,7 @@ "התחברות אל %s" "‏האם לנתק את ה-VPN הזה?" "ניתוק" - "גרסה %s" + "גרסה" "‏אני רוצה לשכוח את ה-VPN" "‏האם להחליף רשת VPN קיימת?" "‏האם להגדיר את רשת ה-VPN בחיבור תמידי?" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 46a3b1f1eae..10587abe53a 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -3227,7 +3227,7 @@ "%sに接続" "この VPN の接続を解除しますか?" "接続を解除" - "バージョン%s" + "バージョン" "VPN を削除" "既存の VPN を置き換えますか?" "常時接続 VPN を設定しますか?" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 4ed7a8c3c2c..3996f0904ea 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -3227,7 +3227,7 @@ "დაკავშირებულია %s-თან" "გსურთ ამ VPN-თან კავშირის გაწყვეტა?" "კავშირის გაწყვეტა" - "ვერსია %s" + "ვერსია" "VPN-ის დავიწყება" "გსურთ არსებული VPN-ის ჩანაცვლება?" "გსურთ ყოველთვის ჩართული VPN-ის დაყენება?" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index e2e6a068f9d..b0281be863c 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -3227,7 +3227,7 @@ "%s профайлына жалғау" "Осы VPN желісі ажыратылсын ба?" "Ажырату" - "Нұсқасы: %s" + "Нұсқа" "VPN ұмыту" "Бар VPN қолданбасын ауыстыру керек пе?" "Әрқашан қосулы VPN режимін орнату" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 045dbf75b8d..127d23f61d8 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -3227,7 +3227,7 @@ "តភ្ជាប់ %s" "ផ្តាច់ VPN នេះ?" "ផ្ដាច់" - "កំណែ %s" + "កំណែ" "បំភ្លេច VPN" "ជំនួស VPN ដែលមានស្រាប់ឬ?" "កំណត់ VPN ឲ្យបើកជានិច្ចឬ?" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index cab4bc8c21c..57ee742a805 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -3227,7 +3227,7 @@ "%s ಗೆ ಸಂಪರ್ಕಿಸಿ" "ಈ VPN ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸುವುದೇ?" "ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಿ" - "%s ಆವೃತ್ತಿ" + "ಆವೃತ್ತಿ" "VPN ಮರೆತುಬಿಡು" "ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ VPN ಸ್ಥಾನಾಂತರಿಸುವುದೇ?" "VPN ಯಾವಾಗಲೂ ಆನ್ ಆಗಿರುವಂತೆ ಹೊಂದಿಸುವುದೇ?" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index c0a0954c0de..d5c6c8f0553 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -3229,7 +3229,7 @@ "%s에 연결" "이 VPN을 연결 해제하시겠습니까?" "연결 해제" - "버전 %s" + "버전" "VPN 삭제" "기존 VPN을 교체하시겠습니까?" "연결 유지 VPN을 설정하시겠습니까?" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 5881d23699f..f4d5d854587 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -3227,7 +3227,7 @@ "%s менен байланышуу" "Бул VPN ажыратылсынбы?" "Ажыратуу" - "%s версиясы" + "Версия" "VPN профили унутулсун" "Учурдагы VPN алмаштырылсынбы?" "Туруктуу VPN\'ди жөндөйсүзбү?" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index f2a469a5080..c017f918a1f 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -3227,7 +3227,7 @@ "ເຊື່ອມຕໍ່ຫາ %s" "ຕັດການເຊື່ອມຕໍ່ VPN ນີ້ບໍ?" "ຕັດການເຊື່ອມຕໍ່" - "ເວີ​ຊັນ %s" + "ເວີຊັນ" "ລືມ VPN" "ຂຽນທັບ VPN ທີ່ມີຢູ່ກ່ອນແລ້ວຂອງທ່ານບໍ?" "Set always-on VPN?" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index de77ce8c476..f4e583ca009 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -3307,7 +3307,7 @@ "Prisijungti prie %s" "Atsijungti nuo šio VPN?" "Atsijungti" - "%s versija" + "Versija" "Pamiršti VPN" "Pakeisti esamą VPN?" "Nustatyti visada įjungtą VPN?" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index 4912151fd48..3641708618f 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -3267,7 +3267,7 @@ "Savienojuma izveide ar %s" "Vai pārtraukt šo VPN savienojumu?" "Pārtraukt savienojumu" - "Versija %s" + "Versija" "Aizmirst VPN" "Vai aizstāt esošo VPN?" "Vai iestatīt vienmēr ieslēgtu VPN?" diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 0ac860b6fa3..b80344d429b 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -3229,7 +3229,7 @@ "Поврзи се со %s" "Да се исклучи оваа VPN?" "Прекини врска" - "Верзија %s" + "Верзија" "Заборави VPN" "Да се замени постојната VPN?" "Да се постави „секогаш вклучена“ VPN?" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 0533ad95351..20cb114d163 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -3227,7 +3227,7 @@ "%s എന്നതിലേക്ക് കണക്റ്റുചെയ്യുക" "ഈ VPN വിച്ഛേദിക്കണോ?" "വിച്ഛേദിക്കുക" - "പതിപ്പ് %s" + "പതിപ്പ്" "VPN മറക്കുക" "നിലവിലുള്ള VPN-ന് പകരം പുതിയതാക്കണോ?" "\'എല്ലായ്പ്പോഴും ഓൺ\' VPN സജ്ജമാക്കണോ?" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index dfe2647fbec..51b1cb6b037 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -3227,7 +3227,7 @@ "%s руу холбогдох" "Энэ VPN-г салгах уу?" "Салгах" - "Хувилбар %s" + "Хувилбар" "VPN-г мартах" "Энэ VPN-г солих уу?" "VPN-г тогтмол асаалттайгаар тохируулах уу?" diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 5bc004d4629..b1086804c7a 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -3228,7 +3228,7 @@ "%s शी कनेक्ट करा" "हे VPN डिस्कनेक्ट करायचे?" "‍डिस्कनेक्ट करा" - "आवृत्ती %s" + "आवृत्ती" "VPN विसरा" "विद्यमान VPN पुनर्स्थित करायचे?" "नेहमी-सुरू VPN सेट करायचे?" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 11b6f565d36..5125835b6c8 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -3227,7 +3227,7 @@ "Sambung ke %s" "Putuskan sambungan VPN ini?" "Putuskan sambungan" - "Versi %s" + "Versi" "Lupakan VPN" "Gantikan VPN yang sedia ada?" "Tetapkan VPN sentiasa hidup?" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 9a79483aaa1..086216ea935 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -3227,7 +3227,7 @@ "%s နှင့် ချိတ်ဆက်ခြင်း" "ဤ VPN အား ချိတ်ဆက်မှု ဖြုတ်လိုပါသလား။" "ဆက်သွယ်မှု ဖြတ်ရန်" - "ဗားရှင်း %s" + "ဗားရှင်း" "VPN ကိုမေ့လိုက်ပါ" "ရှိပြီးသား VPN ကိုအစားထိုးမလား။" "VPN ကို အမြဲတမ်းဖွင့်ထားရန် သတ်မှတ်မလား။" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 984e3658ff7..79facd13d09 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -3227,7 +3227,7 @@ "Koble til %s" "Vil du koble fra dette VPN-et?" "Koble fra" - "Versjon %s" + "Versjon" "Glem VPN-profilen" "Vil du erstatte det nåværende VPN-et?" "Vil du angi alltid på-VPN?" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index de1e734006d..c9fe527d3e9 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -3227,7 +3227,7 @@ "%s मा जोड्नुहोस्" "यो VPN को जडान विच्छेद गर्ने हो?" "डिस्कनेक्ट गर्नुहोस्" - "संस्करण %s" + "संस्करण" "VPN लाई बिर्सनुहोस्" "विद्यमान VPN लाई बदल्ने हो?" "सधैँ-सक्रिय VPN लाई सेट गर्ने हो?" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 863788a1aae..bd5354b65c2 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -3227,7 +3227,7 @@ "Verbinding maken met %s" "Verbinding met dit VPN verbreken?" "Verbinding verbreken" - "Versie %s" + "Versie" "VPN vergeten" "Bestaande VPN vervangen?" "Always-on VPN instellen?" diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index d876f34b8d4..17f4d9b2d54 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -3227,7 +3227,7 @@ "%s ସହ ସଂଯୋଗ କରନ୍ତୁ" "ଏହି VPNକୁ ବିଚ୍ଛିନ୍ନ କରିବେ?" "ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ" - "ସଂସ୍କରଣ %s" + "ସଂସ୍କରଣ" "VPNକୁ ଭୁଲିଯାଅ" "ପୂର୍ବରୁ ଥିବା VPNକୁ ବଦଳାଇବେ?" "ସର୍ବଦା-ଅନ୍‌ ଥିବା VPN ସେଟ୍‌ କରିବେ?" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 9249ec1ed99..550d9b3d341 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -3227,7 +3227,7 @@ "%s ਨਾਲ ਕਨੈਕਟ ਕਰੋ" "ਇਹ VPN ਡਿਸਕਨੈਕਟ ਕਰੀਏ?" "ਡਿਸਕਨੈਕਟ ਕਰੋ" - "ਵਰਜਨ %s" + "ਵਰਜਨ" "VPN ਨੂੰ ਭੁੱਲ ਜਾਓ" "ਕੀ ਮੌਜੂਦਾ VPN ਨੂੰ ਤਬਦੀਲ ਕਰਨਾ ਹੈ?" "ਕੀ ਹਮੇਸ਼ਾ-ਚਾਲੂ VPN ਨੂੰ ਸੈੱਟ ਕਰਨਾ ਹੈ?" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 8fcd1e74451..3b4eda95c6e 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -3307,7 +3307,7 @@ "Połącz z: %s" "Odłączyć tę sieć VPN?" "Odłącz" - "Wersja %s" + "Wersja" "Zapomnij VPN" "Zastąpić obecną sieć VPN?" "Ustawić stały VPN?" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index e067e806e7c..f1a848c70dc 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -3229,7 +3229,7 @@ "Conectar a %s" "Desconectar esta VPN?" "Desconectar" - "Versão %s" + "Versão" "Esquecer VPN" "Substituir VPN já existente?" "Configurar VPN sempre ativa?" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 47596ddbe86..88815fe8b66 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -3227,7 +3227,7 @@ "Ligar a %s" "Pretende desligar esta VPN?" "Desligar" - "Versão %s" + "Versão" "Esquecer VPN" "Pretende substituir a VPN existente?" "Pretende definir a VPN como sempre ativa?" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index e067e806e7c..f1a848c70dc 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -3229,7 +3229,7 @@ "Conectar a %s" "Desconectar esta VPN?" "Desconectar" - "Versão %s" + "Versão" "Esquecer VPN" "Substituir VPN já existente?" "Configurar VPN sempre ativa?" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 15cf08cf4dc..9a818f263f5 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -3269,7 +3269,7 @@ "Conectați-vă la %s" "Doriți să vă deconectați de la această rețea VPN?" "Deconectați-vă" - "Versiunea %s" + "Versiune" "Eliminați profilul VPN" "Înlocuiți rețeaua VPN existentă?" "Setați rețeaua VPN ca activată permanent?" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index b47e3682edb..e16cf77edd4 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -3307,7 +3307,7 @@ "Подключение к %s" "Отключиться от VPN?" "Да" - "Версия %s" + "Версия" "Удалить VPN" "Сменить текущую VPN-сеть?" "Настроить постоянную VPN-сеть?" diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index 98abb475060..f334845bdbb 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -3227,7 +3227,7 @@ "%s වෙත සම්බන්ධ කරන්න" "මෙම VPN එක විසන්ධි කරන්නද?" "විසන්ධි කරන්න" - "අනුවාදය %s" + "අනුවාදය" "VPN අමතක කරන්න" "පවතින VPN ප්‍රතිස්ථාපනය කරන්නද?" "සැම විට ක්‍රියාත්මක VPN සකසන්නද?" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index ffca195fee8..3c9eef5de73 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -3309,7 +3309,7 @@ "Pripojiť k profilu %s" "Odpojiť tento profil VPN?" "Odpojiť" - "Verzia %s" + "Verzia" "Zabudnúť profil VPN" "Nahradiť existujúcu sieť VPN?" "Nastaviť sieť VPN, ktorá je vždy zapnutá?" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 91b4fde8a97..283be4f8d19 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -3309,7 +3309,7 @@ "Povezovanje z %s" "Prekinitev povezave s tem omrežjem VPN?" "Prekini povezavo" - "Različica %s" + "Različica" "Pozabi omrežje VPN" "Želite zamenjati obstoječe omrežje VPN?" "Ali želite, da je omrežje VPN stalno vklopljeno?" diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index 30dff167884..9d9942c653c 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -3227,7 +3227,7 @@ "Lidhu me %s" "Shkëpute këtë rrjet VPN" "Shkëpute" - "Versioni %s" + "Versioni" "Harroje rrjetin VPN" "Të zëvendësohet rrjeti ekzistues VPN?" "Të caktohet rrjeti VPN gjithmonë aktiv?" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 9ca17a1af8e..b8b126080ca 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -3267,7 +3267,7 @@ "Повезивање на профил %s" "Желите ли да прекинете везу са овим VPN-ом?" "Прекини везу" - "Верзија %s" + "Верзија" "Заборави VPN" "Желите ли да замените постојећи VPN?" "Желите ли да подесите увек укључени VPN?" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index 9d19869c30a..62ed41546ee 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -3227,7 +3227,7 @@ "Anslut till %s" "Vill du koppla från VPN?" "Koppla från" - "Version %s" + "Version" "Glöm VPN" "Vill du byta ut befintligt VPN?" "Vill du ange Always-on VPN?" diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index 5e490861d3d..0ef4427b6f3 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -3227,7 +3227,7 @@ "Unganisha kwa %s" "Ungependa kuondoa VPN hii?" "Kata muungnisho" - "Toleo la %s" + "Toleo" "Ondoa VPN" "Ungependa kubadilisha VPN iliyopo?" "Ungependa kuweka VPN iliyowashwa kila mara?" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 63f8bf36404..a1d32786418 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -3227,7 +3227,7 @@ "%s உடன் இணை" "VPNஐத் துண்டிக்கவா?" "தொடர்பைத் துண்டி" - "பதிப்பு %s" + "பதிப்பு" "VPNஐ நீக்கு" "தற்போதுள்ள VPNஐ மாற்றியமைக்கவா?" "எப்போதும் இயங்கும் VPNஐ அமைக்கவா?" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 853e9081e70..3bee006e0a7 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -3227,7 +3227,7 @@ "%sకి కనెక్ట్ చేయండి" "ఈ VPNను డిస్‌కనెక్ట్ చేయాలా?" "డిస్‌కనెక్ట్ చేయి" - "వెర్షన్ %s" + "వెర్షన్" "VPNని విస్మరించు" "ఇప్పటికే ఉన్న VPNని భర్తీ చేయాలా?" "ఎల్లప్పుడూ ఆన్‌లో ఉండే VPNని సెట్ చేయాలా?" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index c37f298c692..0f75c2f6851 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -3227,7 +3227,7 @@ "เชื่อมต่อกับ %s" "ยกเลิกการเชื่อมต่อ VPN นี้ไหม" "ยกเลิกการเชื่อมต่อ" - "เวอร์ชัน %s" + "รุ่น" "ลืม VPN" "แทนที่ VPN ที่มีอยู่หรือไม่" "ตั้งค่า VPN แบบเปิดตลอดเวลาหรือไม่" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index b932ff19290..297d2fdc8a6 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -3227,7 +3227,7 @@ "Kumonekta sa %s" "Putulin ang koneksyon ng VPN na ito?" "Putulin ang koneksyon" - "Bersyon %s" + "Bersyon" "Kalimutan ang VPN" "Gusto mo bang palitan ang dati nang VPN?" "Gusto mo bang itakda ang VPN na palaging naka-on?" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index d11861beb29..88988e9193a 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -3227,7 +3227,7 @@ "%s profiline bağlan" "Bu VPN\'nin bağlantısı kesilsin mi?" "Bağlantıyı kes" - "Sürüm %s" + "Sürüm" "VPN\'yi unut" "Mevcut VPN değiştirilsin mi?" "Her zaman açık VPN ayarlansın mı?" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index a3fac8e1aa1..15b037f17d5 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -3307,7 +3307,7 @@ "Під’єднатися до профілю %s" "Відключити цю мережу VPN?" "Відключити" - "Версія %s" + "Версія" "Забути мережу VPN" "Замінити наявну мережу VPN?" "Увімкнути постійну мережу VPN?" diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 76d87932ddc..94ae67c9836 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -3227,7 +3227,7 @@ "%s سے مربوط کریں" "‏اس VPN سے غیر منسلک کریں؟" "غیر منسلک کریں" - "ورژن %s" + "ورژن" "‏VPN بھول جائیں" "‏موجودہ VPN بدلیں؟" "‏ہمیشہ آن VPN سیٹ کریں؟" diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 5f05f02f5fc..f9ad0a90e70 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -3229,7 +3229,7 @@ "%s tarmog‘iga ulanish" "Bu VPN bilan aloqa uzilsinmi?" "Aloqani uzish" - "%s versiya" + "Versiya" "VPNni o‘chirish" "Mavjud VPN tarmog‘i almashtirilsinmi?" "Doimiy VPN o‘rnatilsinmi?" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index c7af148220b..83518e12714 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -3229,7 +3229,7 @@ "Kết nối với %s" "Ngắt kết nối VPN này?" "Ngắt kết nối" - "Phiên bản %s" + "Phiên bản" "Xóa VPN" "Thay thế VPN hiện có?" "Đặt VPN luôn bật?" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 524ad9d356d..cc1ce4f5d31 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -3227,7 +3227,7 @@ "连接到%s" "要断开与此 VPN 的连接吗?" "断开连接" - "版本 %s" + "版本" "取消保存 VPN" "要替换现有 VPN 吗?" "要设置始终开启的 VPN 吗?" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 019b47db531..4a1e86c13e5 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -3230,7 +3230,7 @@ "連接「%s」" "要解除連結此 VPN 嗎?" "中斷連線" - "版本為:%s" + "版本" "刪除 VPN" "要取代目前的 VPN 嗎?" "要設定保持開啟的 VPN 嗎?" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 972e8f9fc5d..a64e3dca8b7 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -3229,7 +3229,7 @@ "連線到「%s」" "要中斷這個 VPN 連線嗎?" "中斷連線" - "版本 %s" + "版本" "清除 VPN 設定檔" "要取代現有的 VPN 嗎?" "要設定永久連線的 VPN 嗎?" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 8fcaebe7508..ed6148b82de 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -3228,7 +3228,7 @@ "Xhuma ku-%s" "Nqamula le-VPN" "Nqamula" - "Inguqulo engu-%s" + "Uhlobo" "Khohlwa i-VPN" "Shintshanisa i-VPN ekhona?" "Setha i-VPN ehlala ivuliwe?" From 5e3d75a6f980916e70f779d00a19e62ec69816e4 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Fri, 29 Apr 2022 03:41:56 +0800 Subject: [PATCH 14/18] Show restricted message in Wi-Fi Direct summary - See the result screenshot in b/203168953#comment9 Bug: 203168953 Test: manual test make RunSettingsRoboTests \ ROBOTEST_FILTER=WifiP2PPreferenceControllerTest Change-Id: I87ad6d7554fbb4aa86d4617438fa359c67544812 --- .../settings/wifi/p2p/WifiP2pPreferenceController.java | 6 ++++-- .../settings/wifi/p2p/WifiP2PPreferenceControllerTest.java | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java index db150dab3b5..5d73fa464f1 100644 --- a/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java +++ b/src/com/android/settings/wifi/p2p/WifiP2pPreferenceController.java @@ -15,18 +15,17 @@ */ package com.android.settings.wifi.p2p; -import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.location.LocationManager; import android.net.wifi.WifiManager; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; @@ -70,6 +69,9 @@ public class WifiP2pPreferenceController extends AbstractPreferenceController super.displayPreference(screen); mWifiDirectPref = screen.findPreference(KEY_WIFI_DIRECT); togglePreferences(); + if (!mIsWifiDirectAllow) { + mWifiDirectPref.setSummary(R.string.not_allowed_by_ent); + } } @Override diff --git a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java index a9d5611918d..e292f24e5ce 100644 --- a/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/p2p/WifiP2PPreferenceControllerTest.java @@ -22,12 +22,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -40,6 +38,7 @@ import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; +import com.android.settings.R; import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; @@ -142,6 +141,7 @@ public class WifiP2PPreferenceControllerTest { mController.displayPreference(mScreen); verify(mWifiDirectPreference).setEnabled(false); + verify(mWifiDirectPreference).setSummary(R.string.not_allowed_by_ent); } @Test From 1c3cb4505c1abe58f16f1f00475b5f397617a301 Mon Sep 17 00:00:00 2001 From: ykhung Date: Fri, 29 Apr 2022 10:35:39 +0800 Subject: [PATCH 15/18] Hide running time information for "Android System" entry Hide the running time information for "Android System" entry, since this entry will combine multiple system components together. It will provide incorrect running time information. The getRealUid() method maps many UIDs to Process.SYSTEM_UID(1000), which results in combining all of those UIDs into one "Android System" entry. This is the expected behavior. Bug: 220717612 Test: make RunSettingsRoboTests -j56 ROBOTEST_FILTER="com.android.settings.fuelgauge" Change-Id: I0aece0f1e86c36e55a2b5a966b4da9fdea14c748 --- .../settings/fuelgauge/BatteryAppListPreferenceController.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index 8fb0d1e0f64..db4cc536579 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -424,6 +424,9 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro @VisibleForTesting void setUsageSummary(Preference preference, BatteryEntry entry) { + if (entry.getUid() == Process.SYSTEM_UID) { + return; + } // Only show summary when usage time is longer than one minute final long usageTimeMs = entry.getTimeInForegroundMs(); if (shouldShowSummary(entry) && usageTimeMs >= DateUtils.MINUTE_IN_MILLIS) { From 0f68faf99669f4654a3797f238520501cc2c7988 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Wed, 27 Apr 2022 14:27:04 +0800 Subject: [PATCH 16/18] [Settings] Avoid from crash UI when querying data usage Screen update been requested while querying data usage and response not yet available. This change tried to avoid from updating the UI in this case. Bug: 210664126 Test: local Change-Id: Id055fbd441936a9842b4acc978a894a855165bb7 --- .../android/settings/datausage/DataUsageList.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java index dc945f1fc42..4ee653017e4 100644 --- a/src/com/android/settings/datausage/DataUsageList.java +++ b/src/com/android/settings/datausage/DataUsageList.java @@ -48,6 +48,7 @@ import android.widget.ImageView; import android.widget.Spinner; import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.Lifecycle; import androidx.loader.app.LoaderManager.LoaderCallbacks; import androidx.loader.content.Loader; import androidx.preference.Preference; @@ -500,6 +501,17 @@ public class DataUsageList extends DataUsageBaseFragment + cycle.end + "]"); } + // Avoid from updating UI after #onStop. + if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) { + return; + } + + // Avoid from updating UI when async query still on-going. + // This could happen when a request from #onMobileDataEnabledChange. + if (mCycleData == null) { + return; + } + // update chart to show selected cycle, and update detail data // to match updated sweep bounds. mChart.setNetworkCycleData(mCycleData.get(position)); From a95b12f921cb7eb8eee3904850b147d845d6c78a Mon Sep 17 00:00:00 2001 From: Tsung-Mao Fang Date: Thu, 28 Apr 2022 23:40:44 +0800 Subject: [PATCH 17/18] Remove tab symbol for app pinning strings The pinning description can't align together in certain device. To mitigate the alignment problem, we try to remove the \t character now. Test: visual Fix: 222617691 Change-Id: I35974caf9d6fa316a6e4a0a5200ccab6a80f915b --- res/values/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index f87b489f5d6..57eb740b94f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10207,18 +10207,18 @@ When an app is pinned, the pinned app may open other apps and personal data may be accessible. \n\nTo use app pinning: - \t\n1.\tTurn on app pinning - \t\n2.\tOpen Overview - \t\n3.\tTap the app icon at the top of the screen, then tap Pin + \t\n1. Turn on app pinning + \t\n2. Open Overview + \t\n3. Tap the app icon at the top of the screen, then tap Pin When an app is pinned, the pinned app may open other apps and personal data may be accessible. \n\nIf you want to securely share your device with someone, try using a guest user instead. \n\nTo use app pinning: - \t\n1.\tTurn on app pinning - \t\n2.\tOpen Overview - \t\n3.\tTap the app icon at the top of the screen, then tap Pin + \t\n1. Turn on app pinning + \t\n2. Open Overview + \t\n3. Tap the app icon at the top of the screen, then tap Pin From ba943c9b946a429c456b5719247be3b1959d6c6b Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Thu, 28 Apr 2022 15:14:42 +0800 Subject: [PATCH 18/18] [Settings] Rename title of SIM UI when changed Title of subscription page should align with the SIM card. Bug: 230308627 Test: local Change-Id: Iab9ba25ac8c3faf7d37f97c8f3f3488cbaa2e228 --- .../telephony/MobileNetworkSettings.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/network/telephony/MobileNetworkSettings.java b/src/com/android/settings/network/telephony/MobileNetworkSettings.java index 763962c492f..4eb8a857232 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkSettings.java +++ b/src/com/android/settings/network/telephony/MobileNetworkSettings.java @@ -37,6 +37,7 @@ import androidx.preference.Preference; import com.android.settings.R; import com.android.settings.Settings.MobileNetworkActivity; +import com.android.settings.SettingsActivity; import com.android.settings.datausage.BillingCyclePreferenceController; import com.android.settings.datausage.DataUsageSummaryPreferenceController; import com.android.settings.network.ActiveSubscriptionsListener; @@ -54,6 +55,7 @@ import com.android.settingslib.utils.ThreadUtils; import java.util.Arrays; import java.util.List; +import java.util.function.Consumer; @SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) public class MobileNetworkSettings extends AbstractMobileNetworkSettings { @@ -275,17 +277,37 @@ public class MobileNetworkSettings extends AbstractMobileNetworkSettings { Log.d(LOG_TAG, "Callback during onResume()"); return; } + + final SubscriptionInfo subInfo = SubscriptionUtil + .getSubscriptionOrDefault(getContext(), mSubId); + + if (subInfo != null) { + /** + * Update the title when SIM stats got changed + */ + final Consumer renameTitle = activity -> { + if (activity != null && !activity.isFinishing()) { + if (activity instanceof SettingsActivity) { + final CharSequence displayName = SubscriptionUtil + .getUniqueSubscriptionDisplayName(subInfo, activity); + ((SettingsActivity)activity).setTitle(displayName); + } + } + }; + + ThreadUtils.postOnMainThread(() -> renameTitle.accept(getActivity())); + } + mActiveSubscriptionsListenerCount++; if (mActiveSubscriptionsListenerCount != 1) { return; } - if (SubscriptionUtil.getSubscriptionOrDefault(getContext(), mSubId) == null) { - finishFragment(); - return; - } - ThreadUtils.postOnMainThread(() -> { + if (subInfo == null) { + finishFragment(); + return; + } mActiveSubscriptionsListenerCount = 0; redrawPreferenceControllers(); });