From 4d762a190a55c0fba4d25862677a6761bc073828 Mon Sep 17 00:00:00 2001 From: Kevin Han Date: Wed, 30 Jun 2021 21:23:36 -0700 Subject: [PATCH 1/6] Enable hibernation by default for Settings Enable hibernation by default Bug: 192397298 Test: forrest Change-Id: I350d2e82459be2bd8b8bca4d183ac508ec199b4f --- .../applications/HibernatedAppsPreferenceController.java | 2 +- .../appinfo/HibernationSwitchPreferenceController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/HibernatedAppsPreferenceController.java b/src/com/android/settings/applications/HibernatedAppsPreferenceController.java index 898d7096ee6..9562fd7b960 100644 --- a/src/com/android/settings/applications/HibernatedAppsPreferenceController.java +++ b/src/com/android/settings/applications/HibernatedAppsPreferenceController.java @@ -182,7 +182,7 @@ public final class HibernatedAppsPreferenceController extends BasePreferenceCont private static boolean isHibernationEnabled() { return DeviceConfig.getBoolean( - NAMESPACE_APP_HIBERNATION, PROPERTY_APP_HIBERNATION_ENABLED, false); + NAMESPACE_APP_HIBERNATION, PROPERTY_APP_HIBERNATION_ENABLED, true); } /** diff --git a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java index 42f862dac17..1d34a13e1ff 100644 --- a/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/HibernationSwitchPreferenceController.java @@ -144,7 +144,7 @@ public final class HibernationSwitchPreferenceController extends AppInfoPreferen private static boolean isHibernationEnabled() { return DeviceConfig.getBoolean( - NAMESPACE_APP_HIBERNATION, PROPERTY_APP_HIBERNATION_ENABLED, false); + NAMESPACE_APP_HIBERNATION, PROPERTY_APP_HIBERNATION_ENABLED, true); } private static boolean hibernationTargetsPreSApps() { From 53bae52e652d35b44e0f9982289ba3dcd4cdc242 Mon Sep 17 00:00:00 2001 From: Peter_Liang Date: Wed, 7 Jul 2021 15:16:34 +0800 Subject: [PATCH 2/6] Update the preview image of caption preference fragment. Bug: 192432531 Test: manual test Change-Id: I5d8960821d5411af39035da4b77fadd9a7b9c26d --- .../accessibility_captions_banner.xml | 52 ++++++++++++++++++ res/drawable/accessibility_captions.png | Bin 1428 -> 0 bytes .../accessibility_captions_banner.xml | 52 ++++++++++++++++++ res/layout/accessibility_captions_preview.xml | 30 ---------- res/xml/captioning_settings.xml | 5 +- 5 files changed, 106 insertions(+), 33 deletions(-) create mode 100644 res/drawable-night/accessibility_captions_banner.xml delete mode 100644 res/drawable/accessibility_captions.png create mode 100644 res/drawable/accessibility_captions_banner.xml delete mode 100644 res/layout/accessibility_captions_preview.xml diff --git a/res/drawable-night/accessibility_captions_banner.xml b/res/drawable-night/accessibility_captions_banner.xml new file mode 100644 index 00000000000..7ee30f23f48 --- /dev/null +++ b/res/drawable-night/accessibility_captions_banner.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/res/drawable/accessibility_captions.png b/res/drawable/accessibility_captions.png deleted file mode 100644 index 718f4ef6dd8e8f7c9ef0c87b01f586997a350eea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1428 zcmeAS@N?(olHy`uVBq!ia0y~yV6k9eV3J{B28ukq%)AUpNd)+WxVjhk+`aek&fSN% z@7}+4=l-tarxat9vXyTmB+-Or{WdzZe06X!Wg8z0;2-#wqSaklrh5 zBc}UlYjiH}Kkr)mcmLZh^zyWoo&P_({i<+_`=t|?;@?cnT6v4@=j_``!M~MGe5vVo z@y@&DxXL~I=E=hEX%k-m^1OJma9MB3>A%4~eByl9`#yVoF61ff_%Bi0|M1}D6PG@* zA6Hz=yG_^b$19^rIxm|aD=p>a+y1CII#92#tbWTzH?CVN9_8qYAD?NKcC~PSluYtb z?bL5Yo{qDJbV&}%g-fJzUU41a)k%5q= zsQaGHZbr9u{0;AV9Dcd)%IDo7GT(XoJfmLyIe)=P#`tkY_Ckwk8{gFIdH*PF>&Zfn zw4;HUMQbMZ{n6a}Fa-ka2o}UX3vbaOq`Kz2b~jch}fBS`RpzpvV#lgC@O8(Dfl z69Y~U)@Kd8h6g=xq!Xgeckz7)I8=jgO&bIR6i=x&~Te4#+B%CU{?!C#XK zza(_+O^`WuT*mg)(Z=Mb{nvJ}zC333zV*=#xz-7}C54fhMLv5=ECTFSnOHi>1V6TL zTWX^SYMQu+7rtCL2nc64PG_K3<~ow%(3@srY>7QZ4sO^azaTlcM~ z@QC5P*T;1|HuRc33QftJ_-yiT!!4#Ke*N|c_t!plaUaJg+xyzb1k>lU-rQF$tNOU( zcs8hvxEjBtZX^53U#C5;C|&+kDe~lyq0UL?{Qgy21a*tHx@S*VoGyP`cT?=0Y3^X(oAU;X}Ajz9qhm7a4*+JC{;ll-5~iGxHuUHx3vIVCg!05;b}JOBUy diff --git a/res/drawable/accessibility_captions_banner.xml b/res/drawable/accessibility_captions_banner.xml new file mode 100644 index 00000000000..6597ffb5768 --- /dev/null +++ b/res/drawable/accessibility_captions_banner.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + diff --git a/res/layout/accessibility_captions_preview.xml b/res/layout/accessibility_captions_preview.xml deleted file mode 100644 index 1818e64eec0..00000000000 --- a/res/layout/accessibility_captions_preview.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - diff --git a/res/xml/captioning_settings.xml b/res/xml/captioning_settings.xml index b39714632b3..f5059e595f2 100644 --- a/res/xml/captioning_settings.xml +++ b/res/xml/captioning_settings.xml @@ -21,12 +21,11 @@ android:persistent="false" android:title="@string/accessibility_captioning_title"> - Date: Tue, 6 Jul 2021 14:42:04 +0800 Subject: [PATCH 3/6] [Settings] Hide subscriptions not existed within device For non-active subscriptions, the one inserted in slot but turned off need to be visible to the user. However, the one un-plugged need to be invisble. Since SubscriptionUtil#getSelectableSubscriptionInfoList() didn't cover all the cases required. Create this one to fit into the criteria required here. Note: subscriptions with same group UUID will be displayed seperately. Bug: 191228344 Test: local Change-Id: Ia68c23b007164b7520456cb6c7427ca142558b59 (cherry picked from commit 75f1450bbf9e40f2c465a2db9d7391736f91973c) (cherry picked from commit 0726f263a89e64a13a16679c313fccfc17bf91fd) --- .../settings/network/SubscriptionUtil.java | 2 +- .../network/helper/QueryEsimCardId.java | 58 +++++++ .../network/helper/QuerySimSlotIndex.java | 87 ++++++++++ .../helper/SelectableSubscriptions.java | 160 +++++++++++++++++ .../helper/SubscriptionAnnotation.java | 163 ++++++++++++++++++ .../network/helper/SubscriptionGrouping.java | 96 +++++++++++ .../telephony/MobileNetworkActivity.java | 21 ++- .../helper/SelectableSubscriptionsTest.java | 64 +++++++ .../helper/SubscriptionGroupingTest.java | 137 +++++++++++++++ 9 files changed, 781 insertions(+), 7 deletions(-) create mode 100644 src/com/android/settings/network/helper/QueryEsimCardId.java create mode 100644 src/com/android/settings/network/helper/QuerySimSlotIndex.java create mode 100644 src/com/android/settings/network/helper/SelectableSubscriptions.java create mode 100644 src/com/android/settings/network/helper/SubscriptionAnnotation.java create mode 100644 src/com/android/settings/network/helper/SubscriptionGrouping.java create mode 100644 tests/unit/src/com/android/settings/network/helper/SelectableSubscriptionsTest.java create mode 100644 tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java diff --git a/src/com/android/settings/network/SubscriptionUtil.java b/src/com/android/settings/network/SubscriptionUtil.java index 48ff591a43e..41760de6e04 100644 --- a/src/com/android/settings/network/SubscriptionUtil.java +++ b/src/com/android/settings/network/SubscriptionUtil.java @@ -486,7 +486,7 @@ public class SubscriptionUtil { * @param info the subscriptionInfo to check against. * @return true if this subscription should be visible to the API caller. */ - private static boolean isSubscriptionVisible( + public static boolean isSubscriptionVisible( SubscriptionManager subscriptionManager, Context context, SubscriptionInfo info) { if (info == null) return false; // If subscription is NOT grouped opportunistic subscription, it's visible. diff --git a/src/com/android/settings/network/helper/QueryEsimCardId.java b/src/com/android/settings/network/helper/QueryEsimCardId.java new file mode 100644 index 00000000000..dc29c47f133 --- /dev/null +++ b/src/com/android/settings/network/helper/QueryEsimCardId.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network.helper; + +import android.telephony.TelephonyManager; +import android.telephony.UiccCardInfo; + +import java.util.List; +import java.util.Objects; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicIntegerArray; + +/** + * This is a Callable class which queries valid card ID for eSIM + */ +public class QueryEsimCardId implements Callable { + private static final String TAG = "QueryEsimCardId"; + + private TelephonyManager mTelephonyManager; + + /** + * Constructor of class + * @param TelephonyManager + */ + public QueryEsimCardId(TelephonyManager telephonyManager) { + mTelephonyManager = telephonyManager; + } + + /** + * Implementation of Callable + * @return card ID(s) in AtomicIntegerArray + */ + public AtomicIntegerArray call() { + List cardInfos = mTelephonyManager.getUiccCardsInfo(); + if (cardInfos == null) { + return new AtomicIntegerArray(0); + } + return new AtomicIntegerArray(cardInfos.stream() + .filter(Objects::nonNull) + .filter(cardInfo -> (!cardInfo.isRemovable() + && (cardInfo.getCardId() != TelephonyManager.UNSUPPORTED_CARD_ID))) + .mapToInt(UiccCardInfo::getCardId) + .toArray()); + } +} \ No newline at end of file diff --git a/src/com/android/settings/network/helper/QuerySimSlotIndex.java b/src/com/android/settings/network/helper/QuerySimSlotIndex.java new file mode 100644 index 00000000000..b70a148d2e4 --- /dev/null +++ b/src/com/android/settings/network/helper/QuerySimSlotIndex.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network.helper; + +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.telephony.UiccSlotInfo; + +import java.util.Arrays; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicIntegerArray; + +/** + * This is a Callable class which query slot index within device + */ +public class QuerySimSlotIndex implements Callable { + private static final String TAG = "QuerySimSlotIndex"; + + private TelephonyManager mTelephonyManager; + private boolean mDisabledSlotsIncluded; + private boolean mOnlySlotWithSim; + + /** + * Constructor of class + * @param TelephonyManager + * @param disabledSlotsIncluded query both active and inactive slots when true, + * only query active slot when false. + * @param onlySlotWithSim query slot index with SIM available when true, + * include absent ones when false. + */ + public QuerySimSlotIndex(TelephonyManager telephonyManager, + boolean disabledSlotsIncluded, boolean onlySlotWithSim) { + mTelephonyManager = telephonyManager; + mDisabledSlotsIncluded = disabledSlotsIncluded; + mOnlySlotWithSim = onlySlotWithSim; + } + + /** + * Implementation of Callable + * @return slot index in AtomicIntegerArray + */ + public AtomicIntegerArray call() { + UiccSlotInfo [] slotInfo = mTelephonyManager.getUiccSlotsInfo(); + if (slotInfo == null) { + return new AtomicIntegerArray(0); + } + int slotIndexFilter = mOnlySlotWithSim ? 0 : SubscriptionManager.INVALID_SIM_SLOT_INDEX; + return new AtomicIntegerArray(Arrays.stream(slotInfo) + .filter(slot -> filterSlot(slot)) + .mapToInt(slot -> mapToSlotIndex(slot)) + .filter(slotIndex -> (slotIndex >= slotIndexFilter)) + .toArray()); + } + + protected boolean filterSlot(UiccSlotInfo slotInfo) { + if (mDisabledSlotsIncluded) { + return true; + } + if (slotInfo == null) { + return false; + } + return slotInfo.getIsActive(); + } + + protected int mapToSlotIndex(UiccSlotInfo slotInfo) { + if (slotInfo == null) { + return SubscriptionManager.INVALID_SIM_SLOT_INDEX; + } + if (slotInfo.getCardStateInfo() == UiccSlotInfo.CARD_STATE_INFO_ABSENT) { + return SubscriptionManager.INVALID_SIM_SLOT_INDEX; + } + return slotInfo.getLogicalSlotIdx(); + } +} \ No newline at end of file diff --git a/src/com/android/settings/network/helper/SelectableSubscriptions.java b/src/com/android/settings/network/helper/SelectableSubscriptions.java new file mode 100644 index 00000000000..436e84c08b7 --- /dev/null +++ b/src/com/android/settings/network/helper/SelectableSubscriptions.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network.helper; + +import android.content.Context; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.util.Log; + +import androidx.annotation.Keep; +import androidx.annotation.VisibleForTesting; + +import com.android.settings.network.helper.SubscriptionAnnotation; +import com.android.settingslib.utils.ThreadUtils; + +import java.util.Collections; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicIntegerArray; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +/** + * This is a Callable class to query user selectable subscription list. + * + * Here's example of creating a Callable for retrieving a list of SubscriptionAnnotation + * for active Subscriptions: + * + * List result = (new SelectableSubscriptions(context, false)).call(); + * + * Another example for retrieving a list of SubscriptionAnnotation for all subscriptions + * accessible in another thread. + * + * List result = ExecutorService.submit( + * new SelectableSubscriptions(context, true)).get() + */ +public class SelectableSubscriptions implements Callable> { + private static final String TAG = "SelectableSubscriptions"; + + private Context mContext; + private Supplier> mSubscriptions; + private Predicate mFilter; + private Function, List> mFinisher; + + /** + * Constructor of class + * @param context + * @param disabledSlotsIncluded query both active and inactive slots when true, + * only query active slot when false. + */ + public SelectableSubscriptions(Context context, boolean disabledSlotsIncluded) { + mContext = context; + mSubscriptions = disabledSlotsIncluded ? (() -> getAvailableSubInfoList(context)) : + (() -> getActiveSubInfoList(context)); + mFilter = disabledSlotsIncluded ? (subAnno -> subAnno.isExisted()) : + (subAnno -> subAnno.isActive()); + mFinisher = annoList -> annoList; + } + + /** + * Add UnaryOperator to be applied to the final result. + * @param finisher a function to be applied to the final result. + */ + public SelectableSubscriptions addFinisher( + UnaryOperator> finisher) { + mFinisher = mFinisher.andThen(finisher); + return this; + } + + /** + * Implementation of Callable + * @return a list of SubscriptionAnnotation which is user selectable + */ + public List call() { + TelephonyManager telMgr = mContext.getSystemService(TelephonyManager.class); + + try { + // query in background thread + Future eSimCardId = + ThreadUtils.postOnBackgroundThread(new QueryEsimCardId(telMgr)); + + // query in background thread + Future simSlotIndex = + ThreadUtils.postOnBackgroundThread( + new QuerySimSlotIndex(telMgr, true, true)); + + // query in background thread + Future activeSimSlotIndex = + ThreadUtils.postOnBackgroundThread( + new QuerySimSlotIndex(telMgr, false, true)); + + List subInfoList = mSubscriptions.get(); + + // wait for result from background thread + List eSimCardIdList = atomicToList(eSimCardId.get()); + List simSlotIndexList = atomicToList(simSlotIndex.get()); + List activeSimSlotIndexList = atomicToList(activeSimSlotIndex.get()); + + // build a list of SubscriptionAnnotation + return IntStream.range(0, subInfoList.size()) + .mapToObj(subInfoIndex -> + new SubscriptionAnnotation.Builder(subInfoList, subInfoIndex)) + .map(annoBdr -> annoBdr.build(mContext, + eSimCardIdList, simSlotIndexList, activeSimSlotIndexList)) + .filter(mFilter) + .collect(Collectors.collectingAndThen(Collectors.toList(), mFinisher)); + } catch (Exception exception) { + Log.w(TAG, "Fail to request subIdList", exception); + } + return Collections.emptyList(); + } + + protected List getSubInfoList(Context context, + Function> convertor) { + SubscriptionManager subManager = getSubscriptionManager(context); + return (subManager == null) ? Collections.emptyList() : convertor.apply(subManager); + } + + protected SubscriptionManager getSubscriptionManager(Context context) { + return context.getSystemService(SubscriptionManager.class); + } + + protected List getAvailableSubInfoList(Context context) { + return getSubInfoList(context, SubscriptionManager::getAvailableSubscriptionInfoList); + } + + protected List getActiveSubInfoList(Context context) { + return getSubInfoList(context, SubscriptionManager::getActiveSubscriptionInfoList); + } + + @Keep + @VisibleForTesting + protected static List atomicToList(AtomicIntegerArray atomicIntArray) { + if (atomicIntArray == null) { + return Collections.emptyList(); + } + return IntStream.range(0, atomicIntArray.length()) + .map(idx -> atomicIntArray.get(idx)).boxed() + .collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/com/android/settings/network/helper/SubscriptionAnnotation.java b/src/com/android/settings/network/helper/SubscriptionAnnotation.java new file mode 100644 index 00000000000..fae5b9bbb4b --- /dev/null +++ b/src/com/android/settings/network/helper/SubscriptionAnnotation.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network.helper; + +import android.content.Context; +import android.os.ParcelUuid; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; + +import androidx.annotation.Keep; +import androidx.annotation.VisibleForTesting; + +import com.android.settings.network.SubscriptionUtil; + +import java.util.List; + +/** + * This is a class helps providing additional info required by UI + * based on SubscriptionInfo. + */ +public class SubscriptionAnnotation { + private static final String TAG = "SubscriptionAnnotation"; + + private SubscriptionInfo mSubInfo; + private int mOrderWithinList; + private int mType = TYPE_UNKNOWN; + private boolean mIsExisted; + private boolean mIsActive; + private boolean mIsAllowToDisplay; + + public static final ParcelUuid EMPTY_UUID = ParcelUuid.fromString("0-0-0-0-0"); + + public static final int TYPE_UNKNOWN = 0x0; + public static final int TYPE_PSIM = 0x1; + public static final int TYPE_ESIM = 0x2; + + /** + * Builder class for SubscriptionAnnotation + */ + public static class Builder { + + private List mSubInfoList; + private int mIndexWithinList; + + /** + * Constructor of builder + * @param subInfoList list of subscription info + * @param indexWithinList target index within list provided + */ + public Builder(List subInfoList, int indexWithinList) { + mSubInfoList = subInfoList; + mIndexWithinList = indexWithinList; + } + + public SubscriptionAnnotation build(Context context, List eSimCardId, + List simSlotIndex, List activeSimSlotIndex) { + return new SubscriptionAnnotation(mSubInfoList, mIndexWithinList, context, + eSimCardId, simSlotIndex, activeSimSlotIndex); + } + } + + /** + * Constructor of class + */ + @Keep + @VisibleForTesting + protected SubscriptionAnnotation(List subInfoList, int subInfoIndex, + Context context, List eSimCardId, + List simSlotIndex, List activeSimSlotIndexList) { + if ((subInfoIndex < 0) || (subInfoIndex >= subInfoList.size())) { + return; + } + mSubInfo = subInfoList.get(subInfoIndex); + if (mSubInfo == null) { + return; + } + + mOrderWithinList = subInfoIndex; + mType = mSubInfo.isEmbedded() ? TYPE_ESIM : TYPE_PSIM; + if (mType == TYPE_ESIM) { + int cardId = mSubInfo.getCardId(); + mIsExisted = eSimCardId.contains(cardId); + if (mIsExisted) { + mIsActive = activeSimSlotIndexList.contains(mSubInfo.getSimSlotIndex()); + mIsAllowToDisplay = isDisplayAllowed(context); + } + return; + } + + mIsExisted = simSlotIndex.contains(mSubInfo.getSimSlotIndex()); + mIsActive = activeSimSlotIndexList.contains(mSubInfo.getSimSlotIndex()); + if (mIsExisted) { + mIsAllowToDisplay = isDisplayAllowed(context); + } + } + + // the index provided during construction of Builder + @Keep + public int getOrderingInList() { + return mOrderWithinList; + } + + // type of subscription + @Keep + public int getType() { + return mType; + } + + // if a subscription is existed within device + @Keep + public boolean isExisted() { + return mIsExisted; + } + + // if a subscription is currently ON + @Keep + public boolean isActive() { + return mIsActive; + } + + // if display of subscription is allowed + @Keep + public boolean isDisplayAllowed() { + return mIsAllowToDisplay; + } + + // the subscription ID + @Keep + public int getSubscriptionId() { + return (mSubInfo == null) ? SubscriptionManager.INVALID_SUBSCRIPTION_ID : + mSubInfo.getSubscriptionId(); + } + + // the grouping UUID + @Keep + public ParcelUuid getGroupUuid() { + return (mSubInfo == null) ? null : mSubInfo.getGroupUuid(); + } + + // the SubscriptionInfo + @Keep + public SubscriptionInfo getSubInfo() { + return mSubInfo; + } + + private boolean isDisplayAllowed(Context context) { + return SubscriptionUtil.isSubscriptionVisible( + context.getSystemService(SubscriptionManager.class), context, mSubInfo); + } +} \ No newline at end of file diff --git a/src/com/android/settings/network/helper/SubscriptionGrouping.java b/src/com/android/settings/network/helper/SubscriptionGrouping.java new file mode 100644 index 00000000000..cfb5ea92650 --- /dev/null +++ b/src/com/android/settings/network/helper/SubscriptionGrouping.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network.helper; + +import android.os.ParcelUuid; + +import androidx.annotation.Keep; +import androidx.annotation.VisibleForTesting; + +import com.android.settings.network.helper.SubscriptionAnnotation; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.UnaryOperator; +import java.util.stream.Collectors; + +/** + * A UnaryOperator for converting a list of SubscriptionAnnotation into + * another list of SubscriptionAnnotation based on group UUID. + * Only one SubscriptionAnnotation with entries with same (valid) group UUID would be kept. + * + * Here's an example when applying this operation as a finisher of SelectableSubscriptions: + * + * Callable callable = (new SelectableSubscriptions(context, true)) + * .addFinisher(new SubscriptionGrouping()); + * + * List result = ExecutorService.submit(callable).get() + */ +public class SubscriptionGrouping + implements UnaryOperator> { + + // implementation of UnaryOperator + public List apply(List listOfSubscriptions) { + // group by GUID + Map> groupedSubInfoList = + listOfSubscriptions.stream() + .filter(Objects::nonNull) + .collect(Collectors.groupingBy(subAnno -> getGroupUuid(subAnno))); + + // select best one from subscription(s) within the same group + groupedSubInfoList.replaceAll((uuid, annoList) -> { + if ((uuid == SubscriptionAnnotation.EMPTY_UUID) || (annoList.size() <= 1)) { + return annoList; + } + return Collections.singletonList(selectBestFromList(annoList)); + }); + + // build a stream of subscriptions + return groupedSubInfoList.values() + .stream().flatMap(List::stream).collect(Collectors.toList()); + } + + @Keep + @VisibleForTesting + protected ParcelUuid getGroupUuid(SubscriptionAnnotation subAnno) { + ParcelUuid groupUuid = subAnno.getGroupUuid(); + return (groupUuid == null) ? SubscriptionAnnotation.EMPTY_UUID : groupUuid; + } + + protected SubscriptionAnnotation selectBestFromList(List annoList) { + Comparator annoSelector = (anno1, anno2) -> { + if (anno1.isDisplayAllowed() != anno2.isDisplayAllowed()) { + return anno1.isDisplayAllowed() ? -1 : 1; + } + if (anno1.isActive() != anno2.isActive()) { + return anno1.isActive() ? -1 : 1; + } + if (anno1.isExisted() != anno2.isExisted()) { + return anno1.isExisted() ? -1 : 1; + } + return 0; + }; + annoSelector = annoSelector + // eSIM in front of pSIM + .thenComparingInt(anno -> -anno.getType()) + // subscription ID in reverse order + .thenComparingInt(anno -> -anno.getSubscriptionId()); + return annoList.stream().sorted(annoSelector).findFirst().orElse(null); + } +} diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java index f2be37fa985..50164609dd0 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java +++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java @@ -19,6 +19,7 @@ package com.android.settings.network.telephony; import static com.android.settings.SettingsActivity.EXTRA_FRAGMENT_ARG_KEY; import android.app.ActionBar; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.UserManager; @@ -43,6 +44,8 @@ import com.android.settings.R; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.network.ProxySubscriptionManager; import com.android.settings.network.SubscriptionUtil; +import com.android.settings.network.helper.SelectableSubscriptions; +import com.android.settings.network.helper.SubscriptionAnnotation; import java.util.List; @@ -244,15 +247,21 @@ public class MobileNetworkActivity extends SettingsBaseActivity */ @VisibleForTesting SubscriptionInfo getSubscription() { + List subList = + (new SelectableSubscriptions(this, true)).call(); + SubscriptionAnnotation currentSubInfo = null; if (mCurSubscriptionId != SUB_ID_NULL) { - return getSubscriptionForSubId(mCurSubscriptionId); + currentSubInfo = subList.stream() + .filter(SubscriptionAnnotation::isDisplayAllowed) + .filter(subAnno -> (subAnno.getSubscriptionId() == mCurSubscriptionId)) + .findFirst().orElse(null); } - final List subInfos = getProxySubscriptionManager() - .getActiveSubscriptionsInfo(); - if (CollectionUtils.isEmpty(subInfos)) { - return null; + if (currentSubInfo == null) { + currentSubInfo = subList.stream() + .filter(SubscriptionAnnotation::isDisplayAllowed) + .findFirst().orElse(null); } - return subInfos.get(0); + return (currentSubInfo == null) ? null : currentSubInfo.getSubInfo(); } @VisibleForTesting diff --git a/tests/unit/src/com/android/settings/network/helper/SelectableSubscriptionsTest.java b/tests/unit/src/com/android/settings/network/helper/SelectableSubscriptionsTest.java new file mode 100644 index 00000000000..04e91222d60 --- /dev/null +++ b/tests/unit/src/com/android/settings/network/helper/SelectableSubscriptionsTest.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network.helper; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.List; +import java.util.concurrent.atomic.AtomicIntegerArray; + +@RunWith(AndroidJUnit4.class) +public class SelectableSubscriptionsTest { + + @Before + public void setUp() { + } + + @Test + public void atomicToList_nullInput_getNoneNullEmptyList() { + List result = SelectableSubscriptions.atomicToList(null); + + assertThat(result.size()).isEqualTo(0); + } + + @Test + public void atomicToList_zeroLengthInput_getEmptyList() { + List result = SelectableSubscriptions.atomicToList(new AtomicIntegerArray(0)); + + assertThat(result.size()).isEqualTo(0); + } + + @Test + public void atomicToList_subIdInArray_getList() { + AtomicIntegerArray array = new AtomicIntegerArray(3); + array.set(0, 3); + array.set(1, 7); + array.set(2, 4); + + List result = SelectableSubscriptions.atomicToList(array); + + assertThat(result.size()).isEqualTo(3); + assertThat(result.get(0)).isEqualTo(3); + assertThat(result.get(1)).isEqualTo(7); + assertThat(result.get(2)).isEqualTo(4); + } +} diff --git a/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java b/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java new file mode 100644 index 00000000000..97bdb7433a7 --- /dev/null +++ b/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network.helper; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.os.ParcelUuid; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import com.android.settings.network.helper.SubscriptionAnnotation; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; + +import java.util.Arrays; +import java.util.List; + +@RunWith(AndroidJUnit4.class) +public class SubscriptionGroupingTest { + + private ParcelUuid mMockUuid; + + private Context mContext; + private SubscriptionGrouping mTarget; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = spy(ApplicationProvider.getApplicationContext()); + mMockUuid = ParcelUuid.fromString("1-1-1-1-1"); + mTarget = spy(new SubscriptionGrouping()); + } + + @Test + public void apply_multipleEntriesWithSameGroupUuid_onlyOneLeft() { + SubscriptionAnnotation subAnno1 = new TestSubAnnotation(1, + SubscriptionAnnotation.TYPE_ESIM, true, true, mMockUuid); + SubscriptionAnnotation subAnno2 = new TestSubAnnotation(2, + SubscriptionAnnotation.TYPE_PSIM, true, true, mMockUuid); + SubscriptionAnnotation subAnno3 = new TestSubAnnotation(3, + SubscriptionAnnotation.TYPE_ESIM, true, true, mMockUuid); + doReturn(mMockUuid).when(mTarget).getGroupUuid(any()); + + List result = mTarget + .apply(Arrays.asList(subAnno2, subAnno1, subAnno3)); + assertThat(result.size()).isEqualTo(1); + assertThat(result.get(0)).isEqualTo(subAnno3); + } + + @Test + public void apply_multipleEntriesWithSameGroupUuid_disabledOneIsAvoided() { + SubscriptionAnnotation subAnno1 = new TestSubAnnotation(1, + SubscriptionAnnotation.TYPE_ESIM, true, true, mMockUuid); + SubscriptionAnnotation subAnno2 = new TestSubAnnotation(2, + SubscriptionAnnotation.TYPE_PSIM, true, true, mMockUuid); + SubscriptionAnnotation subAnno3 = new TestSubAnnotation(3, + SubscriptionAnnotation.TYPE_ESIM, false, false, mMockUuid); + doReturn(mMockUuid).when(mTarget).getGroupUuid(any()); + + List result = mTarget + .apply(Arrays.asList(subAnno2, subAnno1, subAnno3)); + assertThat(result.size()).isEqualTo(1); + assertThat(result.get(0)).isEqualTo(subAnno1); + } + + private class TestSubAnnotation extends SubscriptionAnnotation { + private int mSubId; + private int mSimType; + private boolean mIsActive; + private boolean mIsDisplayAllowed; + private ParcelUuid mUuid; + + private TestSubAnnotation(int subId, int simType, + boolean isActive, boolean isDisplayAllowed, ParcelUuid guuid) { + super(null, -1, null, null, null, null); + mSubId = subId; + mSimType = simType; + mIsActive = isActive; + mIsDisplayAllowed = isDisplayAllowed; + mUuid = guuid; + } + + @Override + public int getSubscriptionId() { + return mSubId; + } + + @Override + public int getType() { + return mSimType; + } + + @Override + public boolean isExisted() { + return true; + } + + @Override + public boolean isActive() { + return mIsActive; + } + + @Override + public boolean isDisplayAllowed() { + return mIsDisplayAllowed; + } + + @Override + public ParcelUuid getGroupUuid() { + return mUuid; + } + } +} From 68c12f2e0466505fffaa5cf694376f7192ed3c74 Mon Sep 17 00:00:00 2001 From: Curtis Belmonte Date: Tue, 29 Jun 2021 16:38:39 -0700 Subject: [PATCH 4/6] Add "eyes open" setting message to face enroll intro Adds an additional message about the "Require eyes to be open" setting for Face Unlock to the intro/consent screen of enrollment, gated by a config flag. Test: Manual Bug: 192272785 Change-Id: Idcd2395a290b74f4578898fdfebd05b81cd74075 --- res/layout/face_enroll_introduction.xml | 22 +++++++++++++++++++ res/values/config.xml | 3 +++ res/values/strings.xml | 5 +++++ .../face/FaceEnrollIntroduction.java | 20 ++++++++++++++++- .../face/FaceEnrollParentalConsent.java | 6 +++++ 5 files changed, 55 insertions(+), 1 deletion(-) diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml index c9c4d23f578..c1c9ac6ad85 100644 --- a/res/layout/face_enroll_introduction.xml +++ b/res/layout/face_enroll_introduction.xml @@ -107,6 +107,28 @@ style="@style/BiometricEnrollIntroMessage" /> + + + + + + + + + true + false diff --git a/res/values/strings.xml b/res/values/strings.xml index d59ae9d8e65..dcec2fed5f3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -799,6 +799,11 @@ + + + + + diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index 91cc3a9bfdc..bee1acacf10 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -24,6 +24,7 @@ import android.hardware.face.FaceSensorPropertiesInternal; import android.os.Bundle; import android.view.View; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; @@ -74,11 +75,13 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + // Apply extracted theme color to icons. final ImageView iconGlasses = findViewById(R.id.icon_glasses); final ImageView iconLooking = findViewById(R.id.icon_looking); iconGlasses.getBackground().setColorFilter(getIconColorFilter()); iconLooking.getBackground().setColorFilter(getIconColorFilter()); + // Set text for views with multiple variations. final TextView infoMessageGlasses = findViewById(R.id.info_message_glasses); final TextView infoMessageLooking = findViewById(R.id.info_message_looking); final TextView howMessage = findViewById(R.id.how_message); @@ -86,10 +89,20 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { final TextView inControlMessage = findViewById(R.id.message_in_control); infoMessageGlasses.setText(getInfoMessageGlasses()); infoMessageLooking.setText(getInfoMessageLooking()); - howMessage.setText(getHowMessage()); inControlTitle.setText(getInControlTitle()); + howMessage.setText(getHowMessage()); inControlMessage.setText(getInControlMessage()); + // Set up and show the "require eyes" info section if necessary. + if (getResources().getBoolean(R.bool.config_face_intro_show_require_eyes)) { + final LinearLayout infoRowRequireEyes = findViewById(R.id.info_row_require_eyes); + final ImageView iconRequireEyes = findViewById(R.id.icon_require_eyes); + final TextView infoMessageRequireEyes = findViewById(R.id.info_message_require_eyes); + infoRowRequireEyes.setVisibility(View.VISIBLE); + iconRequireEyes.getBackground().setColorFilter(getIconColorFilter()); + infoMessageRequireEyes.setText(getInfoMessageRequireEyes()); + } + mFaceManager = Utils.getFaceManagerOrNull(this); mFaceFeatureProvider = FeatureFactory.getFactory(getApplicationContext()) .getFaceFeatureProvider(); @@ -126,6 +139,11 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { return R.string.security_settings_face_enroll_introduction_info_looking; } + @StringRes + protected int getInfoMessageRequireEyes() { + return R.string.security_settings_face_enroll_introduction_info_gaze; + } + @StringRes protected int getHowMessage() { return R.string.security_settings_face_enroll_introduction_how_message; diff --git a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java index 7a60a94ad55..81043dc03a6 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java @@ -80,6 +80,12 @@ public class FaceEnrollParentalConsent extends FaceEnrollIntroduction { return R.string.security_settings_face_enroll_introduction_info_consent_looking; } + @Override + @StringRes + protected int getInfoMessageRequireEyes() { + return R.string.security_settings_face_enroll_introduction_info_consent_gaze; + } + @Override @StringRes protected int getHowMessage() { From 4e7a021a3f4071d9c1e681248a5189b4649f1b44 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 13 Jul 2021 06:56:33 +0000 Subject: [PATCH 5/6] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I1907d2b0f31200d7a55ab9b8e4f305e031428f93 --- res/values-af/strings.xml | 3 +-- res/values-am/strings.xml | 6 ++---- res/values-ar/strings.xml | 3 +-- res/values-az/strings.xml | 3 +-- res/values-b+sr+Latn/strings.xml | 6 ++---- res/values-be/strings.xml | 3 +-- res/values-bg/strings.xml | 3 +-- res/values-bs/strings.xml | 6 ++---- res/values-ca/strings.xml | 6 ++---- res/values-cs/strings.xml | 6 ++---- res/values-da/strings.xml | 6 ++---- res/values-de/strings.xml | 6 ++---- res/values-el/strings.xml | 6 ++---- res/values-es-rUS/strings.xml | 6 ++---- res/values-es/strings.xml | 8 +++----- res/values-et/strings.xml | 6 ++---- res/values-eu/strings.xml | 6 ++---- res/values-fa/strings.xml | 6 ++---- res/values-fi/strings.xml | 6 ++---- res/values-fr-rCA/strings.xml | 8 +++----- res/values-fr/strings.xml | 6 ++---- res/values-gl/strings.xml | 6 ++---- res/values-hi/strings.xml | 6 ++---- res/values-hr/strings.xml | 6 ++---- res/values-hu/strings.xml | 6 ++---- res/values-hy/strings.xml | 6 ++---- res/values-in/strings.xml | 3 +-- res/values-is/strings.xml | 3 +-- res/values-it/strings.xml | 6 ++---- res/values-iw/strings.xml | 3 +-- res/values-ja/strings.xml | 8 +++----- res/values-ka/strings.xml | 3 +-- res/values-kk/strings.xml | 3 +-- res/values-km/strings.xml | 10 ++++------ res/values-kn/strings.xml | 12 +++++------- res/values-ko/strings.xml | 6 ++---- res/values-ky/strings.xml | 3 +-- res/values-lo/strings.xml | 6 ++---- res/values-lt/strings.xml | 3 +-- res/values-lv/strings.xml | 6 ++---- res/values-ml/strings.xml | 6 ++---- res/values-mn/strings.xml | 6 ++---- res/values-ms/strings.xml | 3 +-- res/values-my/strings.xml | 6 ++---- res/values-nb/strings.xml | 6 ++---- res/values-ne/strings.xml | 6 ++---- res/values-nl/strings.xml | 6 ++---- res/values-pl/strings.xml | 8 +++----- res/values-pt-rBR/strings.xml | 6 ++---- res/values-pt-rPT/strings.xml | 6 ++---- res/values-pt/strings.xml | 6 ++---- res/values-ro/strings.xml | 3 +-- res/values-ru/strings.xml | 5 ++--- res/values-sk/strings.xml | 3 +-- res/values-sl/strings.xml | 8 +++----- res/values-sr/strings.xml | 6 ++---- res/values-sv/strings.xml | 8 +++----- res/values-ta/strings.xml | 6 ++---- res/values-te/strings.xml | 3 +-- res/values-th/strings.xml | 5 ++--- res/values-tl/strings.xml | 3 +-- res/values-tr/strings.xml | 6 ++---- res/values-uk/strings.xml | 14 ++++++-------- res/values-vi/strings.xml | 6 ++---- res/values-zh-rCN/strings.xml | 8 +++----- res/values-zh-rHK/strings.xml | 8 +++----- res/values-zh-rTW/strings.xml | 8 +++----- res/values-zu/strings.xml | 6 ++---- 68 files changed, 137 insertions(+), 254 deletions(-) diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index dd732904726..26dae15747c 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -5352,8 +5352,7 @@ "GAAN VOORT" "NEE, DANKIE" "Ligging" - - + "Jou diensverskaffer kan jou ligging bepaal wanneer jy hierdie diens vir noodoproepe gebruik.\n\nKry besonderhede op jou diensverskaffer se privaatheidsbeleid." "Jy kan toegang tot enige oorblywende tyd of data verloor. Vra jou verskaffer voordat jy dit verwyder." "inhoudvaslegging, programinhoud" "Programinhoud" diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 38e9c8e09e2..53744e2ccb6 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -53,8 +53,7 @@ "አነስ አድርግ" "ተለቅ አድርግ" "ራስ-አዙርን ይጠቀሙ" - - + "የራስ-አዙርን ትክክለኝነትን ለማሻሻል መልክ ማወቂያ የፊት ለፊቱን ካሜራ ይጠቀማል። ምስሎች በጭራሽ አይከማቹም ወይም ወደ Google አይላኩም።" "የናሙና ጽሑፍ" "አስደናቂው የኦዝ ምትሃተኛ" "ምዕራፍ 11፦ ኦዝ፣ አስደናቂዋ የኤምራልድ ከተማ" @@ -5353,8 +5352,7 @@ "ቀጥል" "አይ አመሰግናለሁ" "መገኛ አካባቢ" - - + "ለአደጋ ጥሪዎች ይህንን አገልግሎት ሲጠቀሙ አገልግሎት አቅራቢዎ አካባቢዎን ሊሰበስብ ይችላል።\n\nለዝርዝሮች የአገልግሎት አቅራቢዎን የግላዊነት መመሪያ ይጎብኙ።" "ማናቸውንም ቀሪ ጊዜ ወይም ውሂብ መዳረሻ ሊያጡ ይችሉ ይሆናል። ከማስወገድዎ በፊት ከእርስዎ አገልግሎት አቅራቢ ጋር ይፈትሹ።" "ይዘትን መቅረጽ፣ የመተግበሪያ ይዘት" "የመተግበሪያ ይዘት" diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 34f7b522055..985b36b8ac8 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -5709,8 +5709,7 @@ "متابعة" "لا، شكرًا" "الموقع الجغرافي" - - + "يمكن أن يجمع مشغّل شبكة الجوّال بيانات موقعك الجغرافي عندما تستخدم هذه الخدمة لإجراء مكالمات الطوارئ.\n\nيمكنك الاطّلاع على سياسة خصوصية مشغّل شبكة الجوّال للحصول على مزيد من التفاصيل." "قد تفقد إمكانية الوصول إلى أي وقت أو بيانات متبقية. يُرجى مراجعة ذلك مع مقدّم الخدمة قبل الإزالة." "تسجيل المحتوى، محتوى التطبيق" "محتوى التطبيق" diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index f39db05f85e..7fc0fd8764c 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -5353,8 +5353,7 @@ "DAVAM EDİN" "XEYR, TƏŞƏKKÜRLƏR" "Məkan" - - + "Fövqəladə zənglər üçün bu xidmətdən istifadə etdiyiniz zaman operatorunuz məkan məlumatınızı toplaya bilər.\n\nƏtraflı məlumat üçün operatorunuzun məxfilik siyasətini ziyarət edin." "Qalan vaxt və ya dataya girişi itirə bilərsiniz. Silməzdən əvvəl provayder ilə yoxlayın." "kontentin əldə edilməsi, tətbiq kontenti" "Tətbiq kontenti" diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 7c6046476cb..a17228442eb 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -54,8 +54,7 @@ "Umanji" "Uvećaj" "Koristi automatsko rotiranje" - - + "Prepoznavanje lica koristi prednju kameru za poboljšanje preciznosti automatskog rotiranja. Slike se nikada ne čuvaju niti šalju Google-u." "Primer teksta" "Čarobnjak iz Oza" "Poglavlje 11: Čudesni Smaragdni grad Oza" @@ -5442,8 +5441,7 @@ "NASTAVI" "NE, HVALA" "Lokacija" - - + "Mobilni operater može da prikuplja podatke o lokaciji kada koristite ovu uslugu za hitne pozive.\n\nPotražite detalje u politici privatnosti mobilnog operatera." "Možete da izgubite pristup preostalom vremenu ili podacima. Proverite sa dobavljačem usluge pre uklanjanja." "snimanje sadržaja, sadržaj aplikacije" "Sadržaj aplikacije" diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 53369a819c3..55b250f9a60 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -5533,8 +5533,7 @@ "ПРАЦЯГНУЦЬ" "НЕ, ДЗЯКУЙ" "Месцазнаходжанне" - - + "Аператар можа збіраць даныя пра ваша месцазнаходжанне, калі вы выкарыстоўваеце гэты сэрвіс для экстранных выклікаў.\n\nПадрабязнасці глядзіце ў палітыцы прыватнасці вашага аператара." "Вы можаце страціць доступ да нявыкарыстаных хвілін і трафіка. Перш чым выдаляць, звярніцеся да свайго аператара." "захаванне змесціва, змесціва праграмы" "Змесціва праграмы" diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 58bc1659604..143ec51ecac 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -53,8 +53,7 @@ "Намаляване на размера" "Увеличаване на размера" "Използване на автоматичното завъртане" - - + "Функцията за лицево разпознаване използва предната камера, за да подобри точността на автоматичното завъртане. Изображенията никога не се съхраняват и не се изпращат до Google." "Примерен текст" "Вълшебникът от Оз" "Глава 11: Удивителният изумруден град на Оз" diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index d36f63081b5..ab5be395822 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -54,8 +54,7 @@ "Napravi manji" "Napravi veći" "Koristi automatsko rotiranje" - - + "Prepoznavanje lica koristi prednju kameru da poboljša preciznost automatskog rotiranja. Slike se nikad ne pohranjuju niti šalju Googleu." "Uzorak teksta" "Čarobnjak iz Oza" "Poglavlje 11: Smaragdni grad Oz" @@ -5442,8 +5441,7 @@ "NASTAVI" "NE, HVALA" "Lokacija" - - + "Vaš mobilni operater može prikupiti informacije o vašoj lokaciji prilikom korištenja ove usluge za hitne pozive.\n\nDetalje potražite u pravilima privatnosti mobilnog operatera." "Možete izgubiti pristup preostalom vremenu ili podacima. Prije uklanjanja, provjerite s pružaocem usluga." "snimanje sadržaja, sadržaj aplikacije" "Sadržaj aplikacije" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index f7e344682dc..3feb018f9da 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -53,8 +53,7 @@ "Redueix" "Amplia" "Gira automàticament" - - + "La detecció facial utilitza la càmera frontal per millorar la precisió del gir automàtic. Les imatges mai no s\'emmagatzemen ni s\'envien a Google." "Text de mostra" "El meravellós mag d\'Oz" "Capítol 11: La meravellosa Ciutat Maragda d\'Oz" @@ -5353,8 +5352,7 @@ "CONTINUA" "NO, GRÀCIES" "Ubicació" - - + "És possible que l\'operador reculli la teva ubicació quan utilitzis aquest servei per fer trucades d\'emergència.\n\nVisita la política de privadesa de l\'operador per obtenir més detalls." "És possible que perdis l\'accés al temps o a les dades restants. Contacta amb el proveïdor abans de suprimir res." "captura de contingut, contingut d\'aplicació" "Contingut de l\'aplicació" diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index e10786c86f1..8bc53597715 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -55,8 +55,7 @@ "Zmenšit" "Zvětšit" "Automaticky otáčet obrazovku" - - + "Rozpoznání obličeje používá přední fotoaparát ke zvýšení přesnosti automatického otáčení. Fotky se neukládají ani neodesílají do Googlu." "Ukázkový text" "Čaroděj ze země Oz" "Kapitola 11: Smaragdové město v zemi Oz" @@ -5531,8 +5530,7 @@ "POKRAČOVAT" "NE, DĚKUJI" "Místo" - - + "Při používání této služby k tísňovým voláním může váš operátor shromažďovat údaje o vaší poloze.\n\nPodrobnosti naleznete v zásadách ochrany soukromí operátora." "Ke zbývajícímu času nebo datům můžete ztratit přístup. Před odstraněním se informujte u operátora." "zachycení obsahu, obsah aplikace" "Obsah aplikace" diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 197818a693e..02b823bf5f6 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -53,8 +53,7 @@ "Formindsk" "Forstør" "Brug automatisk rotation" - - + "Ansigtsgenkendelse bruger kameraet på forsiden for at forbedre nøjagtigheden af funktionen Roter automatisk. Billeder gemmes ikke, og de sendes aldrig til Google." "Eksempeltekst" "Den vidunderlige troldmand fra Oz" "Kapitel 11: Den vidunderlige smaragdby i Oz" @@ -5353,8 +5352,7 @@ "FORTSÆT" "NEJ TAK" "Placering" - - + "Dit mobilselskab registrerer muligvis din placering, når du bruger denne tjeneste til nødopkald.\n\nGå til dit mobilselskabs privatlivspolitik for at få flere oplysninger." "Du kan miste adgangen til resterende tid eller data. Kontakt din udbyder, før du fjerner det." "indholdsregistrering, appindhold" "Appindhold" diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index 8434e27f06a..d76c0aadc5d 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -53,8 +53,7 @@ "Verkleinern" "Vergrößern" "„Automatisch drehen“ verwenden" - - + "Bei der Gesichtserkennung wird die Kamera auf der Vorderseite verwendet, um die Genauigkeit beim automatischen Drehen zu verbessern. Bilder weder gespeichert noch an Google gesendet." "Beispieltext" "Der Zauberer von Oz" "Kapitel 11: Die wundervolle Smaragdstadt von Oz" @@ -5356,8 +5355,7 @@ "WEITER" "NEIN DANKE" "Ort" - - + "Dein Mobilfunkanbieter kann deinen Standort erfassen, wenn du diesen Dienst für Notrufe verwendest.\n\nSieh dir für Details die Datenschutzerklärung deines Mobilfunkanbieters an." "Möglicherweise verlierst du den Zugriff auf ggf. verbliebene Zeit- oder Datenkontingente. Wende dich deswegen vor dem Entfernen an deinen Anbieter." "inhaltserfassung, app-Inhalte" "App-Inhalte" diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index b73365dddbf..021a7cfbad1 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -53,8 +53,7 @@ "Να γίνουν μικρότερα" "Να γίνουν μεγαλύτερα" "Χρήση αυτόματης περιστροφής" - - + "Η ανίχνευση προσώπων χρησιμοποιεί την μπροστινή κάμερα για βελτίωση της ακρίβειας αυτόματης περιστροφής. Οι εικόνες δεν αποθηκεύονται ούτε αποστέλλονται ποτέ στην Google." "Δείγμα κειμένου" "Ο Θαυμάσιος Μάγος του Οζ" "Κεφάλαιο 11: Η Θαυμάσια Πόλη Έμεραλντ του Οζ" @@ -5353,8 +5352,7 @@ "ΣΥΝΕΧΕΙΑ" "ΟΧΙ, ΕΥΧΑΡΙΣΤΩ" "Τοποθεσία" - - + "Η εταιρεία κινητής τηλεφωνίας ενδέχεται να συλλέγει πληροφορίες για την τοποθεσία σας κατά τη χρήση της υπηρεσίας για κλήσεις έκτακτης ανάγκης.\n\nΑνατρέξτε στην πολιτική απορρήτου της εταιρείας κινητής τηλεφωνίας για λεπτομέρειες." "Μπορεί να χάσετε την πρόσβαση σε τυχόν υπόλοιπο χρόνο ή δεδομένα. Επικοινωνήστε με τον πάροχο της υπηρεσίας πριν από την κατάργηση." "λήψη περιεχομένου, περιεχόμενο εφαρμογής" "Περιεχόμενο εφαρμογής" diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index 9076bcc1fda..ea9a434af61 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -53,8 +53,7 @@ "Reducir el tamaño" "Aumentar el tamaño" "Girar automáticamente" - - + "La detección de rostro usa la cámara frontal para mejorar la exactitud de la opción girar automáticamente. Las imágenes nunca se almacenan ni se envían a Google." "Texto de muestra" "El maravilloso mago de Oz" "Capítulo 11: La maravillosa Ciudad Esmeralda de Oz" @@ -5355,8 +5354,7 @@ "CONTINUAR" "NO, GRACIAS" "Ubicación" - - + "Es posible que tu proveedor obtenga tu ubicación cuando uses este servicio para llamadas de emergencia.\n\nConsulta la Política de Privacidad de tu proveedor para obtener más detalles." "Es posible que pierdas acceso a los datos o al tiempo restantes. Consúltalo con tu proveedor antes de quitarlo." "captura de contenido, contenido de app" "Contenido de la app" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index 65987ff69c2..ec98b5dc2df 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -53,8 +53,7 @@ "Reducir el tamaño" "Aumentar el tamaño" "Girar automáticamente" - - + "Detección de caras usa la cámara frontal para mejorar la precisión de Girar automáticamente. Las imágenes nunca se almacenan ni se envían a Google." "Texto de ejemplo" "El maravilloso mago de Oz" "Capítulo 11: La maravillosa Ciudad Esmeralda de Oz" @@ -831,7 +830,7 @@ "Actualizar" "Buscando…" "Ajustes del dispositivo" - "Dispositivo vinculado" + "Dispositivo emparejado" "Conexión a Internet" "Teclado" "Contactos e historial de llamadas" @@ -5353,8 +5352,7 @@ "CONTINUAR" "NO, GRACIAS" "Ubicación" - - + "Puede que tu operador recoja tu ubicación cuando llamas a emergencias con este servicio.\n\nPara obtener más información, consulta la política de privacidad de tu operador." "Es posible que dejes de tener acceso al tiempo o datos restantes. Antes de eliminarlo, consulta con tu proveedor." "obtención de contenido, contenido de la aplicación" "Contenido de la aplicación" diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index 0e1e47fd6e2..5ee053f608e 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -53,8 +53,7 @@ "Vähendamine" "Suurendamine" "Kasuta automaatset pööramist" - - + "Näotuvastus kasutab esikaamerat, et parandada automaatse pööramise täpsust. Pilte ei salvestata ega saadeta kunagi Google\'ile." "Näidistekst" "Võlur Oz" "11. peatükk: Ozi imeline smaragdlinn" @@ -5355,8 +5354,7 @@ "JÄTKA" "EI, TÄNAN" "Asukoht" - - + "Kui kasutate seda teenust hädaabikõnedeks, võib operaator koguda teavet teie asukoha kohta.\n\nLisateavet leiate oma operaatori privaatsuseeskirjadest." "Järelejäänud aeg või andmemaht võib kaotsi minna. Enne eemaldamist pidage nõu operaatoriga." "sisu jäädvustamine, rakenduse sisu" "Rakenduse sisu" diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index e0f7619479c..26688e0692e 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -53,8 +53,7 @@ "Txikitu" "Handitu" "Erabili automatikoki biratzeko aukera" - - + "Aurpegi-hautematea eginbideak aurreko kamera erabiltzen du automatikoki biratzeko ezarpenaren zehaztasuna hobetzeko. Irudiak ez dira inoiz gordetzen, ez eta Google-ra bidaltzen ere." "Testu-lagina" "Ozeko azti miragarria" "11. kapitulua: Esmeraldazko Oz hiri harrigarria" @@ -5353,8 +5352,7 @@ "AURRERA" "EZ, ESKERRIK ASKO" "Kokapena" - - + "Litekeena da operadoreak zure kokapena biltzea zerbitzu hau larrialdi-deietarako erabiltzen duzunean.\n\nIrakurri operadorearen pribatutasun-gidalerroak xehetasunak ikusteko." "Denbora edo daturik geldituz gero, baliteke haiek galtzea. Kendu aurretik, galdetu hornitzaileari." "eduki-bilketa, aplikazioko edukia" "Aplikazioko edukia" diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 9ce29fa274f..df60d72dae4 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -53,8 +53,7 @@ "کوچک‌تر کردن" "بزرگ‌تر کردن" "استفاده از چرخش خودکار" - - + "‏«تشخیص چهره» برای بهبود دقت «چرخش خودکار» از دوربین جلو استفاده می‌کند. تصاویر هرگز ذخیره یا به Google ارسال نمی‌شوند." "نوشتار نمونه" "جادوگر شهر اوز" "فصل ۱۱: شهر زمردی شگفت‌انگیز اوز" @@ -5353,8 +5352,7 @@ "ادامه" "نه متشکرم" "مکان" - - + "هنگامی که از این سرویس برای تماس‌های اضطراری استفاده می‌کنید، ممکن است شرکت مخابراتی‌تان اطلاعات مکان شما را جمع‌آوری کند.\n\nبرای دریافت جزئیات، به خط‌مشی رازداری شرکت مخابراتی‌تان مراجعه کنید." "ممکن است دسترسی به زمان یا داده‌های باقی‌مانده را از دست بدهید. پیش از برداشتن، با ارائه‌دهنده تماس بگیرید." "ضبط محتوا، محتوای برنامه" "محتوای برنامه" diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index ffd2bb4e36b..445f4eb9152 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -53,8 +53,7 @@ "Pienennä" "Suurenna" "Käytä automaattista kääntöä" - - + "Kasvojentunnistus käyttää etukameraa automaattisen kääntämisen tarkkuuden parantamiseksi. Kuvia ei koskaan tallenneta tai lähetetä Googlelle." "Esimerkkiteksti" "Ihmemaa Oz" "Luku 11: Ozin ihastuttava smaragdikaupunki" @@ -5353,8 +5352,7 @@ "JATKA" "EI KIITOS" "Sijainti" - - + "Operaattori voi selvittää sijaintisi, kun käytät ominaisuutta hätäpuheluihin.\n\nKatso lisätietoja operaattorin tietosuojakäytännöstä." "Voit menettää jäljellä olevan ajan tai datan. Tarkista asia operaattorilta ennen poistamista." "sisällön tallennus, sovelluksen sisältö" "Sovelluksen sisältö" diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index dded68ecabb..a8442c5dbe7 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -53,8 +53,7 @@ "Rapetisser" "Agrandir" "Utiliser la rotation automatique" - - + "La technologie de détection du visage utilise l\'appareil photo avant pour améliorer la précision de la rotation automatique. Les images sont jamais stockées ni envoyées à Google." "Exemple de texte" "Le Magicien d\'Oz" "Chapitre 11 : La merveilleuse cité d\'émeraude d\'Oz" @@ -4255,7 +4254,7 @@ "Ajouter" "S\'ouvre dans %s" - "%1$s utilisé dans %2$s" + "%1$s utilisé(s) dans %2$s" "stockage interne" "stockage externe" "%1$s utilisés depuis %2$s" @@ -5353,8 +5352,7 @@ "CONTINUER" "NON MERCI" "Lieu" - - + "Votre fournisseur de services peut collecter les données relatives à votre position lorsque vous utilisez ce service en lien avec les appels d\'urgence.\n\nConsultez la politique de confidentialité de votre fournisseur de services pour obtenir plus de détails." "Vous risquez de perdre l\'accès au temps ou aux données restants. Communiquez avec votre fournisseur de services avant de procéder au retrait." "capture de contenu, contenu de l\'application" "Contenu de l\'application" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index a8221cbabd4..b3e0815fd1c 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -53,8 +53,7 @@ "Réduire" "Agrandir" "Utiliser la rotation automatique" - - + "La détection de visages utilise l\'appareil photo frontal pour améliorer la précision de la rotation automatique. Les images ne sont jamais stockées ni envoyées à Google." "Exemple de texte" "Le Magicien d\'Oz" "Chapitre 11 : La merveilleuse cité d\'émeraude" @@ -5353,8 +5352,7 @@ "CONTINUER" "NON MERCI" "Position" - - + "Il se peut que votre opérateur recueille votre position lorsque vous utilisez ce service pour les appels d\'urgence.\n\nPour en savoir plus, consultez les règles de confidentialité de votre opérateur." "Vous risquez de perdre l\'accès au temps ou aux données restants. Contactez votre opérateur avant de procéder au retrait." "capture de contenu, contenu de l\'application" "Contenu des applications" diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index 871223c614b..e56952e44c2 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -53,8 +53,7 @@ "Reducir" "Ampliar" "Usar Xirar automaticamente" - - + "A función Detección facial utiliza a cámara frontal para mellorar a precisión da opción Xirar automaticamente. As imaxes nunca se almacenan nin se envían a Google." "Texto de mostra" "O marabilloso mago de Oz" "Capítulo 11: A marabillosa Cidade Esmeralda de Oz" @@ -5353,8 +5352,7 @@ "CONTINUAR" "NON, GRAZAS" "Localización" - - + "O teu operador pode recompilar a túa localización cando uses este servizo para realizar chamadas de emerxencia.\n\nConsulta a súa política de privacidade para obter máis información." "Podes perder ao acceso ao tempo ou aos datos restantes. Consulta o teu fornecedor antes de quitar nada." "captura de contido, contido das aplicacións" "Contido das aplicacións" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 495150a6c2e..9eb6221e12c 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -53,8 +53,7 @@ "छोटा करें" "बड़ा करें" "ऑटो-रोटेट की सुविधा का इस्तेमाल करें" - - + "चेहरे की पहचान करने वाली तकनीक, स्क्रीन की अपने-आप दिशा बदलने (ऑटो-रोटेट) की सेटिंग को बेहतर बनाने के लिए, सामने वाले कैमरे का इस्तेमाल करती है. इमेज न तो सेव की जाती है और न ही Google को भेजी जाती है." "नमूना लेख" "ओज़ का अद्भुत जादू" "अध्याय 11: पन्ने का अद्भुत शहर ओज़" @@ -5353,8 +5352,7 @@ "जारी रखें" "नहीं, धन्यवाद" "जगह" - - + "जब आप आपातकालीन कॉल के लिए इस सेवा का इस्तेमाल करते हैं, तो मोबाइल और इंटरनेट सेवा देने वाली कंपनी, आपकी जगह की जानकारी इकट्ठा कर सकती है.\n\nज़्यादा जानकारी के लिए, अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी की निजता नीति को देखें." "आप बचे हुए समय या डेटा का ऐक्सेस खो सकते हैं. हटाने से पहले अपनी सेवा देने वाली कंपनी से पुष्टि कर लें." "सामग्री कैप्चर, ऐप्लिकेशन की सामग्री" "ऐप्लिकेशन की सामग्री" diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 363095286b8..d50d40ffe16 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -54,8 +54,7 @@ "Smanji" "Povećaj" "Upotreba automatskog zakretanja" - - + "Prepoznavanje lica koristi prednju kameru radi poboljšanja točnosti automatskog zakretanja. Slike se nikad ne pohranjuju i ne šalju Googleu." "Primjer teksta" "Čarobnjak iz Oza" "11. poglavlje: Čudesni Smaragdni Grad čarobnjaka Oza" @@ -5444,8 +5443,7 @@ "NASTAVI" "NE, HVALA" "Lokacija" - - + "Vaš mobilni operater može prikupljati podatke o vašoj lokaciji kad koristite tu uslugu za hitne pozive.\n\nPojedinosti potražite u pravilima o privatnosti svojeg mobilnog operatera." "Možda ćete izgubiti pristup preostalom vremenu ili podacima. Prije uklanjanja provjerite s davateljem usluga." "snimanje sadržaja, sadržaj aplikacija" "Sadržaj aplikacije" diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 54918becce3..6982b44acda 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -53,8 +53,7 @@ "Kisebb" "Nagyobb" "Automatikus forgatás használata" - - + "Az arcfelismerés az előlapi kamerát használja az automatikus forgatás pontosságának javításához. A rendszer a képeket semmilyen esetben nem tárolja, és nem is küldi el őket a Google-nak." "Mintaszöveg" "Óz, a csodák csodája" "11. fejezet: A csodálatos Smaragdváros" @@ -5353,8 +5352,7 @@ "TOVÁBB" "KÖSZÖNÖM, NEM" "Hely" - - + "Szolgáltatója gyűjtheti a helyadatokat, ha Ön segélyhívásra használja ezt a szolgáltatást.\n\nEzzel kapcsolatban bővebben a szolgáltató adatvédelmi irányelvei nyújtanak tájékoztatást." "Elveszítheti hozzáférését a fennmaradó idő- vagy adatmennyiséghez. Az eltávolítás előtt egyeztessen szolgáltatójával." "tartalomrögzítés, alkalmazástartalom" "Alkalmazástartalom" diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 6062870c565..0a26ccde435 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -53,8 +53,7 @@ "Փոքրացնել" "Մեծացնել" "Օգտագործել ինքնապտտումը" - - + "Դիմաճանաչումն օգտագործում է առջևի տեսախցիկը՝ ինքնապտտման ճշգրտությունը բարելավելու համար։ Պատկերները չեն պահվում և չեն ուղարկվում Google-ին։" "Տեքստի նմուշ" "Օզի կախարդը" "Գլուխ 11. Օզի հրաշալի Զմրուխտե քաղաքը" @@ -5353,8 +5352,7 @@ "ՇԱՐՈՒՆԱԿԵԼ" "ՈՉ, ՇՆՈՐՀԱԿԱԼՈՒԹՅՈՒՆ" "Վայր" - - + "Ձեր օպերատորը կարող է հավաքել տեղեկություններ ձեր գտնվելու վայրի մասին, երբ օգտագործում եք այս ծառայությունը շտապ կանչերի համար։\n\nՄանրամասն տեղեկությունների համար անցեք ձեր օպերատորի գաղտնիության քաղաքականության էջ։" "Մնացած րոպեներն ու թրաֆիկը կարող են ձեզ անհասանելի դառնալ։ Հեռացնելուց առաջ դիմեք կապի օպերատորին։" "բովանդակության արագ բացում, հավելվածի բովանդակություն" "Հավելվածների բովանդակություն" diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index f6f88b69944..e46bcb7641e 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -5353,8 +5353,7 @@ "LANJUTKAN" "TIDAK, TERIMA KASIH" "Lokasi" - - + "Operator dapat mengumpulkan informasi lokasi Anda saat layanan ini digunakan untuk panggilan darurat.\n\nLihat kebijakan privasi operator Anda untuk mengetahui detailnya." "Anda dapat kehilangan akses ke waktu atau data apa pun yang tersisa. Hubungi penyedia Anda sebelum menghapus." "gambar konten, konten aplikasi" "Konten aplikasi" diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 849e56f1959..34d428f21f7 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -53,8 +53,7 @@ "Minnka" "Stækka" "Nota sjálfvirkan snúning" - - + "Andlitsgreining notar fremri myndavélina til að bæta nákvæmni sjálfvirks snúnings. Myndir eru aldrei vistaðar eða sendar til Google." "Textadæmi" "Galdrakarlinn í Oz" "11. kafli: Smaragðsborgin dásamlega í Oz" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 6526f14d59c..12946ba340b 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -53,8 +53,7 @@ "Rimpicciolisci" "Ingrandisci" "Usa la rotazione automatica" - - + "La funzionalità di riconoscimento facciale usa la fotocamera anteriore per migliorare la precisione della rotazione automatica. Le immagini non vengono mai memorizzate o inviate a Google." "Testo di esempio" "Il meraviglioso mago di Oz" "Capitolo 11: La splendida Città di smeraldo di Oz" @@ -5353,8 +5352,7 @@ "CONTINUA" "NO GRAZIE" "Posizione" - - + "L\'operatore potrebbe recuperare la tua posizione quando usi questo servizio per le chiamate di emergenza.\n\nPer informazioni dettagliate, leggi le norme sulla privacy dell\'operatore." "Potresti non avere più accesso a tempi o dati restanti. Prima di effettuare la rimozione, rivolgiti al tuo fornitore di servizi." "acquisizione contenuti, contenuti app" "Contenuti app" diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index a9b26d26bc5..dd976eb984f 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -5533,8 +5533,7 @@ "המשך" "לא, תודה" "מיקום" - - + "כדי לבצע שיחות חירום, ספק השירות עשוי לתעד את המיקום שלך כשהשירות הזה בשימוש.\n\nלפרטים, יש לעיין במדיניות הפרטיות של הספק." "ייתכן שזמן שיחה או נתונים שנותרו בחבילה יימחקו. יש לבדוק אצל הספק לפני ההסרה." "תיעוד תוכן, תוכן אפליקציות" "תוכן אפליקציות" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 76a743bd97e..e051a1ef085 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -53,8 +53,7 @@ "縮小" "拡大" "自動回転を使用する" - - + "顔検出は、前面カメラを使用して自動回転の精度を高めます。画像が Google に保存されたり送信されたりすることはありません。" "サンプル テキスト" "オズの魔法使い" "第 11 章: オズの不思議なエメラルド シティ" @@ -2666,7 +2665,7 @@ "使用量の多いアプリを確認" "充電は一時的に制限されています" "バッテリーを長持ちさせるためのヒントをご確認ください。" - "スマートフォンの使用が通常より多いため、バッテリーが通常より早くなくなる可能性があります。\n\nバッテリーを多く使用しているアプリ:" + "スマートフォンのバッテリー使用量が通常より多いため、通常より早くバッテリーがなくなる可能性があります。\n\nバッテリーを多く使用しているアプリ:" "タブレットの使用が通常より多いため、バッテリーが通常より早くなくなる可能性があります。\n\nバッテリーを多く使用しているアプリ:" "デバイスの使用が通常より多いため、バッテリーが通常より早くなくなる可能性があります。\n\nバッテリーを多く使用しているアプリ:" "電力消費量の多いバックグラウンド アクティビティを含める" @@ -5353,8 +5352,7 @@ "続行" "同意しない" "場所" - - + "このサービスを緊急通報に使用すると、携帯通信会社に位置情報を収集されることがあります。\n\n詳しくは、携帯通信会社のプライバシー ポリシーをご覧ください。" "残り時間や残りデータを利用できなくなる可能性があります。削除前にプロバイダにご確認ください。" "コンテンツの取得, アプリのコンテンツ" "アプリのコンテンツ" diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 8c3a043d7e8..c66ead188f6 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -5353,8 +5353,7 @@ "გაგრძელება" "არა, გმადლობთ" "მდებარეობა" - - + "თქვენმა ოპერატორმა შეიძლება დააფიქსიროს თქვენი მდებარეობა, როდესაც ამ სერვისს გადაუდებელი ზარებისთვის იყენებთ.\n\nდეტალები იხილეთ თქვენი ოპერატორის კონფიდენციალურობის დებულებაში." "შეიძლება დაკარგოთ წვდომა ნებისმიერ დარჩენილ დროზე ან მონაცემზე. ამოშლამდე გადაამოწმეთ თქვენს პროვაიდერთან." "კონტენტის აღბეჭდვა, აპის კონტენტი" "აპის კონტენტი" diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 31c32c126fa..cdb3e2da4a4 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -5353,8 +5353,7 @@ "ЖАЛҒАСТЫРУ" "ЖОҚ, РАҚМЕТ" "Локация" - - + "Бұл функцияны құтқару қызметіне қоңырау шалу үшін пайдаланған кезде, операторыңыз локация дерегін жинауы мүмкін.\n\nТолық мәлімет үшін операторыңыздың құпиялылық саясатын қарап шығыңыз." "Қалған уақыт немесе деректерді пайдалана алмай қалуыңыз мүмкін. Алып тастау алдында провайдермен ақылдасыңыз." "мазмұн түсіру, қолданба мазмұны" "Қолданба мазмұны" diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 2b7ada0465b..7585f735af1 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -53,8 +53,7 @@ "កំណត់ឲ្យតូចជាងមុន" "កំណត់ឲ្យធំជាងមុន" "ប្រើការបង្វិល​ស្វ័យ​ប្រវត្តិ" - - + "ការសម្គាល់​មុខប្រើកាមេរ៉ាខាងមុខ ដើម្បីកែលម្អភាពត្រឹមត្រូវនៃការបង្វិល​ស្វ័យ​ប្រវត្តិ។ រូបភាព​មិនត្រូវបានរក្សាទុក ឬផ្ញើទៅ Google ឡើយ។" "អត្ថបទគំរូ" "មេធ្មប់ដ៏អស្ចារ្យនៃទឹកដីពិសិដ្ឋ" "ជំពូកទី 11៖ ទីក្រុងមរកតដ៏អស្ចារ្យនៃទឹកដីពិសិដ្ឋ" @@ -2666,7 +2665,7 @@ "មើលកម្មវិធី​ដែលមាន​ការប្រើប្រាស់ខ្ពស់បំផុត" "បានដាក់កម្រិត​ការសាកថ្មជា​បណ្ដោះអាសន្ន" "ដើម្បីរក្សា​ថ្មរបស់អ្នក។ ស្វែងយល់​បន្ថែម។" - "ដោយសារអ្នក​បានប្រើ​ទូរសព្ទ​របស់អ្នក​ច្រើនជាងធម្មតា ថ្មរបស់អ្នក​អាចនឹង​ឆាប់អស់ជាង​ពេលធម្មតា។\n\nកម្មវិធី​ដែលប្រើថ្ម​ច្រើនបំផុត៖" + "ដោយសារអ្នក​បានប្រើ​ទូរសព្ទ​របស់អ្នក​ច្រើនជាងប្រក្រតី ថ្មរបស់អ្នក​អាចនឹង​ឆាប់អស់ជាង​ពេលធម្មតា។\n\nកម្មវិធី​ដែលប្រើថ្ម​ច្រើនបំផុត៖" "ដោយសារអ្នក​បានប្រើ​ថេប្លេត​របស់អ្នក​ច្រើនជាងធម្មតា ថ្មរបស់អ្នក​អាចនឹង​ឆាប់អស់ជាង​ពេលធម្មតា។\n\nកម្មវិធី​ដែលប្រើថ្ម​ច្រើនបំផុត៖" "ដោយសារអ្នក​បានប្រើ​ឧបករណ៍​របស់អ្នក​ច្រើនជាងធម្មតា ថ្មរបស់អ្នក​អាចនឹង​ឆាប់អស់ជាង​ពេលធម្មតា។\n\nកម្មវិធី​ដែលប្រើថ្ម​ច្រើនបំផុត៖" "រួម​បញ្ចូល​សកម្មភាព​ផ្ទៃខាងក្រោយ​ដែលប្រើថាមពលច្រើន" @@ -2721,7 +2720,7 @@ កម្មវិធី %1$d ត្រូវបាន​ដាក់កំហិត "^1"" ""%""" - "មានបញ្ហាក្នុង​ការអាន​ឧបករណ៍រង្វាស់កម្រិតថ្ម។" + "មានបញ្ហាក្នុង​ការអាន​រង្វាស់កម្រិតថ្ម។" "ចុច ដើម្បីស្វែងយល់បន្ថែម​អំពីបញ្ហានេះ" "បញ្ឈប់កម្មវិធី?" @@ -5353,8 +5352,7 @@ "បន្ត" "ទេ អរគុណ" "ទីតាំង" - - + "ក្រុមហ៊ុនសេវាទូរសព្ទ​របស់អ្នកអាចនឹងប្រមូល​ទីតាំងរបស់អ្នក នៅពេលអ្នកប្រើ​សេវាកម្មនេះសម្រាប់​ការហៅទៅលេខសង្គ្រោះបន្ទាន់។\n\nសូមចូលទៅកាន់​គោលការណ៍ឯកជនភាព​របស់ក្រុមហ៊ុនសេវាទូរសព្ទអ្នក ដើម្បីទទួលបាន​ព័ត៌មានលម្អិត។" "អ្នក​អាចនឹងបាត់បង់​សិទ្ធិ​ចូលប្រើទិន្នន័យ និងរយៈពេលនៅសល់។ សូម​សាកសួរ​ក្រុមហ៊ុន​ផ្ដល់សេវារបស់អ្នក មុនពេលលុប។" "ការថត​ខ្លឹមសារ ខ្លឹមសារ​កម្មវិធី" "ខ្លឹមសារ​កម្មវិធី" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 3dcbad07a38..efdfa84e5db 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -53,8 +53,7 @@ "ಚಿಕ್ಕದಾಗಿಸು" "ದೊಡ್ಡದಾಗಿಸು" "ಸ್ವಯಂ-ತಿರುಗುವಿಕೆಯನ್ನು ಬಳಸಿ" - - + "ಮುಖ ಪತ್ತೆಹಚ್ಚುವಿಕೆಯು ಸ್ವಯಂ-ತಿರುಗುವಿಕೆಯ ನಿಖರತೆಯನ್ನು ಸುಧಾರಿಸಲು ಮುಂಬದಿಯ ಕ್ಯಾಮರಾವನ್ನು ಬಳಸುತ್ತದೆ. ಚಿತ್ರಗಳನ್ನು ಎಂದಿಗೂ ಸಂಗ್ರಹಿಸುವುದಿಲ್ಲ ಅಥವಾ Google ಗೆ ಕಳುಹಿಸಲಾಗುವುದಿಲ್ಲ." "ಮಾದರಿ ಪಠ್ಯ" "Oz ನ ಅದ್ಭುತವಾದ ಮಾಂತ್ರಿಕ" "ಅಧ್ಯಾಯ 11: Oz ನ ಅದ್ಭುತವಾದ ಎಮೆರಾಲ್ಡ್ ಸಿಟಿ" @@ -2666,9 +2665,9 @@ "ಅತ್ಯಂತ ಹೆಚ್ಚು ಬಳಸಲಾದ ಆ್ಯಪ್‌ಗಳನ್ನು ನೋಡಿ" "ಚಾರ್ಜಿಂಗ್ ತಾತ್ಕಾಲಿಕವಾಗಿ ಸೀಮಿತವಾಗಿದೆ" "ನಿಮ್ಮ ಬ್ಯಾಟರಿಯನ್ನು ಉಳಿಸಲು. ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ." - "ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಿರುವ ಕಾರಣದಿಂದ, ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಆ್ಯಪ್‌ಗಳು ಹೆಚ್ಚಿನ ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸುತ್ತಿವೆ:" - "ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಿರುವ ಕಾರಣದಿಂದ, ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಆ್ಯಪ್‌ಗಳು ಹೆಚ್ಚಿನ ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸುತ್ತಿವೆ:" - "ನಿಮ್ಮ ಸಾಧನವನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಿರುವ ಕಾರಣದಿಂದ, ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಆ್ಯಪ್‌ಗಳು ಹೆಚ್ಚಿನ ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸುತ್ತಿವೆ:" + "ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಿರುವ ಕಾರಣದಿಂದ, ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಹೆಚ್ಚಿನ ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸುತ್ತಿರುವ ಆ್ಯಪ್‌ಗಳು:" + "ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಿರುವ ಕಾರಣದಿಂದ, ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಹೆಚ್ಚಿನ ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸುತ್ತಿರುವ ಆ್ಯಪ್‌ಗಳು:" + "ನಿಮ್ಮ ಸಾಧನವನ್ನು ಸಾಮಾನ್ಯಕ್ಕಿಂತ ಹೆಚ್ಚು ಬಳಸಿರುವ ಕಾರಣದಿಂದ, ನಿಮ್ಮ ಬ್ಯಾಟರಿಯು ನಿರೀಕ್ಷಿಸಿದ ಅವಧಿಗಿಂತ ಮುನ್ನವೇ ಖಾಲಿಯಾಗಬಹುದು.\n\nಹೆಚ್ಚಿನ ಬ್ಯಾಟರಿಯನ್ನು ಬಳಸುತ್ತಿರುವ ಆ್ಯಪ್‌ಗಳು:" "ಅಧಿಕ ಬ್ಯಾಟರಿ ಬಳಸುವ ಹಿನ್ನೆಲೆ ಚಟುವಟಿಕೆಯನ್ನು ಒಳಗೊಂಡಿದೆ" %1$d ಆ್ಯಪ್ ಅನ್ನು ನಿರ್ಬಂಧಿಸಿ @@ -5353,8 +5352,7 @@ "ಮುಂದುವರಿಸಿ" "ಬೇಡ" "ಸ್ಥಳ" - - + "ನೀವು ಈ ಸೇವೆಯನ್ನು ತುರ್ತು ಕರೆಗಳಿಗಾಗಿ ಬಳಸುವಾಗ ನಿಮ್ಮ ವಾಹಕವು ನಿಮ್ಮ ಸ್ಥಳದ ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಬಹುದು.\n\nವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ವಾಹಕದ ಗೌಪ್ಯತೆ ನೀತಿಗೆ ಭೇಟಿ ನೀಡಿ." "ನೀವು ಯಾವುದೇ ಬಾಕಿಯಿರುವ ಸಮಯ ಅಥವಾ ಡೇಟಾಗೆ ಪ್ರವೇಶವನ್ನು ಕಳೆದುಕೊಳ್ಳಬಹುದು. ತೆಗೆದುಹಾಕುವ ಮೊದಲು ನಿಮ್ಮ ಪೂರೈಕೆದಾರರನ್ನು ಪರಿಶೀಲಿಸಿ." "ವಿಷಯ ಕ್ಯಾಪ್ಚರ್, ಆ್ಯಪ್ ವಿಷಯ" "ಆ್ಯಪ್ ವಿಷಯ" diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 362ac80ada9..95b0a73e860 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -53,8 +53,7 @@ "축소" "확대" "자동 회전 사용" - - + "얼굴 인식 기능은 전면 카메라를 사용하여 자동 회전 정확도를 높입니다. 이미지는 Google에 전송되거나 저장되지 않습니다." "샘플 텍스트" "오즈의 마법사" "11장: 오즈의 멋진 에메랄드 도시" @@ -5355,8 +5354,7 @@ "계속" "거부" "위치" - - + "긴급 전화를 위해 이 서비스를 사용할 때 이동통신사에서 사용자의 위치를 수집할 수 있습니다.\n\n자세한 내용은 이동통신사의 개인정보처리방침을 참고하세요." "남은 시간 또는 데이터를 이용하지 못할 수 있습니다. 삭제하기 전에 제공업체에 확인하세요." "콘텐츠 캡처, 앱 콘텐츠" "앱 콘텐츠" diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index 8579344ad57..f77887ed4cb 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -5353,8 +5353,7 @@ "ООБА" "ЖОК, РАХМАТ" "Жайгашкан жер" - - + "Шашылыш чалуулар үчүн бул кызматты колдонгонуңузда, байланыш операторуңуз жайгашкан жериңиз тууралуу маалыматты чогултушу мүмкүн.\n\nКеңири маалымат алуу үчүн байланыш операторуңуздун купуялык саясатына баш багыңыз." "Калган убакытты же маалыматтарды пайдалануу мүмкүнчүлүгүнөн айрыласыз. Өчүрүүдөн мурда, операторуңузга байланышыңыз." "мазмунду сүрөткө тартуу, колдонмонун мазмуну" "Колдонмонун мазмуну" diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 56047d31823..72df2a278c7 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -53,8 +53,7 @@ "ເຮັດໃຫ້ນ້ອຍລົງ" "ເຮັດໃຫ້ໃຫຍ່ຂຶ້ນ" "ໃຊ້ການໝຸນອັດຕະໂນມັດ" - - + "ການກວດຫາໃບໜ້າຈະໃຊ້ກ້ອງໜ້າເພື່ອປັບປຸງຄວາມຖືກຕ້ອງຂອງການໝຸນອັດຕະໂນມັດ. ຮູບຈະບໍ່ຖືກຈັດເກັບ ຫຼື ສົ່ງໄປໃຫ້ Google ເດັດຂາດ." "ຂໍ້ຄວາມຕົວຢ່າງ" "ພໍ່ມົດອັດສະຈັນແຫ່ງອອດຊ໌" "ບົດທີ 11: ເມືອງມໍລະກົດອັນໜ້າອັດສະຈັນຂອງອອດຊ໌" @@ -5353,8 +5352,7 @@ "ສືບຕໍ່" "ບໍ່, ຂອບໃຈ" "ສະຖານທີ່" - - + "ຜູ້ໃຫ້ບໍລິການຂອງທ່ານອາດຮວບຮວມສະຖານທີ່ຂອງທ່ານເມື່ອທ່ານໃຊ້ບໍລິການນີ້ສຳລັບການໂທສຸກເສີນ.\n\nກະລຸນາເຂົ້າເບິ່ງນະໂຍບາຍຄວາມເປັນສ່ວນຕົວຂອງຜູ້ໃຫ້ບໍລິການຂອງທ່ານສຳລັບລາຍລະອຽດຕ່າງໆ." "ທ່ານອາດສູນເສຍສິດເຂົ້າເຖິງເວລາ ຫຼື ອິນເຕີເນັດທີ່ຍັງເຫຼືອຢູ່. ກະລຸນາກວດສອບກັບຜູ້ໃຫ້ບໍລິການຂອງທ່ານກ່ອນການລຶບອອກ." "ບັນທຶກເນື້ອຫາ, ເນື້ອ" "ເນື້ອຫາແອັບ" diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index f7c3c22a3ef..ad8d2814cca 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -5531,8 +5531,7 @@ "TĘSTI" "AČIŪ, NE" "Vietovė" - - + "Operatorius gali rinkti vietovės duomenis, kai naudojatės šia paslauga norėdami atlikti skambučius pagalbos numeriu.\n\nApsilankykite operatoriaus privatumo politikos puslapyje, jei reikia išsamios informacijos." "Galite prarasti galimybę pasiekti likusį laiką ar duomenis. Prieš pašalindami pasikonsultuokite su teikėju." "turinio užfiksavimas, programos turinys" "Programos turinys" diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index c90a90eece4..e710827cb59 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -54,8 +54,7 @@ "Samazināt" "Palielināt" "Automātiska pagriešana" - - + "Sejas noteikšanas funkcija izmanto priekšējo kameru, lai uzlabotu automātiskās pagriešanas precizitāti. Attēli nekad netiek ne glabāti, ne sūtīti uzņēmumam Google." "Teksta paraugs" "Brīnumainais burvis no Oza zemes" "11. nodaļa: Oza zemes brīnumainā Smaragda pilsēta" @@ -5442,8 +5441,7 @@ "TURPINĀT" "NĒ, PALDIES" "Atrašanās vieta" - - + "Ja izmantosiet šo pakalpojumu ārkārtas izsaukumiem, mobilo sakaru operators var ievākt jūsu atrašanās vietas informāciju.\n\nLai uzzinātu vairāk, skatiet mobilo sakaru operatora konfidencialitātes politiku." "Iespējams, zaudēsiet piekļuvi atlikušajam laikam vai datiem. Pirms noņemšanas sazinieties ar pakalpojuma sniedzēju." "satura uzņēmums, lietotņu saturs" "Lietotnes saturs" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index d2a4ebee910..49e25e4bc60 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -53,8 +53,7 @@ "ചെറുതാക്കുക" "വലുതാക്കുക" "\'സ്വയമേവ തിരിയുക\' ഉപയോഗിക്കുക" - - + "\'സ്വയമേ തിരിയുക\' എന്നതിന്റെ കൃത്യത മെച്ചപ്പെടുത്തുന്നതിന്, \'മുഖം തിരിച്ചറിയൽ\' മുൻ ക്യാമറയാണ് ഉപയോഗിക്കുന്നത്. ഒരിക്കലും ചിത്രങ്ങൾ Google-ൽ സംഭരിക്കുകയോ അതിലേക്ക് അയയ്‌ക്കുകയോ ചെയ്യില്ല." "സാമ്പിൾ ടെക്‌സ്റ്റ്" "ഓസ് നഗരത്തിലെ അതിശയിപ്പിക്കുന്ന മന്ത്രവാദി" "അധ്യായം 11: ഓസ് എന്ന അത്ഭുതകരമായ മരതകനഗരം" @@ -5353,8 +5352,7 @@ "തുടരുക" "വേണ്ട" "ലൊക്കേഷൻ" - - + "എമർജൻസി കോളുകൾക്ക് ഈ സേവനം ഉപയോഗിക്കുമ്പോൾ, സേവനദാതാവ് നിങ്ങളുടെ ലൊക്കേഷൻ ശേഖരിച്ചേക്കാം.\n\nവിശദാംശങ്ങൾക്ക്, നിങ്ങളുടെ സേവനദാതാവിന്റെ സ്വകാര്യതാ നയം സന്ദർശിക്കുക." "ഏതെങ്കിലും ബാക്കിയുള്ള സമയത്തിലേക്കോ ഡാറ്റയിലേക്കോ ഉള്ള ആക്‌സസ് നഷ്‌ടപ്പെട്ടേക്കാം. നീക്കം ചെയ്യുന്നതിന് മുമ്പ് നിങ്ങളുടെ ദാതാവുമായി പരിശോധിക്കുക" "ഉള്ളടക്കം ക്യാപ്‌ചർ ചെയ്യൽ, ആപ്പ് ഉള്ളടക്കം" "ആപ്പ് ഉള്ളടക്കം" diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index 44fdc70e588..a4b74075f74 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -53,8 +53,7 @@ "Жижигрүүлэх" "Томруулах" "Автоматаар эргүүлэх онцлогийг ашиглах" - - + "Царай илрүүлэх онцлог нь Автоматаар эргүүлэх онцлогийн нарийвчлалыг сайжруулахын тулд урд талын камерыг ашиглана. Зургийг Google-д хадгалдаггүйгээс гадна илгээдэггүй." "Жишээ текст" "Озын Гайхамшигт шидтэн" "Бүлэг 11: Озын Гайхамшигт Маргад эрдэнийн хот" @@ -5353,8 +5352,7 @@ "ҮРГЭЛЖЛҮҮЛЭХ" "ҮГҮЙ, БАЯРЛАЛАА" "Байршил" - - + "Таныг энэ үйлчилгээг яаралтай дуудлагад ашиглах үед таны оператор компани байршлын мэдээллийг тань цуглуулж магадгүй.\n\nДэлгэрэнгүй мэдээлэл авах бол оператор компанийнхаа нууцлалын бодлогод зочилно уу." "Та үлдсэн хугацаа эсвэл датад хандах эрхгүй болж магадгүй. Устгахаас өмнө үйлчилгээ үзүүлэгчтэйгээ холбогдоно уу." "контентын зураг авах, аппын контент" "Аппын контент" diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index b5aebc20944..913d8a287e9 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -5353,8 +5353,7 @@ "TERUSKAN" "TIDAK PERLU" "Lokasi" - - + "Pembawa anda mungkin mengumpulkan lokasi anda semasa anda menggunakan perkhidmatan ini untuk panggilan kecemasan.\n\nUntuk mendapatkan butiran, lawati dasar privasi pembawa anda." "Anda mungkin kehilangan akses kepada mana-mana baki masa atau data. Semak dengan penyedia anda sebelum mengalih keluar." "tangkapan kandungan, kandungan apl" "Kandungan apl" diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 571c282467d..e1ea0cf915a 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -53,8 +53,7 @@ "ပိုသေးအောင် ပြုလုပ်ပါ" "ပိုကြီးအောင် ပြုလုပ်ပါ" "အလိုအလျောက်လှည့်ခြင်း သုံးရန်" - - + "‘အလိုအလျောက်လှည့်ခြင်း’ ပိုမိုတိကျစေရန် \'မျက်နှာကို မှတ်မိခြင်း\' က အရှေ့ဘက်ကင်မရာကို သုံးသည်။ ပုံများကို ဘယ်တော့မှ မသိမ်းပါ (သို့) Google သို့ မပို့ပါ။" "နမူနာ စာသား" "Oz ၏အံ့ဖွယ်ဝိဇ္ဇာ" "အခန်းကြီး ၁၁ − Oz ၏အံ့ဖွယ် မြစိမ်းရောင်မြို့တော်" @@ -5353,8 +5352,7 @@ "ရှေ့ဆက်ရန်" "မလိုပါ" "တည်နေရာ" - - + "အရေးပေါ် ဖုန်းခေါ်ခြင်းအတွက် ဤဝန်ဆောင်မှုကို သုံးသည့်အခါ မိုဘိုင်းဖုန်းကုမ္ပဏီသည် သင့်တည်နေရာကို စုဆောင်းနိုင်သည်။\n\nအသေးစိတ်ကို မိုဘိုင်းဖုန်းကုမ္ပဏီ၏ ကိုယ်ရေးအချက်အလက်လုံခြုံမှုဆိုင်ရာ မူဝါဒတွင် ဝင်ကြည့်ပါ။" "ကျန်ရှိသည့် အချိန် သို့မဟုတ် ဒေတာများ ဝင်သုံးခွင့် ဆုံးရှုံးနိုင်သည်။ မဖယ်ရှားမီ သင့်ဝန်ဆောင်မှုပေးသူနှင့် စစ်ဆေးပါ။" "အကြောင်းအရာ ဖမ်းယူမှု၊ အက်ပ်အကြောင်းအရာ" "အက်ပ်အကြောင်းအရာ" diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index 03594b2687a..f504648718c 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -53,8 +53,7 @@ "Gjør mindre" "Gjør større" "Bruk automatisk rotasjon" - - + "Ansiktsgjenkjenning bruker frontkameraet til å forbedre nøyaktigheten til automatisk rotasjon. Bilder blir aldri lagret eller sendt til Google." "Eksempeltekst" "Trollmannen fra Oz" "Kapittel 11: Den vidunderlige smaragdbyen Oz" @@ -5353,8 +5352,7 @@ "FORTSETT" "NEI TAKK" "Posisjon" - - + "Operatøren din kan samle inn posisjonen din når du bruker denne tjenesten for nødanrop.\n\nSe personvernreglene til operatøren for mer informasjon." "Du kan miste tilgang til gjenværende tid eller data. Sjekk med leverandøren din før fjerning." "innholdsregistrering, appinnhold" "Appinnhold" diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 66ee4f2e65b..cdf3f06fc51 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -53,8 +53,7 @@ "अझ सानो बनाउनुहोस्" "अझ ठुलो बनाउनुहोस्" "अटो-रोटेट प्रयोग गरियोस्" - - + "अनुहार पत्ता लगाउने सुविधाले स्वतः रोटेट गर्ने सुविधाको सटीकता सुधार गर्न अगाडिको क्यामेरा प्रयोग गर्छ। फोटोहरू कहिल्यै स्टोर गरिँदैनन् वा Google मा सुरक्षित गरिँदैनन्।" "नमूना पाठ" "दि वन्डरफुल विजार्ड अफ ओज" "अध्याय ११: दि वन्डरफुल एमरल्ड सिटी अफ ओज" @@ -5353,8 +5352,7 @@ "जारी राख्नुहोस्" "पर्दैन, धन्यवाद" "स्थान" - - + "तपाईंले यो सेवा प्रयोग गरेर आपत्कालीन अवस्थामा कल गर्दा तपाईंका सेवा प्रदायकले तपाईंको लोकेसन सङ्कलन गर्न सक्छ।\n\nविस्तृत विवरणका लागि सेवा प्रदायककको गोपनीयता नीति हेर्नुहोस्।" "तपाईं बाँकी जुनसुकै समय वा डेटामाथिको पहुँच गुमाउन सक्नुहुन्छ। हटाउनुभन्दा पहिले आफ्ना सेवा प्रदायकमार्फत जाँच गर्नुहोस्।" "सामग्री समावेश, एपको सामग्री" "एपको सामग्री" diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index bd71428d4b6..e8e1fa63f60 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -53,8 +53,7 @@ "Verkleinen" "Vergroten" "Automatisch draaien gebruiken" - - + "Gezichtsherkenning gebruikt de camera aan de voorzijde om de nauwkeurigheid van automatisch draaien te verbeteren. Afbeeldingen worden nooit opgeslagen of naar Google gestuurd." "Voorbeeldtekst" "De tovenaar van Oz" "Hoofdstuk 11: De prachtige Smaragden Stad van Oz" @@ -5353,8 +5352,7 @@ "DOORGAAN" "NEE" "Locatie" - - + "Je provider kan je locatie verzamelen als je deze service gebruikt voor noodoproepen.\n\nLees het Privacybeleid van je provider voor meer informatie." "Je hebt mogelijk geen toegang meer tot resterende tijd of gegevens. Neem contact op met je provider voordat je doorgaat met verwijderen." "contentopname, app-content" "App-content" diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 8c9278c576c..daaa53f5e6f 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -55,8 +55,7 @@ "Pomniejsz" "Powiększ" "Używaj autoobracania" - - + "Wykrywanie twarzy używa przedniego aparatu, aby zapewnić większą dokładność autoobracania. Obrazy nigdy nie są zapisywane ani wysyłane do Google." "Przykładowy tekst" "Czarnoksiężnik z Krainy Oz" "Rozdział 11: Szmaragdowe Miasto" @@ -2483,7 +2482,7 @@ "Dostosowywanie dźwięku" "Włączono skrót" - "Wyłączone" + "Wyłączono" "Wł." "Wyłączone" "Nie działa. Kliknij, by uzyskać informacje." @@ -5531,8 +5530,7 @@ "DALEJ" "NIE" "Lokalizacja" - - + "Operator może pobierać dane o Twojej lokalizacji, gdy używasz tej usługi do połączeń alarmowych. \n\nWięcej informacji znajdziesz w polityce prywatności operatora" "Możesz stracić możliwość wykorzystania pozostałego czasu lub danych. Zanim usuniesz, uzyskaj informacje od operatora." "przechwytywanie zawartości, zawartość aplikacji" "Zawartość aplikacji" diff --git a/res/values-pt-rBR/strings.xml b/res/values-pt-rBR/strings.xml index d5832b36aaa..35906c3ed39 100644 --- a/res/values-pt-rBR/strings.xml +++ b/res/values-pt-rBR/strings.xml @@ -53,8 +53,7 @@ "Tornar menor" "Tornar maior" "Usar o giro automático" - - + "A detecção facial usa a câmera frontal para melhorar a precisão do giro automático. As imagens nunca são armazenadas ou enviadas ao Google." "Texto de amostra" "O Mágico de Oz" "Capítulo 11: A maravilhosa Cidade das Esmeraldas de Oz" @@ -5355,8 +5354,7 @@ "CONTINUAR" "NÃO" "Localização" - - + "A operadora poderá coletar sua localização quando você usar o serviço para fazer chamadas de emergência.\n\nAcesse a Política de Privacidade da operadora para ver mais detalhes." "Você pode perder o acesso a qualquer tempo ou dado restante. Verifique essa informação com o provedor antes de remover." "captura de conteúdo, conteúdo do app" "Conteúdo do app" diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index 6f5e498fc24..6d50dfd3343 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -53,8 +53,7 @@ "Diminuir" "Aumentar" "Utilizar a rotação automática" - - + "A deteção facial utiliza a câmara frontal para melhorar a precisão da rotação automática. As imagens nunca são armazenadas nem enviadas à Google." "Exemplo de texto" "O Maravilhoso Feiticeiro de Oz" "Capítulo 11: A Maravilhosa Cidade Esmeralda de Oz" @@ -5353,8 +5352,7 @@ "CONTINUAR" "NÃO, OBRIGADO" "Localização" - - + "O operador pode recolher a sua localização quando utiliza este serviço para chamadas de emergência.\n\nVisite a política de privacidade do seu operador para obter os detalhes." "Pode perder o acesso a qualquer tempo ou dados restantes. Consulte o seu fornecedor antes de remover." "captura do conteúdo, conteúdo da aplicação" "Conteúdo da aplicação" diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index d5832b36aaa..35906c3ed39 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -53,8 +53,7 @@ "Tornar menor" "Tornar maior" "Usar o giro automático" - - + "A detecção facial usa a câmera frontal para melhorar a precisão do giro automático. As imagens nunca são armazenadas ou enviadas ao Google." "Texto de amostra" "O Mágico de Oz" "Capítulo 11: A maravilhosa Cidade das Esmeraldas de Oz" @@ -5355,8 +5354,7 @@ "CONTINUAR" "NÃO" "Localização" - - + "A operadora poderá coletar sua localização quando você usar o serviço para fazer chamadas de emergência.\n\nAcesse a Política de Privacidade da operadora para ver mais detalhes." "Você pode perder o acesso a qualquer tempo ou dado restante. Verifique essa informação com o provedor antes de remover." "captura de conteúdo, conteúdo do app" "Conteúdo do app" diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index c042d08048c..9dabd8da283 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -5444,8 +5444,7 @@ "CONTINUAȚI" "NU, MULȚUMESC" "Locație" - - + "Operatorul dvs. vă poate colecta locația atunci când folosiți acest serviciu pentru apeluri de urgență\n\nConsultați politica de confidențialitate a operatorului pentru detalii." "Puteți pierde accesul la timpul sau datele rămase. Consultați operatorul înainte de eliminare." "captură de conținut, conținutul aplicației" "Conținutul aplicației" diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 7ddf726d254..7c1f3157ef6 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -2797,7 +2797,7 @@ %1$d приложения с ограниченным доступом "^1"" ""%""" - "Не удается получить данные об уровне заряда батареи." + "Не удалось узнать уровень заряда батареи." "Подробнее об этой ошибке…" "Остановить приложение?" @@ -5531,8 +5531,7 @@ "ДАЛЕЕ" "НЕТ" "Местоположение" - - + "Когда вы пользуетесь этим сервисом для экстренных вызовов, ваш оператор связи может собирать данные о местоположении устройства.\n\nЧтобы узнать больше, прочитайте Политику конфиденциальности вашего оператора." "Вы можете потерять доступ к оставшимся минутам или трафику. Прежде чем выполнять удаление, обратитесь к оператору связи." "content capture, контент приложения" "Контент приложений" diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 8997e83757e..b89e0e7685b 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -5533,8 +5533,7 @@ "POKRAČOVAŤ" "NIE, ĎAKUJEM" "Poloha" - - + "Pri používaní tejto služby na tiesňové volania môže operátor zhromažďovať údaje o vašej polohe.\n\nPodrobnosti nájdete v pravidlách ochrany súkromia svojho operátora." "Môžete prísť o prístup k zostávajúcemu času či dátam. Pred odstránením sa poraďte so svojím operátorom." "snímanie obsahu, obsah aplikácie" "Obsah aplikácie" diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index 1cf26cf4353..4651cbf4043 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -55,8 +55,7 @@ "Pomanjšanje" "Povečanje" "Uporabi samodejni zasuk" - - + "Zaznavanje obraza uporablja sprednji fotoaparat za izboljšanje natančnosti samodejnega zasuka. Slike se nikoli ne shranijo in ne pošljejo Googlu." "Vzorčno besedilo" "Čudoviti čarovnik iz Oza" "11. poglavje: Čudovito Smaragdno mesto" @@ -2799,7 +2798,7 @@ %1$d aplikacij je omejenih "^1"" ""%""" - "Težava z branjem indikatorja stanja napolnjenosti baterije." + "Težava z branjem merilnika stanja napolnjenosti baterije." "Dotaknite se, če želite izvedeti več o tej napaki." "Želite ustaviti aplikacijo?" @@ -5533,8 +5532,7 @@ "NADALJUJ" "NE, HVALA" "Lokacija" - - + "Ko uporabite to storitev za klice v sili, vaš operater morda zbira podatke o lokaciji.\n\nPodrobnosti preverite v operaterjevem pravilniku o zasebnosti." "Morda boste izgubili dostop do preostalega časa ali podatkov. Pred odstranjevanjem preverite pri operaterju." "zajem vsebine, vsebina aplikacije" "Vsebina aplikacije" diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 434ee64b790..cc122821394 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -54,8 +54,7 @@ "Умањи" "Увећај" "Користи аутоматско ротирање" - - + "Препознавање лица користи предњу камеру за побољшање прецизности аутоматског ротирања. Слике се никада не чувају нити шаљу Google-у." "Пример текста" "Чаробњак из Оза" "Поглавље 11: Чудесни Смарагдни град Оза" @@ -5442,8 +5441,7 @@ "НАСТАВИ" "НЕ, ХВАЛА" "Локација" - - + "Мобилни оператер може да прикупља податке о локацији када користите ову услугу за хитне позиве.\n\nПотражите детаље у политици приватности мобилног оператера." "Можете да изгубите приступ преосталом времену или подацима. Проверите са добављачем услуге пре уклањања." "снимање садржаја, садржај апликације" "Садржај апликације" diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index c139754b562..1ca9019bf41 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -53,8 +53,7 @@ "Förminska" "Förstora" "Använd automatisk rotation" - - + "Ansiktsigenkänning använder den framåtvända kameran för att förbättra inställningen för att rotera automatiskt. Inga bilder sparas eller skickas till Google." "Exempeltext" "Den fantastiska trollkarlen från Oz" "Kapitel 11: Den underbara Smaragdstaden i Oz" @@ -2666,7 +2665,7 @@ "Se appar med högst batteriförbrukning" "Laddning har begränsats tillfälligt" "För att spara batteri. Läs mer." - "Eftersom du har använt telefonen mer än vanligt kan batteriet kan ta slut snabbare än normalt.\n\nAppar med högst batteriförbrukning:" + "Eftersom du har använt telefonen mer än vanligt kan batteriet ta slut snabbare än normalt.\n\nAppar med högst batteriförbrukning:" "Eftersom du har använt surfplattan mer än vanligt kan batteriet kan ta slut snabbare än normalt.\n\nAppar med högst batteriförbrukning:" "Eftersom du har använt enheten mer än vanligt kan batteriet kan ta slut snabbare än normalt.\n\nAppar med högst batteriförbrukning:" "Inkluderar batterikrävande aktivitet i bakgrunden" @@ -5353,8 +5352,7 @@ "FORTSÄTT" "NEJ TACK" "Plats" - - + "Operatören kan registrera din plats när du använder tjänsten för nödsamtal.\n\nLäs mer i operatörens integritetspolicy." "Du kan förlora kvarstående tid eller data. Hör med operatören innan du raderar." "innehållsidentifiering, appinnehåll" "Appinnehåll" diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 15b329740ba..90e157552dd 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -53,8 +53,7 @@ "சிறிதாக்கு" "பெரிதாக்கு" "\'தானாகச் சுழற்றுதலைப்\' பயன்படுத்து" - - + "தானாகச் சுழற்றுதலின் துல்லியத்தை மேம்படுத்த, முகம் கண்டறிதல் அம்சம் முன்பக்கக் கேமராவைப் பயன்படுத்துகிறது. படங்கள் ஒருபோதும் சேமிக்கப்படாது, Googleளுக்கும் அனுப்பப்படாது." "மாதிரி உரை" "தி விசார்ட் ஆஃப் ஓஸ்" "அத்தியாயம் 11: ஓஸின் அற்புதமான மரகத நகரம்" @@ -5353,8 +5352,7 @@ "தொடர்க" "வேண்டாம்" "இருப்பிடம்" - - + "அவசர அழைப்புகளுக்கு இந்தச் சேவையை நீங்கள் உபயோகிக்கும்போது மொபைல் நிறுவனம் உங்கள் இருப்பிடத்தைச் சேகரிக்கக்கூடும்.\n\nவிவரங்களுக்கு உங்கள் மொபைல் நிறுவனத்தின் தனியுரிமைக் கொள்கையைப் பார்க்கவும்." "மீதமிருக்கும் நேரம் அல்லது தரவிற்கான அணுகலை நீங்கள் இழக்கக்கூடும். இதை அகற்றுவதற்கு முன்பாக வழங்குநரைத் தொடர்புகொள்ளவும்." "உள்ளடக்கத்தைச் சேமித்தல், ஆப்ஸ் உள்ளடக்கம்" "ஆப்ஸ் உள்ளடக்கம்" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 980f556d266..fa701e081f2 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -5354,8 +5354,7 @@ "కొనసాగించు" "వద్దు, ధన్యవాదాలు" "లొకేషన్" - - + "మీరు ఈ సర్వీస్‌ను ఎమర్జెన్సీ కాల్స్ కోసం ఉపయోగించినప్పుడు మీ క్యారియర్ మీ లొకేషన్‌ను సేకరించే అవకాశం ఉంది.\n\nవివరాల కోసం మీ క్యారియర్ గోప్యతా పాలసీని సందర్శించండి." "మీరు ఏదైనా మిగిలిన సమయం లేదా డేటాకు యాక్సెస్‌ను కోల్పోవచ్చు. తీసివేసే ముందు మీ ప్రదాతతో తనిఖీ చేయండి." "కంటెంట్ క్యాప్చర్, యాప్ కంటెంట్" "యాప్ కంటెంట్" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 41928e3f14b..510c963b63b 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -1434,7 +1434,7 @@ "ทำข้อความเป็นตัวหนา" "ขนาดอักษร" "ทำให้ข้อความมีขนาดใหญ่ขึ้นหรือเล็กลง" - "การตั้งค่าการล็อก​ซิมการ์ด" + "การตั้งค่าการล็อกซ⁠ิ⁠ม⁠ก⁠า⁠ร⁠์⁠ด" "การล็อกซิมการ์ด" "ปิด" "ล็อกแล้ว" @@ -5353,8 +5353,7 @@ "ต่อไป" "ไม่เป็นไร" "ตำแหน่ง" - - + "ผู้ให้บริการอาจรวบรวมข้อมูลตำแหน่งเมื่อใช้บริการนี้สำหรับหมายเลขฉุกเฉิน\n\nไปที่นโยบายความเป็นส่วนตัวของผู้ให้บริการเพื่อดูรายละเอียด" "คุณอาจใช้เวลาหรืออินเทอร์เน็ตที่เหลือต่อไม่ได้ โปรดสอบถามผู้ให้บริการก่อนนำออก" "การบันทึกเนื้อหา เนื้อหาแอป" "เนื้อหาแอป" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 9ab036ee609..fbf8780362c 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -5353,8 +5353,7 @@ "MAGPATULOY" "HUWAG NA LANG" "Lokasyon" - - + "Posibleng kolektahin ng carrier mo ang iyong lokasyon kapag ginamit mo ang serbisyong ito para sa mga emergency na tawag.\n\nBisitahin ang patakaran sa privacy ng iyong carrier para sa mga detalye." "Baka mawalan ka ng access sa anumang natitirang oras o data. Itanong sa iyong provider bago ito alisin." "pag-capture ng content, content ng app" "Content ng app" diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index 08e3de46dac..ef6627f5e05 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -53,8 +53,7 @@ "Küçült" "Büyüt" "Otomatik döndürmeyi kullan" - - + "Yüz Algılama işlevi, Otomatik Döndürme doğruluğunu iyileştirmek için ön kamerayı kullanır. Resimler hiçbir zaman saklanmaz veya Google\'a gönderilmez." "Örnek metin" "Muhteşem Oz Büyücüsü" "11. Bölüm: Oz\'un Muhteşem Zümrüt Kenti" @@ -5353,8 +5352,7 @@ "DEVAM" "HAYIR TEŞEKKÜRLER" "Konum" - - + "Bu hizmeti acil durum aramaları için kullandığınızda operatörünüz konum verilerinizi toplayabilir.\n\nAyrıntılı bilgi için operatörünüzün gizlilik politikasına göz atın." "Kalan sürelere veya verilere erişiminizi kaybedebilirsiniz. Kaldırmadan önce sağlayıcınıza başvurun." "içerik yakalama, uygulama içeriği" "Uygulama içeriği" diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index 2a73e74d277..081e6e38602 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -55,8 +55,7 @@ "Зменшити" "Збільшити" "Увімкнути автообертання" - - + "Технологія розпізнавання облич використовує фронтальну камеру, щоб підвищувати точність автообертання. Зображення ніколи не зберігаються та не надсилаються на сервери Google." "Зразок тексту" "Чарівник країни Оз" "Глава 11. Дивовижне Смарагдове місто країни Оз" @@ -2728,9 +2727,9 @@ "Переглянути додатки, що найбільше використовують заряд" "Заряджання тимчасово обмежено" "Це запобігає старінню акумулятора. Докладніше." - "Оскільки ви користувалися телефоном більше, ніж зазвичай, акумулятор може розрядитися швидше.\n\nДодатки, які споживають найбільше заряду, наведено нижче." - "Оскільки ви користувалися планшетом більше, ніж зазвичай, акумулятор може розрядитися швидше.\n\nДодатки, які споживають найбільше заряду, наведено нижче." - "Оскільки ви користувалися пристроєм більше, ніж зазвичай, акумулятор може розрядитися швидше.\n\nДодатки, які споживають найбільше заряду, наведено нижче." + "Оскільки ви користувалися телефоном більше, ніж зазвичай, акумулятор може розрядитися швидше.\n\nДодатки, які споживають найбільше заряду:" + "Оскільки ви користувалися планшетом більше, ніж зазвичай, акумулятор може розрядитися швидше.\n\nДодатки, які споживають найбільше заряду:" + "Оскільки ви користувалися пристроєм більше, ніж зазвичай, акумулятор може розрядитися швидше.\n\nДодатки, які споживають найбільше заряду:" "Виявлено енергозатратну активність у фоновому режимі" Обмежити %1$d додаток @@ -2797,7 +2796,7 @@ %1$d додатка обмежено "^1"" ""%""" - "Не вдалось отримати дані лічильника акумулятора." + "Не вдалось отримати дані про рівень заряду акумулятора." "Натисніть, щоб дізнатися більше про цю помилку" "Припинити роботу додатка?" @@ -5531,8 +5530,7 @@ "ПРОДОВЖИТИ" "НІ, ДЯКУЮ" "Місцезнаходження" - - + "Оператор може збирати дані про ваше місцезнаходження, коли ви користуєтеся цим сервісом для здійснення екстрених викликів.\n\nЩоб дізнатися більше, перегляньте політику конфіденційності свого оператора." "Ви можете втратити доступ до залишку часу або даних. Щоб дізнатися більше, зв’яжіться з оператором." "запис вмісту, вміст додатків" "Контент додатків" diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index cc0625b6eb6..cd751772e84 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -53,8 +53,7 @@ "Thu nhỏ" "Phóng to" "Dùng tính năng Tự động xoay" - - + "Công nghệ Phát hiện khuôn mặt sử dụng máy ảnh mặt trước để cải thiện độ chính xác của tính năng Tự động xoay. Hình ảnh không bao giờ được lưu trữ hoặc gửi cho Google." "Văn bản mẫu" "Phù thủy xứ Oz" "Chương 11: Thành phố ngọc lục bảo của xứ Oz" @@ -5355,8 +5354,7 @@ "TIẾP TỤC" "KHÔNG, CẢM ƠN" "Vị trí" - - + "Nhà mạng có thể thu thập thông tin vị trí của bạn khi bạn sử dụng dịch vụ này để thực hiện cuộc gọi khẩn cấp.\n\nHãy xem chính sách quyền riêng tư của nhà mạng để biết thông tin chi tiết." "Bạn có thể không xem được mọi dữ liệu hoặc thời gian còn lại. Hãy hỏi nhà cung cấp trước khi xóa." "ghi lại nội dung, nội dung ứng dụng" "Nội dung ứng dụng" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index e07ea780ac5..fad50c155b0 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -53,8 +53,7 @@ "缩小" "放大" "使用自动屏幕旋转" - - + "人脸检测功能使用前置摄像头提高自动屏幕旋转的准确性。系统绝不会存储相关图片,也不会将其发送给 Google。" "示例文本" "绿野仙踪" "第 11 章:奥兹国神奇的翡翠城" @@ -2721,7 +2720,7 @@ %1$d 个应用受到限制 "^1"" ""%""" - "读取电池电量计时出现问题。" + "读取电池计量器时出现问题。" "点按即可详细了解此错误" "要停止该应用吗?" @@ -5353,8 +5352,7 @@ "继续" "不用了" "位置" - - + "当您使用此服务进行紧急呼叫时,您的运营商可能会收集您的位置信息。\n\n如需了解详情,请参阅运营商的隐私权政策。" "您可能无法再访问任何剩余时间或数据。请在移除之前先与您的提供商联系。" "内容捕获, 应用内容" "应用内容" diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index 23fc04d7c14..f4aab2739e3 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -53,8 +53,7 @@ "縮小" "放大" "使用自動旋轉" - - + "面孔偵測功能會使用前置鏡頭提高自動旋轉的準確度。系統絕不會將相關圖像儲存或傳送給 Google。" "範例文字" "《綠野仙蹤》" "第 11 章:奧茲國的奇妙翡翠城" @@ -2669,7 +2668,7 @@ "查看用電量最高的應用程式" "充電暫時受限" "延長電池壽命。瞭解詳情。" - "由於您的手機使用率比平常高,因此電池可能比平時更快耗盡。\n\n耗電量最高的應用程式:" + "您比平常多用手機,電池電量可能會比平時更快用完。\n\n耗電量最高的應用程式:" "由於您的平板電腦使用率比平常高,因此電池可能比平時更快耗盡。\n\n耗電量最高的應用程式:" "由於您的裝置使用率比平常高,因此電池可能比平時更快耗盡。\n\n耗電量最高的應用程式:" "包括高耗電背景活動" @@ -5356,8 +5355,7 @@ "繼續" "不用了,謝謝" "位置" - - + "使用此服務撥打緊急電話時,流動網絡供應商可能會收集您的位置資訊。\n\n請瀏覽流動網絡供應商的私隱權政策瞭解詳情。" "您可能會失去所有剩餘時間或資料的存取權。移除前,請聯絡您的供應商尋求指示。" "內容擷取, 應用程式內容" "應用程式內容" diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 20e06ac56ef..ff0c6a68042 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -53,8 +53,7 @@ "縮小" "放大" "使用自動旋轉" - - + "臉部偵測技術會使用前置鏡頭提高自動旋轉的準確度。系統不會將相關圖像儲存或傳送給 Google。" "範例文字" "綠野仙蹤" "第 11 章:奧茲國的翡翠城" @@ -2668,7 +2667,7 @@ "查看電池用量最高的應用程式" "充電功能暫時受到限制" "這是為了延長電池壽命。瞭解詳情。" - "你的手機使用頻率比平常高,因此電池可能比平時還快沒電。\n\n耗電量最高的應用程式:" + "你的手機使用頻率比平常高,因此電量消耗速度可能比平時還要更快。\n\n耗電量最高的應用程式:" "你的平板電腦使用頻率比平常高,因此電池可能比平時還快沒電。\n\n耗電量最高的應用程式:" "你的裝置使用頻率比平常高,因此電池可能比平時還快沒電。\n\n耗電量最高的應用程式:" "包含高耗電背景活動" @@ -5355,8 +5354,7 @@ "繼續" "不用了,謝謝" "位置" - - + "當你使用這項服務撥打緊急電話時,電信業者可能會收集你的位置資訊。\n\n詳請請參閱電信業者的隱私權政策。" "你可能無法再存取任何剩餘時間或資料。請先洽詢你的供應商,再進行移除。" "內容擷取, 應用程式內容" "應用程式內容" diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 2480296938e..59a548e8a9b 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -53,8 +53,7 @@ "Yenza kube kuncane" "Yenza kube kukhulu" "Sebenzisa ukuphenduka okuzenzakalelayo" - - + "Ukutholwa kobuso kusebenzisa ikhamera ebheke phambili ukuthuthukisa ukunemba Kokuphenduka okuzenzakalelayo. Izithombe azilondolozwa noma zithunyelwe ku-Google." "Isampuli yombhalo" "I-The Wonderful Wizard of Oz" "Isahluko 11: The Wonderful Emerald City of Oz" @@ -5354,8 +5353,7 @@ "QHUBEKA" "CHA NGIYABONGA" "Indawo" - - + "Inkampani yakho yenethiwekhi ingaqoqa indawo yakho uma usebenzisela le sevisi amakholi aphuthumayo.\n\nVakashela inqubomgomo yobumfihlo yenkampani yakho yenethiwekhi ukuze uthole imininingwane." "Ungalahlekelwa ukufinyelela kunoma isiphi isikhathi esisele noma kudatha. Hlola nomhlinzeki wakho ngaphambi kokususa." "thatha okuqukethwe, okuqukethwe kohlelo lokusebenza" "Okuqukethwe kohlelo lokusebenza" From 83b225304824638249096462c59762bcb1890426 Mon Sep 17 00:00:00 2001 From: Bonian Chen Date: Wed, 23 Jun 2021 15:10:07 +0800 Subject: [PATCH 6/6] [Settings] Settings within each SIM not been displayed to the user The display of content is in majority depending on the callback result of SIM card (in order to display the content). However, to reduce the number of access of SubscriptionManager and improve performance, a proxy has been design in between to reduce the traffic and the latency required. Within this situation, content didn't get displayed when Activity get restarted since Proxy avoid to reduce the traffic through reducing the callback to the Activity and even not generating request for update when Activity resume. Bug: 188982508 Test: local & unit test Change-Id: Ia3b946a853f87a469ce07a398f3811f605d38f1d --- .../network/ProxySubscriptionManager.java | 129 ++++++++-- .../telephony/MobileNetworkActivity.java | 10 +- .../network/ProxySubscriptionManagerTest.java | 228 ++++++++++++++++++ 3 files changed, 338 insertions(+), 29 deletions(-) create mode 100644 tests/unit/src/com/android/settings/network/ProxySubscriptionManagerTest.java diff --git a/src/com/android/settings/network/ProxySubscriptionManager.java b/src/com/android/settings/network/ProxySubscriptionManager.java index eb1a7d4f608..614491a5016 100644 --- a/src/com/android/settings/network/ProxySubscriptionManager.java +++ b/src/com/android/settings/network/ProxySubscriptionManager.java @@ -25,19 +25,30 @@ import android.os.Looper; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; +import android.util.Log; +import androidx.annotation.Keep; +import androidx.annotation.VisibleForTesting; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * A proxy to the subscription manager */ public class ProxySubscriptionManager implements LifecycleObserver { + private static final String LOG_TAG = "ProxySubscriptionManager"; + + private static final int LISTENER_END_OF_LIFE = -1; + private static final int LISTENER_IS_INACTIVE = 0; + private static final int LISTENER_IS_ACTIVE = 1; + /** * Interface for monitor active subscriptions list changing */ @@ -74,21 +85,35 @@ public class ProxySubscriptionManager implements LifecycleObserver { private ProxySubscriptionManager(Context context) { final Looper looper = context.getMainLooper(); + ActiveSubscriptionsListener subscriptionMonitor = new ActiveSubscriptionsListener( + looper, context) { + public void onChanged() { + notifySubscriptionInfoMightChanged(); + } + }; + GlobalSettingsChangeListener airplaneModeMonitor = new GlobalSettingsChangeListener( + looper, context, Settings.Global.AIRPLANE_MODE_ON) { + public void onChanged(String field) { + subscriptionMonitor.clearCache(); + notifySubscriptionInfoMightChanged(); + } + }; + + init(context, subscriptionMonitor, airplaneModeMonitor); + } + + @Keep + @VisibleForTesting + protected void init(Context context, ActiveSubscriptionsListener activeSubscriptionsListener, + GlobalSettingsChangeListener airplaneModeOnSettingsChangeListener) { + mActiveSubscriptionsListeners = new ArrayList(); + mPendingNotifyListeners = + new ArrayList(); - mSubscriptionMonitor = new ActiveSubscriptionsListener(looper, context) { - public void onChanged() { - notifyAllListeners(); - } - }; - mAirplaneModeMonitor = new GlobalSettingsChangeListener(looper, - context, Settings.Global.AIRPLANE_MODE_ON) { - public void onChanged(String field) { - mSubscriptionMonitor.clearCache(); - notifyAllListeners(); - } - }; + mSubscriptionMonitor = activeSubscriptionsListener; + mAirplaneModeMonitor = airplaneModeOnSettingsChangeListener; mSubscriptionMonitor.start(); } @@ -98,15 +123,19 @@ public class ProxySubscriptionManager implements LifecycleObserver { private GlobalSettingsChangeListener mAirplaneModeMonitor; private List mActiveSubscriptionsListeners; + private List mPendingNotifyListeners; - private void notifyAllListeners() { - for (OnActiveSubscriptionChangedListener listener : mActiveSubscriptionsListeners) { - final Lifecycle lifecycle = listener.getLifecycle(); - if ((lifecycle == null) - || (lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED))) { - listener.onChanged(); - } - } + @Keep + @VisibleForTesting + protected void notifySubscriptionInfoMightChanged() { + // create a merged list for processing all listeners + List listeners = + new ArrayList(mPendingNotifyListeners); + listeners.addAll(mActiveSubscriptionsListeners); + + mActiveSubscriptionsListeners.clear(); + mPendingNotifyListeners.clear(); + processStatusChangeOnListeners(listeners); } /** @@ -131,6 +160,11 @@ public class ProxySubscriptionManager implements LifecycleObserver { @OnLifecycleEvent(ON_START) void onStart() { mSubscriptionMonitor.start(); + + // callback notify those listener(s) which back to active state + List listeners = mPendingNotifyListeners; + mPendingNotifyListeners = new ArrayList(); + processStatusChangeOnListeners(listeners); } @OnLifecycleEvent(ON_STOP) @@ -215,12 +249,17 @@ public class ProxySubscriptionManager implements LifecycleObserver { } /** - * Add listener to active subscriptions monitor list + * Add listener to active subscriptions monitor list. + * Note: listener only take place when change happens. + * No immediate callback performed after the invoke of this method. * * @param listener listener to active subscriptions change */ + @Keep public void addActiveSubscriptionsListener(OnActiveSubscriptionChangedListener listener) { - if (mActiveSubscriptionsListeners.contains(listener)) { + removeSpecificListenerAndCleanList(listener, mPendingNotifyListeners); + removeSpecificListenerAndCleanList(listener, mActiveSubscriptionsListeners); + if ((listener == null) || (getListenerState(listener) == LISTENER_END_OF_LIFE)) { return; } mActiveSubscriptionsListeners.add(listener); @@ -231,7 +270,51 @@ public class ProxySubscriptionManager implements LifecycleObserver { * * @param listener listener to active subscriptions change */ + @Keep public void removeActiveSubscriptionsListener(OnActiveSubscriptionChangedListener listener) { - mActiveSubscriptionsListeners.remove(listener); + removeSpecificListenerAndCleanList(listener, mPendingNotifyListeners); + removeSpecificListenerAndCleanList(listener, mActiveSubscriptionsListeners); + } + + private int getListenerState(OnActiveSubscriptionChangedListener listener) { + Lifecycle lifecycle = listener.getLifecycle(); + if (lifecycle == null) { + return LISTENER_IS_ACTIVE; + } + Lifecycle.State lifecycleState = lifecycle.getCurrentState(); + if (lifecycleState == Lifecycle.State.DESTROYED) { + Log.d(LOG_TAG, "Listener dead detected - " + listener); + return LISTENER_END_OF_LIFE; + } + return lifecycleState.isAtLeast(Lifecycle.State.STARTED) ? + LISTENER_IS_ACTIVE : LISTENER_IS_INACTIVE; + } + + private void removeSpecificListenerAndCleanList(OnActiveSubscriptionChangedListener listener, + List list) { + // also drop listener(s) which is end of life + list.removeIf(it -> (it == listener) || (getListenerState(it) == LISTENER_END_OF_LIFE)); + } + + private void processStatusChangeOnListeners( + List listeners) { + // categorize listener(s), and end of life listener(s) been ignored + Map> categorizedListeners = + listeners.stream() + .collect(Collectors.groupingBy(it -> getListenerState(it))); + + // have inactive listener(s) in pending list + categorizedListeners.computeIfPresent(LISTENER_IS_INACTIVE, (category, list) -> { + mPendingNotifyListeners.addAll(list); + return list; + }); + + // get active listener(s) + categorizedListeners.computeIfPresent(LISTENER_IS_ACTIVE, (category, list) -> { + mActiveSubscriptionsListeners.addAll(list); + // notify each one of them + list.stream().forEach(it -> it.onChanged()); + return list; + }); } } diff --git a/src/com/android/settings/network/telephony/MobileNetworkActivity.java b/src/com/android/settings/network/telephony/MobileNetworkActivity.java index 50164609dd0..b122cdc04b1 100644 --- a/src/com/android/settings/network/telephony/MobileNetworkActivity.java +++ b/src/com/android/settings/network/telephony/MobileNetworkActivity.java @@ -132,15 +132,13 @@ public class MobileNetworkActivity extends SettingsBaseActivity : ((startIntent != null) ? startIntent.getIntExtra(Settings.EXTRA_SUB_ID, SUB_ID_NULL) : SUB_ID_NULL); + // perform registration after mCurSubscriptionId been configured. + registerActiveSubscriptionsListener(); final SubscriptionInfo subscription = getSubscription(); maybeShowContactDiscoveryDialog(subscription); - // Since onChanged() will take place immediately when addActiveSubscriptionsListener(), - // perform registration after mCurSubscriptionId been configured. - registerActiveSubscriptionsListener(); - - updateSubscriptions(subscription, savedInstanceState); + updateSubscriptions(subscription, null); } @VisibleForTesting @@ -296,7 +294,7 @@ public class MobileNetworkActivity extends SettingsBaseActivity final Fragment fragment = new MobileNetworkSettings(); fragment.setArguments(bundle); fragmentTransaction.replace(R.id.content_frame, fragment, fragmentTag); - fragmentTransaction.commit(); + fragmentTransaction.commitAllowingStateLoss(); } private void removeContactDiscoveryDialog(int subId) { diff --git a/tests/unit/src/com/android/settings/network/ProxySubscriptionManagerTest.java b/tests/unit/src/com/android/settings/network/ProxySubscriptionManagerTest.java new file mode 100644 index 00000000000..afe9d19c485 --- /dev/null +++ b/tests/unit/src/com/android/settings/network/ProxySubscriptionManagerTest.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.settings.network; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.content.Context; + +import androidx.lifecycle.Lifecycle; +import androidx.test.annotation.UiThreadTest; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidJUnit4.class) +public class ProxySubscriptionManagerTest { + + private Context mContext; + @Mock + private ActiveSubscriptionsListener mActiveSubscriptionsListener; + @Mock + private GlobalSettingsChangeListener mAirplaneModeOnSettingsChangeListener; + + @Mock + private Lifecycle mLifecycle_ON_PAUSE; + @Mock + private Lifecycle mLifecycle_ON_RESUME; + @Mock + private Lifecycle mLifecycle_ON_DESTROY; + + private Client mClient1; + private Client mClient2; + + @Before + @UiThreadTest + public void setUp() { + MockitoAnnotations.initMocks(this); + + mContext = spy(ApplicationProvider.getApplicationContext()); + + doReturn(Lifecycle.State.CREATED).when(mLifecycle_ON_PAUSE).getCurrentState(); + doReturn(Lifecycle.State.STARTED).when(mLifecycle_ON_RESUME).getCurrentState(); + doReturn(Lifecycle.State.DESTROYED).when(mLifecycle_ON_DESTROY).getCurrentState(); + + mClient1 = new Client(); + mClient1.setLifecycle(mLifecycle_ON_RESUME); + mClient2 = new Client(); + mClient2.setLifecycle(mLifecycle_ON_RESUME); + } + + private ProxySubscriptionManager getInstance(Context context) { + ProxySubscriptionManager proxy = + Mockito.mock(ProxySubscriptionManager.class, Mockito.CALLS_REAL_METHODS); + proxy.init(context, mActiveSubscriptionsListener, mAirplaneModeOnSettingsChangeListener); + proxy.notifySubscriptionInfoMightChanged(); + return proxy; + } + + public class Client implements ProxySubscriptionManager.OnActiveSubscriptionChangedListener { + private Lifecycle lifeCycle; + private int numberOfCallback; + + public void onChanged() { + numberOfCallback++; + } + + public Lifecycle getLifecycle() { + return lifeCycle; + } + + public int getCallbackCount() { + return numberOfCallback; + } + + public void setLifecycle(Lifecycle lifecycle) { + lifeCycle = lifecycle; + } + } + + @Test + @UiThreadTest + public void addActiveSubscriptionsListener_addOneClient_getNoCallback() { + ProxySubscriptionManager proxy = getInstance(mContext); + + proxy.addActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + } + + @Test + @UiThreadTest + public void addActiveSubscriptionsListener_addOneClient_changeOnSimGetCallback() { + ProxySubscriptionManager proxy = getInstance(mContext); + + proxy.addActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(1); + } + + @Test + @UiThreadTest + public void addActiveSubscriptionsListener_addOneClient_noCallbackUntilUiResume() { + ProxySubscriptionManager proxy = getInstance(mContext); + + mClient1.setLifecycle(mLifecycle_ON_PAUSE); + + proxy.addActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + + mClient1.setLifecycle(mLifecycle_ON_RESUME); + proxy.onStart(); + Assert.assertTrue(mClient1.getCallbackCount() > 0); + + mClient1.setLifecycle(mLifecycle_ON_PAUSE); + proxy.onStop(); + int latestCallbackCount = mClient1.getCallbackCount(); + + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(latestCallbackCount); + } + + @Test + @UiThreadTest + public void addActiveSubscriptionsListener_addTwoClient_eachClientGetNoCallback() { + ProxySubscriptionManager proxy = getInstance(mContext); + + proxy.addActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + + proxy.addActiveSubscriptionsListener(mClient2); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + assertThat(mClient2.getCallbackCount()).isEqualTo(0); + } + + @Test + @UiThreadTest + public void addActiveSubscriptionsListener_addTwoClient_callbackOnlyWhenResume() { + ProxySubscriptionManager proxy = getInstance(mContext); + + proxy.addActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + + proxy.addActiveSubscriptionsListener(mClient2); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + assertThat(mClient2.getCallbackCount()).isEqualTo(0); + + mClient1.setLifecycle(mLifecycle_ON_PAUSE); + proxy.onStop(); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + assertThat(mClient2.getCallbackCount()).isEqualTo(0); + + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + assertThat(mClient2.getCallbackCount()).isEqualTo(1); + + mClient1.setLifecycle(mLifecycle_ON_RESUME); + proxy.onStart(); + Assert.assertTrue(mClient1.getCallbackCount() > 0); + assertThat(mClient2.getCallbackCount()).isEqualTo(1); + } + + @Test + @UiThreadTest + public void removeActiveSubscriptionsListener_removedClient_noCallback() { + ProxySubscriptionManager proxy = getInstance(mContext); + + proxy.addActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(1); + + proxy.removeActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(1); + + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(1); + } + + @Test + @UiThreadTest + public void notifySubscriptionInfoMightChanged_destroyedClient_autoRemove() { + ProxySubscriptionManager proxy = getInstance(mContext); + + proxy.addActiveSubscriptionsListener(mClient1); + assertThat(mClient1.getCallbackCount()).isEqualTo(0); + + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(1); + + mClient1.setLifecycle(mLifecycle_ON_DESTROY); + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(1); + + mClient1.setLifecycle(mLifecycle_ON_RESUME); + proxy.notifySubscriptionInfoMightChanged(); + assertThat(mClient1.getCallbackCount()).isEqualTo(1); + } +}