diff options
472 files changed, 10150 insertions, 4459 deletions
diff --git a/Android.mk b/Android.mk index 4cedadcb7764..6fb5aec2eccc 100644 --- a/Android.mk +++ b/Android.mk @@ -292,6 +292,7 @@ LOCAL_SRC_FILES += \ core/java/android/service/euicc/IGetEidCallback.aidl \ core/java/android/service/euicc/IGetEuiccInfoCallback.aidl \ core/java/android/service/euicc/IGetEuiccProfileInfoListCallback.aidl \ + core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl \ core/java/android/service/euicc/ISwitchToSubscriptionCallback.aidl \ core/java/android/service/euicc/IUpdateSubscriptionNicknameCallback.aidl \ core/java/android/service/gatekeeper/IGateKeeperService.aidl \ @@ -437,10 +438,6 @@ LOCAL_SRC_FILES += \ location/java/android/location/INetInitiatedListener.aidl \ location/java/com/android/internal/location/ILocationProvider.aidl \ media/java/android/media/IAudioService.aidl \ - ../av/drm/libmediadrm/aidl/android/media/ICas.aidl \ - ../av/drm/libmediadrm/aidl/android/media/ICasListener.aidl \ - ../av/drm/libmediadrm/aidl/android/media/IDescrambler.aidl \ - ../av/drm/libmediadrm/aidl/android/media/IMediaCasService.aidl \ media/java/android/media/IAudioFocusDispatcher.aidl \ media/java/android/media/IAudioRoutesObserver.aidl \ media/java/android/media/IMediaHTTPConnection.aidl \ @@ -613,6 +610,8 @@ LOCAL_STATIC_JAVA_LIBRARIES := \ android.hardware.vibrator-V1.1-java-constants \ android.hardware.wifi-V1.0-java-constants \ +include hardware/interfaces/cas/1.0/CasHal.mk + # Loaded with System.loadLibrary by android.view.textclassifier LOCAL_REQUIRED_MODULES += libtextclassifier diff --git a/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java b/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java index 8cd45f7f92bd..a92597f131c3 100644 --- a/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java +++ b/apct-tests/perftests/core/src/android/os/ParcelPerfTest.java @@ -57,6 +57,46 @@ public class ParcelPerfTest { } @Test + public void timeGetDataPosition() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mParcel.dataPosition(); + } + } + + @Test + public void timeSetDataSize() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mParcel.setDataSize(0); + } + } + + @Test + public void timeGetDataSize() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mParcel.dataSize(); + } + } + + @Test + public void timeSetDataCapacity() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mParcel.setDataCapacity(0); + } + } + + @Test + public void timeGetDataCapacity() { + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + mParcel.dataCapacity(); + } + } + + @Test public void timeWriteByte() { final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); final byte val = 0xF; @@ -112,4 +152,19 @@ public class ParcelPerfTest { mParcel.readLong(); } } + + @Test + public void timeObtainRecycle() { + // Use up the pooled instances. + // A lot bigger than the actual size but in case someone increased it. + final int POOL_SIZE = 100; + for (int i = 0; i < POOL_SIZE; i++) { + Parcel.obtain(); + } + + final BenchmarkState state = mPerfStatusReporter.getBenchmarkState(); + while (state.keepRunning()) { + Parcel.obtain().recycle(); + } + } } diff --git a/api/current.txt b/api/current.txt index f673d1bf804b..17dbcbf392b9 100644 --- a/api/current.txt +++ b/api/current.txt @@ -1935,6 +1935,7 @@ package android { field public static final int VideoView_error_text_invalid_progressive_playback = 17039381; // 0x1040015 field public static final int VideoView_error_text_unknown = 17039377; // 0x1040011 field public static final int VideoView_error_title = 17039378; // 0x1040012 + field public static final int autofill = 17039386; // 0x104001a field public static final int cancel = 17039360; // 0x1040000 field public static final int copy = 17039361; // 0x1040001 field public static final int copyUrl = 17039362; // 0x1040002 diff --git a/api/system-current.txt b/api/system-current.txt index 5518ca8062ba..53e1b81d95d3 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -2064,6 +2064,7 @@ package android { field public static final int VideoView_error_text_invalid_progressive_playback = 17039381; // 0x1040015 field public static final int VideoView_error_text_unknown = 17039377; // 0x1040011 field public static final int VideoView_error_title = 17039378; // 0x1040012 + field public static final int autofill = 17039386; // 0x104001a field public static final int cancel = 17039360; // 0x1040000 field public static final int copy = 17039361; // 0x1040001 field public static final int copyUrl = 17039362; // 0x1040002 @@ -28100,6 +28101,7 @@ package android.net { method public static void incrementOperationCount(int, int); method public static void setThreadStatsTag(int); method public static void setThreadStatsTagBackup(); + method public static void setThreadStatsTagCode(); method public static void setThreadStatsTagRestore(); method public static void setThreadStatsUid(int); method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException; diff --git a/api/test-current.txt b/api/test-current.txt index 0230e555a820..abfcaba3727e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -1935,6 +1935,7 @@ package android { field public static final int VideoView_error_text_invalid_progressive_playback = 17039381; // 0x1040015 field public static final int VideoView_error_text_unknown = 17039377; // 0x1040011 field public static final int VideoView_error_title = 17039378; // 0x1040012 + field public static final int autofill = 17039386; // 0x104001a field public static final int cancel = 17039360; // 0x1040000 field public static final int copy = 17039361; // 0x1040001 field public static final int copyUrl = 17039362; // 0x1040002 @@ -31608,6 +31609,7 @@ package android.os { method public static android.os.StrictMode.VmPolicy getVmPolicy(); method public static void noteSlowCall(java.lang.String); method public static void setThreadPolicy(android.os.StrictMode.ThreadPolicy); + method public static void setViolationListener(android.os.StrictMode.ViolationListener); method public static void setVmPolicy(android.os.StrictMode.VmPolicy); } @@ -31641,6 +31643,10 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder permitUnbufferedIo(); } + public static abstract interface StrictMode.ViolationListener { + method public abstract void onViolation(java.lang.String); + } + public static final class StrictMode.VmPolicy { field public static final android.os.StrictMode.VmPolicy LAX; } diff --git a/cmds/am/src/com/android/commands/am/Instrument.java b/cmds/am/src/com/android/commands/am/Instrument.java index 4966b4380d9b..c6d83f51a40a 100644 --- a/cmds/am/src/com/android/commands/am/Instrument.java +++ b/cmds/am/src/com/android/commands/am/Instrument.java @@ -25,7 +25,6 @@ import android.content.pm.IPackageManager; import android.content.pm.InstrumentationInfo; import android.os.Build; import android.os.Bundle; -import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; import android.util.AndroidException; @@ -34,6 +33,8 @@ import android.view.IWindowManager; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; @@ -95,6 +96,12 @@ public class Instrument { public void onError(String errorText, boolean commandError); } + private static Collection<String> sorted(Collection<String> list) { + final ArrayList<String> copy = new ArrayList<>(list); + Collections.sort(copy); + return copy; + } + /** * Printer for the 'classic' text based status reporting. */ @@ -124,7 +131,7 @@ public class Instrument { System.out.print(pretty); } else { if (results != null) { - for (String key : results.keySet()) { + for (String key : sorted(results.keySet())) { System.out.println( "INSTRUMENTATION_STATUS: " + key + "=" + results.get(key)); } @@ -214,7 +221,7 @@ public class Instrument { private void writeBundle(ProtoOutputStream proto, long fieldId, Bundle bundle) { final long bundleToken = proto.startObject(fieldId); - for (final String key: bundle.keySet()) { + for (final String key: sorted(bundle.keySet())) { final long entryToken = proto.startRepeatedObject( InstrumentationData.ResultsBundle.ENTRIES); diff --git a/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java b/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java index 1e426d62e4e0..b9fedd365925 100644 --- a/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java +++ b/cmds/locksettings/src/com/android/commands/locksettings/LockSettingsCmd.java @@ -33,6 +33,10 @@ public final class LockSettingsCmd extends BaseCommand { " locksettings set-pin [--old OLD_CREDENTIAL] NEW_PIN\n" + " locksettings set-password [--old OLD_CREDENTIAL] NEW_PASSWORD\n" + " locksettings clear [--old OLD_CREDENTIAL]\n" + + " locksettings verify [--old OLD_CREDENTIAL]\n" + + "\n" + + "flags: \n" + + " --user USER_ID: specify the user, default value is current user\n" + "\n" + "locksettings set-pattern: sets a pattern\n" + " A pattern is specified by a non-separated list of numbers that index the cell\n" + @@ -44,7 +48,9 @@ public final class LockSettingsCmd extends BaseCommand { "\n" + "locksettings set-password: sets a password\n" + "\n" + - "locksettings clear: clears the unlock credential\n"; + "locksettings clear: clears the unlock credential\n" + + "\n" + + "locksettings verify: verifies the credential and unlocks the user\n"; public static void main(String[] args) { (new LockSettingsCmd()).run(args); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index bc6e9cd0ab7e..0ff3215e1271 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -6416,17 +6416,7 @@ public class Activity extends ContextThemeWrapper */ @Deprecated public boolean requestVisibleBehind(boolean visible) { - if (!mResumed) { - // Do not permit paused or stopped activities to do this. - visible = false; - } - try { - mVisibleBehind = ActivityManager.getService() - .requestVisibleBehind(mToken, visible) && visible; - } catch (RemoteException e) { - mVisibleBehind = false; - } - return mVisibleBehind; + return false; } /** diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 199e856e7a22..06dbe8218450 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -360,6 +360,13 @@ public class ActivityManager { FIRST_START_NON_FATAL_ERROR_CODE + 1; /** + * Result for IActivityManaqer.startActivity: a new activity start was aborted. Never returned + * externally. + * @hide + */ + public static final int START_ABORTED = FIRST_START_NON_FATAL_ERROR_CODE + 2; + + /** * Flag for IActivityManaqer.startActivity: do special start mode where * a new activity is launched only if it is needed. * @hide diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 250a408bf904..4a01fe68f0fd 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2962,6 +2962,7 @@ public final class ActivityThread { r.activity.mTemporaryPause = true; mInstrumentation.callActivityOnPause(r.activity); } + checkAndBlockForNetworkAccess(); deliverNewIntents(r, intents); if (resumed) { r.activity.performResume(); @@ -3595,6 +3596,7 @@ public final class ActivityThread { try { r.activity.onStateNotSaved(); r.activity.mFragments.noteStateNotSaved(); + checkAndBlockForNetworkAccess(); if (r.pendingIntents != null) { deliverNewIntents(r, r.pendingIntents); r.pendingIntents = null; @@ -4350,6 +4352,7 @@ public final class ActivityThread { } } } + checkAndBlockForNetworkAccess(); deliverResults(r, res.results); if (resumed) { r.activity.performResume(); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 1d1a590bdd5c..5a08cf3724ab 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -4937,7 +4937,6 @@ public class Notification implements Parcelable if (mStyle != null) { mStyle.buildStyled(mN); } - if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.N && (useExistingRemoteView())) { if (mN.contentView == null) { @@ -4980,18 +4979,20 @@ public class Notification implements Parcelable /** * Removes RemoteViews that were created for compatibility from {@param n}, if they did not - * change. + * change. Also removes extenders on low ram devices, as + * {@link android.service.notification.NotificationListenerService} services are disabled. * * @return {@param n}, if no stripping is needed, otherwise a stripped clone of {@param n}. * * @hide */ - public static Notification maybeCloneStrippedForDelivery(Notification n) { + public static Notification maybeCloneStrippedForDelivery(Notification n, boolean isLowRam) { String templateClass = n.extras.getString(EXTRA_TEMPLATE); // Only strip views for known Styles because we won't know how to // re-create them otherwise. - if (!TextUtils.isEmpty(templateClass) + if (!isLowRam + && !TextUtils.isEmpty(templateClass) && getNotificationStyleClass(templateClass) == null) { return n; } @@ -5008,7 +5009,8 @@ public class Notification implements Parcelable n.headsUpContentView.getSequenceNumber(); // Nothing to do here, no need to clone. - if (!stripContentView && !stripBigContentView && !stripHeadsUpContentView) { + if (!isLowRam + && !stripContentView && !stripBigContentView && !stripHeadsUpContentView) { return n; } @@ -5025,6 +5027,11 @@ public class Notification implements Parcelable clone.headsUpContentView = null; clone.extras.remove(EXTRA_REBUILD_HEADS_UP_CONTENT_VIEW_ACTION_COUNT); } + if (isLowRam) { + clone.extras.remove(Notification.TvExtender.EXTRA_TV_EXTENDER); + clone.extras.remove(WearableExtender.EXTRA_WEARABLE_EXTENSIONS); + clone.extras.remove(CarExtender.EXTRA_CAR_EXTENDER); + } return clone; } diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index a5191258f598..26889a1af1cb 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -307,7 +307,9 @@ public class NotificationManager { } } if (localLOGV) Log.v(TAG, pkg + ": notify(" + id + ", " + notification + ")"); - final Notification copy = Builder.maybeCloneStrippedForDelivery(notification); + ActivityManager am = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE); + boolean isLowRam = am.isLowRamDevice(); + final Notification copy = Builder.maybeCloneStrippedForDelivery(notification, isLowRam); try { service.enqueueNotificationWithTag(pkg, mContext.getOpPackageName(), tag, id, copy, user.getIdentifier()); diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java index d9b6eed4fc4d..5a356d9d4a6d 100644 --- a/core/java/android/app/admin/DeviceAdminReceiver.java +++ b/core/java/android/app/admin/DeviceAdminReceiver.java @@ -238,8 +238,7 @@ public class DeviceAdminReceiver extends BroadcastReceiver { * {@link android.app.admin.DevicePolicyManager#isProfileOwnerApp}. You will generally handle * this in {@link DeviceAdminReceiver#onProfileProvisioningComplete}. * - * <p>Input: Nothing.</p> - * <p>Output: Nothing</p> + * @see DevicePolicyManager#ACTION_PROVISIONING_SUCCESSFUL */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @BroadcastBehavior(explicitOnly = true) @@ -669,6 +668,11 @@ public class DeviceAdminReceiver extends BroadcastReceiver { * profile owner needs to wait for data to be available if required (e.g. android device ids or * other data that is set as a result of server interactions). * + * <p>From version {@link android.os.Build.VERSION_CODES#O}, when managed provisioning has + * completed, along with this callback the activity intent + * {@link DevicePolicyManager#ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the same + * application. + * * @param context The running context as per {@link #onReceive}. * @param intent The received intent as per {@link #onReceive}. */ diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 14162afdb25d..f612eaa43578 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -169,8 +169,7 @@ public class DevicePolicyManager { * * <p>From version {@link android.os.Build.VERSION_CODES#O}, when managed provisioning has * completed, along with the above broadcast, activity intent - * {@link #ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the application specified in - * the provisioning intent. + * {@link #ACTION_PROVISIONING_SUCCESSFUL} will also be sent to the profile owner. * * <p>If provisioning fails, the managedProfile is removed so the device returns to its * previous state. @@ -857,8 +856,7 @@ public class DevicePolicyManager { * {@link DeviceAdminReceiver#ACTION_PROFILE_PROVISIONING_COMPLETE} broadcast but this will be * delivered faster as it's an activity intent. * - * <p>The intent is only sent to the application on the profile that requested provisioning. In - * the device owner case the profile is the primary user. + * <p>The intent is only sent to the new device or profile owner. * * @see #ACTION_PROVISION_MANAGED_PROFILE * @see #ACTION_PROVISION_MANAGED_DEVICE diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index 7ff37d29323e..27b802e59c58 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -203,6 +203,34 @@ public final class BluetoothDevice implements Parcelable { "android.bluetooth.device.action.BOND_STATE_CHANGED"; /** + * Broadcast Action: Indicates the battery level of a remote device has + * been retrieved for the first time, or changed since the last retrieval + * <p>Always contains the extra fields {@link #EXTRA_DEVICE} and {@link + * #EXTRA_BATTERY_LEVEL}. + * <p>Requires {@link android.Manifest.permission#BLUETOOTH} to receive. + * @hide + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_BATTERY_LEVEL_CHANGED = + "android.bluetooth.device.action.BATTERY_LEVEL_CHANGED"; + + /** + * Used as an Integer extra field in {@link #ACTION_BATTERY_LEVEL_CHANGED} + * intent. It contains the most recently retrieved battery level information + * ranging from 0% to 100% for a remote device, {@link #BATTERY_LEVEL_UNKNOWN} + * when the valid is unknown or there is an error + * @hide + */ + public static final String EXTRA_BATTERY_LEVEL = + "android.bluetooth.device.extra.BATTERY_LEVEL"; + + /** + * Used as the unknown value for {@link #EXTRA_BATTERY_LEVEL} and {@link #getBatteryLevel()} + * @hide + */ + public static final int BATTERY_LEVEL_UNKNOWN = -1; + + /** * Used as a Parcelable {@link BluetoothDevice} extra field in every intent * broadcast by this class. It contains the {@link BluetoothDevice} that * the intent applies to. @@ -861,6 +889,27 @@ public final class BluetoothDevice implements Parcelable { } /** + * Get the most recent identified battery level of this Bluetooth device + * <p>Requires {@link android.Manifest.permission#BLUETOOTH} + * + * @return Battery level in percents from 0 to 100, or {@link #BATTERY_LEVEL_UNKNOWN} if + * Bluetooth is disabled, or device is disconnected, or does not have any battery + * reporting service, or return value is invalid + * @hide + */ + @RequiresPermission(Manifest.permission.BLUETOOTH) + public int getBatteryLevel() { + if (sService == null) { + Log.e(TAG, "Bluetooth disabled. Cannot get remote device battery level"); + return BATTERY_LEVEL_UNKNOWN; + } + try { + return sService.getBatteryLevel(this); + } catch (RemoteException e) {Log.e(TAG, "", e);} + return BATTERY_LEVEL_UNKNOWN; + } + + /** * Start the bonding (pairing) process with the remote device. * <p>This is an asynchronous call, it will return immediately. Register * for {@link #ACTION_BOND_STATE_CHANGED} intents to be notified when diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java index 57b954f40c6b..5b8d81d81efb 100644 --- a/core/java/android/bluetooth/BluetoothHeadset.java +++ b/core/java/android/bluetooth/BluetoothHeadset.java @@ -227,14 +227,13 @@ public final class BluetoothHeadset implements BluetoothProfile { * * <p>This intent will have 3 extras: * <ul> - * <li> {@link #EXTRA_IND_ID} - The Assigned number of headset Indicator which is supported by - the headset ( as indicated by AT+BIND - command in the SLC sequence).or whose value - is changed (indicated by AT+BIEV command)</li> - * <li> {@link #EXTRA_IND_VALUE}- The updated value of headset indicator. </li> + * <li> {@link #EXTRA_HF_INDICATORS_IND_ID} - The Assigned number of headset Indicator which + * is supported by the headset ( as indicated by AT+BIND command in the SLC + * sequence).or whose value is changed (indicated by AT+BIEV command) </li> + * <li> {@link #EXTRA_HF_INDICATORS_IND_VALUE}- The updated value of headset indicator. </li> * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. </li> * </ul> - * <p>{@link #EXTRA_IND_ID} is defined by Bluetooth SIG and each of the indicators are + * <p>{@link #EXTRA_HF_INDICATORS_IND_ID} is defined by Bluetooth SIG and each of the indicators are * given an assigned number. Below shows the assigned number of Indicator added so far * - Enhanced Safety - 1 * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl index 43c5ae4407c9..1d7cfc900e4c 100644 --- a/core/java/android/bluetooth/IBluetooth.aidl +++ b/core/java/android/bluetooth/IBluetooth.aidl @@ -75,6 +75,7 @@ interface IBluetooth ParcelUuid[] getRemoteUuids(in BluetoothDevice device); boolean fetchRemoteUuids(in BluetoothDevice device); boolean sdpSearch(in BluetoothDevice device, in ParcelUuid uuid); + int getBatteryLevel(in BluetoothDevice device); boolean setPin(in BluetoothDevice device, boolean accept, int len, in byte[] pinCode); boolean setPasskey(in BluetoothDevice device, boolean accept, int len, in byte[] diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index 5eca57b29ea8..bdf0562772e5 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -27,6 +27,7 @@ import android.app.ActivityManager; import android.app.AppGlobals; import android.content.Intent; import android.content.IntentSender; +import android.content.pm.PackageManager.DeleteFlags; import android.content.pm.PackageManager.InstallReason; import android.graphics.Bitmap; import android.net.Uri; @@ -443,8 +444,24 @@ public class PackageInstaller { * @param statusReceiver Where to deliver the result. */ public void uninstall(@NonNull String packageName, @NonNull IntentSender statusReceiver) { - uninstall(new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), - statusReceiver); + uninstall(packageName, 0 /*flags*/, statusReceiver); + } + + /** + * Uninstall the given package, removing it completely from the device. This + * method is only available to the current "installer of record" for the + * package. + * + * @param packageName The package to uninstall. + * @param flags Flags for uninstall. + * @param statusReceiver Where to deliver the result. + * + * @hide + */ + public void uninstall(@NonNull String packageName, @DeleteFlags int flags, + @NonNull IntentSender statusReceiver) { + uninstall(new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST), + flags, statusReceiver); } /** @@ -458,15 +475,34 @@ public class PackageInstaller { * @param versionedPackage The versioned package to uninstall. * @param statusReceiver Where to deliver the result. */ + public void uninstall(@NonNull VersionedPackage versionedPackage, + @NonNull IntentSender statusReceiver) { + uninstall(versionedPackage, 0 /*flags*/, statusReceiver); + } + + /** + * Uninstall the given package with a specific version code, removing it + * completely from the device. This method is only available to the current + * "installer of record" for the package. If the version code of the package + * does not match the one passed in the versioned package argument this + * method is a no-op. Use {@link PackageManager#VERSION_CODE_HIGHEST} to + * uninstall the latest version of the package. + * + * @param versionedPackage The versioned package to uninstall. + * @param flags Flags for uninstall. + * @param statusReceiver Where to deliver the result. + * + * @hide + */ @RequiresPermission(anyOf = { Manifest.permission.DELETE_PACKAGES, Manifest.permission.REQUEST_DELETE_PACKAGES}) - public void uninstall(@NonNull VersionedPackage versionedPackage, + public void uninstall(@NonNull VersionedPackage versionedPackage, @DeleteFlags int flags, @NonNull IntentSender statusReceiver) { Preconditions.checkNotNull(versionedPackage, "versionedPackage cannot be null"); try { mInstaller.uninstall(versionedPackage, mInstallerPackageName, - 0, statusReceiver, mUserId); + flags, statusReceiver, mUserId); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl b/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl index 3c3b84d7b2a3..9490e276f228 100644 --- a/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl +++ b/core/java/android/content/pm/permission/IRuntimePermissionPresenter.aidl @@ -25,4 +25,5 @@ import android.os.RemoteCallback; */ oneway interface IRuntimePermissionPresenter { void getAppPermissions(String packageName, in RemoteCallback callback); + void revokeRuntimePermission(String packageName, String permissionName); } diff --git a/core/java/android/content/pm/permission/RuntimePermissionPresenter.java b/core/java/android/content/pm/permission/RuntimePermissionPresenter.java index 6d55d2f7a860..02d0a6d8bd36 100644 --- a/core/java/android/content/pm/permission/RuntimePermissionPresenter.java +++ b/core/java/android/content/pm/permission/RuntimePermissionPresenter.java @@ -22,7 +22,6 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.content.pm.ApplicationInfo; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -31,6 +30,7 @@ import android.os.RemoteCallback; import android.os.RemoteException; import android.permissionpresenterservice.RuntimePermissionPresenterService; import android.util.Log; + import com.android.internal.annotations.GuardedBy; import com.android.internal.os.SomeArgs; @@ -118,6 +118,22 @@ public final class RuntimePermissionPresenter { mRemoteService.processMessage(message); } + /** + * Revoke the permission {@code permissionName} for app {@code packageName} + * + * @param packageName The package for which to revoke + * @param permissionName The permission to revoke + */ + public void revokeRuntimePermission(String packageName, String permissionName) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = packageName; + args.arg2 = permissionName; + + Message message = mRemoteService.obtainMessage( + RemoteService.MSG_REVOKE_APP_PERMISSIONS, args); + mRemoteService.processMessage(message); + } + private static final class RemoteService extends Handler implements ServiceConnection { private static final long UNBIND_TIMEOUT_MILLIS = 10000; @@ -125,6 +141,7 @@ public final class RuntimePermissionPresenter { public static final int MSG_GET_APP_PERMISSIONS = 1; public static final int MSG_GET_APPS_USING_PERMISSIONS = 2; public static final int MSG_UNBIND = 3; + public static final int MSG_REVOKE_APP_PERMISSIONS = 4; private final Object mLock = new Object(); @@ -231,6 +248,25 @@ public final class RuntimePermissionPresenter { mRemoteInstance = null; } } break; + + case MSG_REVOKE_APP_PERMISSIONS: { + SomeArgs args = (SomeArgs) msg.obj; + final String packageName = (String) args.arg1; + final String permissionName = (String) args.arg2; + args.recycle(); + final IRuntimePermissionPresenter remoteInstance; + synchronized (mLock) { + remoteInstance = mRemoteInstance; + } + if (remoteInstance == null) { + return; + } + try { + remoteInstance.revokeRuntimePermission(packageName, permissionName); + } catch (RemoteException re) { + Log.e(TAG, "Error getting app permissions", re); + } + } break; } synchronized (mLock) { diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java index 6a02b6b2e6e7..bda80390a614 100644 --- a/core/java/android/hardware/display/DisplayManager.java +++ b/core/java/android/hardware/display/DisplayManager.java @@ -256,6 +256,15 @@ public final class DisplayManager { */ public static final int VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH = 1 << 6; + /** + * Virtual display flag: Indicates that the orientation of this display device is coupled to + * the rotation of its associated logical display. + * + * @see #createVirtualDisplay + * @hide + */ + public static final int VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT = 1 << 7; + /** @hide */ public DisplayManager(Context context) { mContext = context; diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 511466ae01c3..5e9b02ac043f 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -1098,6 +1098,7 @@ public class ConnectivityManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl() { try { return mService.getCaptivePortalServerUrl(); @@ -2061,10 +2062,11 @@ public class ConnectivityManager { * {@hide} */ @SystemApi - @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) + @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public boolean isTetheringSupported() { try { - return mService.isTetheringSupported(); + String pkgName = mContext.getOpPackageName(); + return mService.isTetheringSupported(pkgName); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -2094,6 +2096,7 @@ public class ConnectivityManager { * @hide */ @SystemApi + @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void startTethering(int type, boolean showProvisioningUi, final OnStartTetheringCallback callback) { startTethering(type, showProvisioningUi, callback, null); diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 27729dcce779..14cee3604d94 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -75,7 +75,7 @@ interface IConnectivityManager int getLastTetherError(String iface); - boolean isTetheringSupported(); + boolean isTetheringSupported(String callerPkg); void startTethering(int type, in ResultReceiver receiver, boolean showProvisioningUi, String callerPkg); diff --git a/core/java/android/net/NetworkIdentity.java b/core/java/android/net/NetworkIdentity.java index 0775bdaaf380..acd7b56027d9 100644 --- a/core/java/android/net/NetworkIdentity.java +++ b/core/java/android/net/NetworkIdentity.java @@ -157,7 +157,7 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> { * Scrub given IMSI on production builds. */ public static String scrubSubscriberId(String subscriberId) { - if ("eng".equals(Build.TYPE)) { + if (Build.IS_ENG) { return subscriberId; } else if (subscriberId != null) { // TODO: parse this as MCC+MNC instead of hard-coding diff --git a/core/java/android/net/TrafficStats.java b/core/java/android/net/TrafficStats.java index f9346165df3b..19857076a0a0 100644 --- a/core/java/android/net/TrafficStats.java +++ b/core/java/android/net/TrafficStats.java @@ -109,25 +109,26 @@ public class TrafficStats { */ public static final int TAG_SYSTEM_RESTORE = 0xFFFFFF04; + /** + * Default tag value for code or resources downloaded by an app store on + * behalf of the app, such as app updates. + * + * @hide + */ + public static final int TAG_SYSTEM_CODE = 0xFFFFFF05; + /** @hide */ - public static final int TAG_SYSTEM_DHCP = 0xFFFFFF05; + public static final int TAG_SYSTEM_DHCP = 0xFFFFFF40; /** @hide */ - public static final int TAG_SYSTEM_NTP = 0xFFFFFF06; + public static final int TAG_SYSTEM_NTP = 0xFFFFFF41; /** @hide */ - public static final int TAG_SYSTEM_PROBE = 0xFFFFFF07; + public static final int TAG_SYSTEM_PROBE = 0xFFFFFF42; /** @hide */ - public static final int TAG_SYSTEM_NEIGHBOR = 0xFFFFFF08; + public static final int TAG_SYSTEM_NEIGHBOR = 0xFFFFFF43; /** @hide */ - public static final int TAG_SYSTEM_GPS = 0xFFFFFF09; + public static final int TAG_SYSTEM_GPS = 0xFFFFFF44; /** @hide */ - public static final int TAG_SYSTEM_PAC = 0xFFFFFF0A; - - /** - * Sockets that are strictly local on device; never hits network. - * - * @hide - */ - public static final int TAG_SYSTEM_LOCAL = 0xFFFFFFAA; + public static final int TAG_SYSTEM_PAC = 0xFFFFFF45; private static INetworkStatsService sStatsService; @@ -210,6 +211,19 @@ public class TrafficStats { } /** + * Set active tag to use when accounting {@link Socket} traffic originating + * from the current thread. The tag used internally is well-defined to + * distinguish all code-related traffic, such as updates performed by an app + * store. + * + * @hide + */ + @SystemApi + public static void setThreadStatsTagCode() { + setThreadStatsTag(TAG_SYSTEM_CODE); + } + + /** * Get the active tag used when accounting {@link Socket} traffic originating * from the current thread. Only one active tag per thread is supported. * {@link #tagSocket(Socket)}. diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 68a81ca341a7..801c002fb568 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -27,6 +27,7 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; +import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; import dalvik.system.VMRuntime; @@ -260,24 +261,24 @@ public final class Parcel { // see libbinder's binder/Status.h private static final int EX_TRANSACTION_FAILED = -129; - @FastNative + @CriticalNative private static native int nativeDataSize(long nativePtr); - @FastNative + @CriticalNative private static native int nativeDataAvail(long nativePtr); - @FastNative + @CriticalNative private static native int nativeDataPosition(long nativePtr); - @FastNative + @CriticalNative private static native int nativeDataCapacity(long nativePtr); @FastNative private static native long nativeSetDataSize(long nativePtr, int size); - @FastNative + @CriticalNative private static native void nativeSetDataPosition(long nativePtr, int pos); @FastNative private static native void nativeSetDataCapacity(long nativePtr, int size); - @FastNative + @CriticalNative private static native boolean nativePushAllowFds(long nativePtr, boolean allowFds); - @FastNative + @CriticalNative private static native void nativeRestoreAllowFds(long nativePtr, boolean lastValue); private static native void nativeWriteByteArray(long nativePtr, byte[] b, int offset, int len); @@ -297,13 +298,13 @@ public final class Parcel { private static native byte[] nativeCreateByteArray(long nativePtr); private static native boolean nativeReadByteArray(long nativePtr, byte[] dest, int destLen); private static native byte[] nativeReadBlob(long nativePtr); - @FastNative + @CriticalNative private static native int nativeReadInt(long nativePtr); - @FastNative + @CriticalNative private static native long nativeReadLong(long nativePtr); - @FastNative + @CriticalNative private static native float nativeReadFloat(long nativePtr); - @FastNative + @CriticalNative private static native double nativeReadDouble(long nativePtr); private static native String nativeReadString(long nativePtr); private static native IBinder nativeReadStrongBinder(long nativePtr); @@ -319,11 +320,12 @@ public final class Parcel { private static native int nativeCompareData(long thisNativePtr, long otherNativePtr); private static native long nativeAppendFrom( long thisNativePtr, long otherNativePtr, int offset, int length); - @FastNative + @CriticalNative private static native boolean nativeHasFileDescriptors(long nativePtr); private static native void nativeWriteInterfaceToken(long nativePtr, String interfaceName); private static native void nativeEnforceInterface(long nativePtr, String interfaceName); + @CriticalNative private static native long nativeGetBlobAshmemSize(long nativePtr); public final static Parcelable.Creator<String> STRING_CREATOR diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 2b82c77d5909..3e071437b097 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -16,6 +16,7 @@ package android.os; import android.animation.ValueAnimator; +import android.annotation.TestApi; import android.app.ActivityManager; import android.app.ActivityThread; import android.app.ApplicationErrorReport; @@ -124,9 +125,6 @@ public final class StrictMode { private static final String TAG = "StrictMode"; private static final boolean LOG_V = Log.isLoggable(TAG, Log.VERBOSE); - private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE); - private static final boolean IS_ENG_BUILD = "eng".equals(Build.TYPE); - /** * Boolean system property to disable strict mode checks outright. * Set this to 'true' to force disable; 'false' has no effect on other @@ -343,6 +341,7 @@ public final class StrictMode { private static volatile VmPolicy sVmPolicy = VmPolicy.LAX; /** {@hide} */ + @TestApi public interface ViolationListener { public void onViolation(String message); } @@ -350,6 +349,7 @@ public final class StrictMode { private static volatile ViolationListener sListener; /** {@hide} */ + @TestApi public static void setViolationListener(ViolationListener listener) { sListener = listener; } @@ -1188,7 +1188,7 @@ public final class StrictMode { // For debug builds, log event loop stalls to dropbox for analysis. // Similar logic also appears in ActivityThread.java for system apps. - if (!doFlashes && (IS_USER_BUILD || suppress)) { + if (!doFlashes && (Build.IS_USER || suppress)) { setCloseGuardEnabled(false); return false; } @@ -1196,7 +1196,7 @@ public final class StrictMode { // Eng builds have flashes on all the time. The suppression property // overrides this, so we force the behavior only after the short-circuit // check above. - if (IS_ENG_BUILD) { + if (Build.IS_ENG) { doFlashes = true; } @@ -1205,7 +1205,7 @@ public final class StrictMode { StrictMode.DETECT_DISK_READ | StrictMode.DETECT_NETWORK; - if (!IS_USER_BUILD) { + if (!Build.IS_USER) { threadPolicyMask |= StrictMode.PENALTY_DROPBOX; } if (doFlashes) { @@ -1216,23 +1216,25 @@ public final class StrictMode { // VM Policy controls CloseGuard, detection of Activity leaks, // and instance counting. - if (IS_USER_BUILD) { + if (Build.IS_USER) { setCloseGuardEnabled(false); } else { VmPolicy.Builder policyBuilder = new VmPolicy.Builder().detectAll(); - if (!IS_ENG_BUILD) { + if (!Build.IS_ENG) { // Activity leak detection causes too much slowdown for userdebug because of the // GCs. policyBuilder = policyBuilder.disable(DETECT_VM_ACTIVITY_LEAKS); } policyBuilder = policyBuilder.penaltyDropBox(); - if (IS_ENG_BUILD) { + if (Build.IS_ENG) { policyBuilder.penaltyLog(); } // All core system components need to tag their sockets to aid // system health investigations if (android.os.Process.myUid() < android.os.Process.FIRST_APPLICATION_UID) { - policyBuilder.detectUntaggedSockets(); + policyBuilder.enable(DETECT_VM_UNTAGGED_SOCKET); + } else { + policyBuilder.disable(DETECT_VM_UNTAGGED_SOCKET); } setVmPolicy(policyBuilder.build()); setCloseGuardEnabled(vmClosableObjectLeaksEnabled()); @@ -2291,7 +2293,7 @@ public final class StrictMode { * @hide */ public static Span enterCriticalSpan(String name) { - if (IS_USER_BUILD) { + if (Build.IS_USER) { return NO_OP_SPAN; } if (name == null || name.isEmpty()) { diff --git a/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java b/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java index 344d947a3ad3..2931627f0ec0 100644 --- a/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java +++ b/core/java/android/permissionpresenterservice/RuntimePermissionPresenterService.java @@ -20,7 +20,6 @@ import android.annotation.SystemApi; import android.app.Service; import android.content.Context; import android.content.Intent; -import android.content.pm.ApplicationInfo; import android.content.pm.permission.IRuntimePermissionPresenter; import android.content.pm.permission.RuntimePermissionPresentationInfo; import android.content.pm.permission.RuntimePermissionPresenter; @@ -30,6 +29,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.RemoteCallback; + import com.android.internal.os.SomeArgs; import java.util.List; @@ -72,6 +72,16 @@ public abstract class RuntimePermissionPresenterService extends Service { */ public abstract List<RuntimePermissionPresentationInfo> onGetAppPermissions(String packageName); + /** + * Revoke the permission {@code permissionName} for app {@code packageName} + * + * @param packageName The package for which to revoke + * @param permissionName The permission to revoke + * + * @hide + */ + public abstract void onRevokeRuntimePermission(String packageName, String permissionName); + @Override public final IBinder onBind(Intent intent) { return new IRuntimePermissionPresenter.Stub() { @@ -83,12 +93,22 @@ public abstract class RuntimePermissionPresenterService extends Service { mHandler.obtainMessage(MyHandler.MSG_GET_APP_PERMISSIONS, args).sendToTarget(); } + + @Override + public void revokeRuntimePermission(String packageName, String permissionName) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = packageName; + args.arg2 = permissionName; + mHandler.obtainMessage(MyHandler.MSG_REVOKE_APP_PERMISSION, + args).sendToTarget(); + } }; } private final class MyHandler extends Handler { public static final int MSG_GET_APP_PERMISSIONS = 1; public static final int MSG_GET_APPS_USING_PERMISSIONS = 2; + public static final int MSG_REVOKE_APP_PERMISSION = 3; public MyHandler(Looper looper) { super(looper, null, false); @@ -113,6 +133,14 @@ public abstract class RuntimePermissionPresenterService extends Service { callback.sendResult(null); } } break; + case MSG_REVOKE_APP_PERMISSION: { + SomeArgs args = (SomeArgs) msg.obj; + String packageName = (String) args.arg1; + String permissionName = (String) args.arg2; + args.recycle(); + + onRevokeRuntimePermission(packageName, permissionName); + } break; } } } diff --git a/core/java/android/service/euicc/EuiccService.java b/core/java/android/service/euicc/EuiccService.java index 26f85288699a..0c2e4b7ada26 100644 --- a/core/java/android/service/euicc/EuiccService.java +++ b/core/java/android/service/euicc/EuiccService.java @@ -317,6 +317,21 @@ public abstract class EuiccService extends Service { public abstract int onEraseSubscriptions(int slotId); /** + * Ensure that subscriptions will be retained on the next factory reset. + * + * <p>Called directly before a factory reset. Assumes that a normal factory reset will lead to + * profiles being erased on first boot (to cover fastboot/recovery wipes), so the implementation + * should persist some bit that will remain accessible after the factory reset to bypass this + * flow when this method is called. + * + * @param slotId ID of the SIM slot to use for the operation. This is currently not populated + * but is here to future-proof the APIs. + * @return the result of the operation. May be one of the predefined {@code RESULT_} constants + * or any implementation-specific code starting with {@link #RESULT_FIRST_USER}. + */ + public abstract int onRetainSubscriptionsForFactoryReset(int slotId); + + /** * Wrapper around IEuiccService that forwards calls to implementations of {@link EuiccService}. */ private class IEuiccServiceWrapper extends IEuiccService.Stub { @@ -488,5 +503,21 @@ public abstract class EuiccService extends Service { } }); } + + @Override + public void retainSubscriptionsForFactoryReset(int slotId, + IRetainSubscriptionsForFactoryResetCallback callback) { + mExecutor.execute(new Runnable() { + @Override + public void run() { + int result = EuiccService.this.onRetainSubscriptionsForFactoryReset(slotId); + try { + callback.onComplete(result); + } catch (RemoteException e) { + // Can't communicate with the phone process; ignore. + } + } + }); + } } } diff --git a/core/java/android/service/euicc/IEuiccService.aidl b/core/java/android/service/euicc/IEuiccService.aidl index 18ea915d5dc7..e10dd8cdf616 100644 --- a/core/java/android/service/euicc/IEuiccService.aidl +++ b/core/java/android/service/euicc/IEuiccService.aidl @@ -24,6 +24,7 @@ import android.service.euicc.IGetDownloadableSubscriptionMetadataCallback; import android.service.euicc.IGetEidCallback; import android.service.euicc.IGetEuiccInfoCallback; import android.service.euicc.IGetEuiccProfileInfoListCallback; +import android.service.euicc.IRetainSubscriptionsForFactoryResetCallback; import android.service.euicc.ISwitchToSubscriptionCallback; import android.service.euicc.IUpdateSubscriptionNicknameCallback; import android.telephony.euicc.DownloadableSubscription; @@ -46,4 +47,6 @@ oneway interface IEuiccService { void updateSubscriptionNickname(int slotId, String iccid, String nickname, in IUpdateSubscriptionNicknameCallback callback); void eraseSubscriptions(int slotId, in IEraseSubscriptionsCallback callback); + void retainSubscriptionsForFactoryReset( + int slotId, in IRetainSubscriptionsForFactoryResetCallback callback); }
\ No newline at end of file diff --git a/services/core/java/com/android/server/timezone/FileDescriptorHelper.java b/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl index c3b1101000b5..127683059c02 100644 --- a/services/core/java/com/android/server/timezone/FileDescriptorHelper.java +++ b/core/java/android/service/euicc/IRetainSubscriptionsForFactoryResetCallback.aidl @@ -14,17 +14,9 @@ * limitations under the License. */ -package com.android.server.timezone; +package android.service.euicc; -import android.os.ParcelFileDescriptor; - -import java.io.IOException; - -/** - * An easy-to-mock interface around use of {@link ParcelFileDescriptor} for use by - * {@link RulesManagerService}. - */ -interface FileDescriptorHelper { - - byte[] readFully(ParcelFileDescriptor parcelFileDescriptor) throws IOException; -} +/** @hide */ +oneway interface IRetainSubscriptionsForFactoryResetCallback { + void onComplete(int result); +}
\ No newline at end of file diff --git a/core/java/android/util/BootTimingsTraceLog.java b/core/java/android/util/BootTimingsTraceLog.java index 2e4319cca0b9..7a702a92d3b1 100644 --- a/core/java/android/util/BootTimingsTraceLog.java +++ b/core/java/android/util/BootTimingsTraceLog.java @@ -29,7 +29,7 @@ import java.util.Deque; */ public class BootTimingsTraceLog { // Debug boot time for every step if it's non-user build. - private static final boolean DEBUG_BOOT_TIME = !"user".equals(Build.TYPE); + private static final boolean DEBUG_BOOT_TIME = !Build.IS_USER; private final Deque<Pair<String, Long>> mStartTimes = DEBUG_BOOT_TIME ? new ArrayDeque<>() : null; private final String mTag; diff --git a/core/java/android/view/InputEventConsistencyVerifier.java b/core/java/android/view/InputEventConsistencyVerifier.java index 46ef379d5c9c..7e8ec0469e56 100644 --- a/core/java/android/view/InputEventConsistencyVerifier.java +++ b/core/java/android/view/InputEventConsistencyVerifier.java @@ -30,7 +30,7 @@ import android.util.Log; * @hide */ public final class InputEventConsistencyVerifier { - private static final boolean IS_ENG_BUILD = "eng".equals(Build.TYPE); + private static final boolean IS_ENG_BUILD = Build.IS_ENG; private static final String EVENT_TYPE_KEY = "KeyEvent"; private static final String EVENT_TYPE_TRACKBALL = "TrackballEvent"; diff --git a/core/java/android/view/accessibility/AccessibilityCache.java b/core/java/android/view/accessibility/AccessibilityCache.java index 604e9854cd63..0f21c5c85f4b 100644 --- a/core/java/android/view/accessibility/AccessibilityCache.java +++ b/core/java/android/view/accessibility/AccessibilityCache.java @@ -40,7 +40,7 @@ public final class AccessibilityCache { private static final boolean DEBUG = false; - private static final boolean CHECK_INTEGRITY = "eng".equals(Build.TYPE); + private static final boolean CHECK_INTEGRITY = Build.IS_ENG; /** * {@link AccessibilityEvent} types that are critical for the cache to stay up to date diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index e2f7979c61d9..92d1de8e5a24 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -97,7 +97,7 @@ import java.util.concurrent.TimeUnit; * that manages the interaction across all processes. * <li> An <strong>input method (IME)</strong> implements a particular * interaction model allowing the user to generate text. The system binds - * to the current input method that is use, causing it to be created and run, + * to the current input method that is in use, causing it to be created and run, * and tells it when to hide and show its UI. Only one IME is running at a time. * <li> Multiple <strong>client applications</strong> arbitrate with the input * method manager for input focus and control over the state of the IME. Only diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index fa1bd910bdbb..1f2e3d02144a 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -2664,7 +2664,7 @@ public class Editor { .setEnabled(mTextView.canSelectAllText()) .setOnMenuItemClickListener(mOnContextMenuItemClickListener); menu.add(Menu.NONE, TextView.ID_AUTOFILL, MENU_ITEM_ORDER_AUTOFILL, - com.android.internal.R.string.autofill) + android.R.string.autofill) .setEnabled(mTextView.canRequestAutofill()) .setOnMenuItemClickListener(mOnContextMenuItemClickListener); diff --git a/core/java/com/android/internal/app/procstats/SparseMappingTable.java b/core/java/com/android/internal/app/procstats/SparseMappingTable.java index f941836d2c09..956ce99c0ad8 100644 --- a/core/java/com/android/internal/app/procstats/SparseMappingTable.java +++ b/core/java/com/android/internal/app/procstats/SparseMappingTable.java @@ -646,7 +646,7 @@ public class SparseMappingTable { */ private static void logOrThrow(String message, Throwable th) { Slog.e(TAG, message, th); - if (Build.TYPE.equals("eng")) { + if (Build.IS_ENG) { throw new RuntimeException(message, th); } } diff --git a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java index ff521c242fad..ce5e73a34700 100644 --- a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java +++ b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java @@ -104,13 +104,15 @@ public class KernelUidCpuFreqTimeReader { return; } final long[] deltaUidTimeMs = new long[size]; + boolean notify = false; for (int i = 0; i < size; ++i) { // Times read will be in units of 10ms final long totalTimeMs = Long.parseLong(timesStr[i], 10) * 10; deltaUidTimeMs[i] = totalTimeMs - uidTimeMs[i]; uidTimeMs[i] = totalTimeMs; + notify = notify || (deltaUidTimeMs[i] > 0); } - if (callback != null) { + if (callback != null && notify) { callback.onUidCpuFreqTime(uid, deltaUidTimeMs); } } diff --git a/core/java/com/android/internal/policy/PipSnapAlgorithm.java b/core/java/com/android/internal/policy/PipSnapAlgorithm.java index 95d714f1c3c7..749d00c136ec 100644 --- a/core/java/com/android/internal/policy/PipSnapAlgorithm.java +++ b/core/java/com/android/internal/policy/PipSnapAlgorithm.java @@ -49,9 +49,6 @@ public class PipSnapAlgorithm { // Allows snapping on the long edge in each orientation and magnets towards corners private static final int SNAP_MODE_LONG_EDGE_MAGNET_CORNERS = 4; - // The friction multiplier to control how slippery the PIP is when flung - private static final float SCROLL_FRICTION_MULTIPLIER = 8f; - // Threshold to magnet to a corner private static final float CORNER_MAGNET_THRESHOLD = 0.3f; @@ -64,8 +61,8 @@ public class PipSnapAlgorithm { private final float mDefaultSizePercent; private final float mMinAspectRatioForMinSize; private final float mMaxAspectRatioForMinSize; + private final int mFlingDeceleration; - private Scroller mScroller; private int mOrientation = Configuration.ORIENTATION_UNDEFINED; private final int mMinimizedVisibleSize; @@ -81,6 +78,8 @@ public class PipSnapAlgorithm { mMaxAspectRatioForMinSize = res.getFloat( com.android.internal.R.dimen.config_pictureInPictureAspectRatioLimitForMinSize); mMinAspectRatioForMinSize = 1f / mMaxAspectRatioForMinSize; + mFlingDeceleration = mContext.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.pip_fling_deceleration); onConfigurationChanged(); } @@ -107,20 +106,97 @@ public class PipSnapAlgorithm { * those for the given {@param stackBounds}. */ public Rect findClosestSnapBounds(Rect movementBounds, Rect stackBounds, float velocityX, - float velocityY) { - final Rect finalStackBounds = new Rect(stackBounds); - if (mScroller == null) { - final ViewConfiguration viewConfig = ViewConfiguration.get(mContext); - mScroller = new Scroller(mContext); - mScroller.setFriction(viewConfig.getScrollFriction() * SCROLL_FRICTION_MULTIPLIER); + float velocityY, Point dragStartPosition) { + final Rect intersectStackBounds = new Rect(stackBounds); + final Point intersect = getEdgeIntersect(stackBounds, movementBounds, velocityX, velocityY, + dragStartPosition); + intersectStackBounds.offsetTo(intersect.x, intersect.y); + return findClosestSnapBounds(movementBounds, intersectStackBounds); + } + + /** + * @return The point along the {@param movementBounds} that the PIP would intersect with based + * on the provided {@param velX}, {@param velY} along with the position of the PIP when + * the gesture started, {@param dragStartPosition}. + */ + public Point getEdgeIntersect(Rect stackBounds, Rect movementBounds, float velX, float velY, + Point dragStartPosition) { + final boolean isLandscape = mOrientation == Configuration.ORIENTATION_LANDSCAPE; + final int x = stackBounds.left; + final int y = stackBounds.top; + + // Find the line of movement the PIP is on. Line defined by: y = slope * x + yIntercept + final float slope = velY / velX; // slope = rise / run + final float yIntercept = y - slope * x; // rearrange line equation for yIntercept + // The PIP can have two intercept points: + // 1) Where the line intersects with one of the edges of the screen (vertical line) + Point vertPoint = new Point(); + // 2) Where the line intersects with the top or bottom of the screen (horizontal line) + Point horizPoint = new Point(); + + // Find the vertical line intersection, x will be one of the edges + vertPoint.x = velX > 0 ? movementBounds.right : movementBounds.left; + // Sub in x in our line equation to determine y position + vertPoint.y = findY(slope, yIntercept, vertPoint.x); + + // Find the horizontal line intersection, y will be the top or bottom of the screen + horizPoint.y = velY > 0 ? movementBounds.bottom : movementBounds.top; + // Sub in y in our line equation to determine x position + horizPoint.x = findX(slope, yIntercept, horizPoint.y); + + // Now pick one of these points -- first determine if we're flinging along the current edge. + // Only fling along current edge if it's a direction with space for the PIP to move to + int maxDistance; + if (isLandscape) { + maxDistance = velX > 0 + ? movementBounds.right - stackBounds.left + : stackBounds.left - movementBounds.left; + } else { + maxDistance = velY > 0 + ? movementBounds.bottom - stackBounds.top + : stackBounds.top - movementBounds.top; } - mScroller.fling(stackBounds.left, stackBounds.top, - (int) velocityX, (int) velocityY, - movementBounds.left, movementBounds.right, - movementBounds.top, movementBounds.bottom); - finalStackBounds.offsetTo(mScroller.getFinalX(), mScroller.getFinalY()); - mScroller.abortAnimation(); - return findClosestSnapBounds(movementBounds, finalStackBounds); + if (maxDistance > 0) { + // Only fling along the current edge if the start and end point are on the same side + final int startPoint = isLandscape ? dragStartPosition.y : dragStartPosition.x; + final int endPoint = isLandscape ? horizPoint.y : horizPoint.x; + final int center = movementBounds.centerX(); + if ((startPoint < center && endPoint < center) + || (startPoint > center && endPoint > center)) { + // We are flinging along the current edge, figure out how far it should travel + // based on velocity and assumed deceleration. + int distance = (int) (0 - Math.pow(isLandscape ? velX : velY, 2)) + / (2 * mFlingDeceleration); + distance = Math.min(distance, maxDistance); + // Adjust the point for the distance + if (isLandscape) { + horizPoint.x = stackBounds.left + (velX > 0 ? distance : -distance); + } else { + horizPoint.y = stackBounds.top + (velY > 0 ? distance : -distance); + } + return horizPoint; + } + } + // If we're not flinging along the current edge, find the closest point instead. + final double distanceVert = Math.hypot(vertPoint.x - x, vertPoint.y - y); + final double distanceHoriz = Math.hypot(horizPoint.x - x, horizPoint.y - y); + // Ensure that we're actually going somewhere + if (distanceVert == 0) { + return horizPoint; + } + if (distanceHoriz == 0) { + return vertPoint; + } + // Otherwise use the closest point + return Math.abs(distanceVert) > Math.abs(distanceHoriz) ? horizPoint : vertPoint; + } + + private int findY(float slope, float yIntercept, float x) { + return (int) ((slope * x) + yIntercept); + } + + private int findX(float slope, float yIntercept, float y) { + return (int) ((y - yIntercept) / slope); } /** diff --git a/core/jni/android/graphics/ColorFilter.cpp b/core/jni/android/graphics/ColorFilter.cpp index 5553a3ed22c5..4b6578bdff7f 100644 --- a/core/jni/android/graphics/ColorFilter.cpp +++ b/core/jni/android/graphics/ColorFilter.cpp @@ -30,9 +30,12 @@ using namespace uirenderer; class SkColorFilterGlue { public: - static void SafeUnref(JNIEnv* env, jobject clazz, jlong skFilterHandle) { - SkColorFilter* filter = reinterpret_cast<SkColorFilter *>(skFilterHandle); - SkSafeUnref(filter); + static void SafeUnref(SkShader* shader) { + SkSafeUnref(shader); + } + + static jlong GetNativeFinalizer(JNIEnv*, jobject) { + return static_cast<jlong>(reinterpret_cast<uintptr_t>(&SafeUnref)); } static jlong CreatePorterDuffFilter(JNIEnv* env, jobject, jint srcColor, jint modeHandle) { @@ -57,7 +60,7 @@ public: }; static const JNINativeMethod colorfilter_methods[] = { - {"nSafeUnref", "(J)V", (void*) SkColorFilterGlue::SafeUnref} + {"nativeGetFinalizer", "()J", (void*) SkColorFilterGlue::GetNativeFinalizer } }; static const JNINativeMethod porterduff_methods[] = { diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index cd7aae7d29dd..d35ddd0a87a8 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -90,25 +90,25 @@ void recycleJavaParcelObject(JNIEnv* env, jobject parcelObj) env->CallVoidMethod(parcelObj, gParcelOffsets.recycle); } -static jint android_os_Parcel_dataSize(JNIEnv* env, jclass clazz, jlong nativePtr) +static jint android_os_Parcel_dataSize(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); return parcel ? parcel->dataSize() : 0; } -static jint android_os_Parcel_dataAvail(JNIEnv* env, jclass clazz, jlong nativePtr) +static jint android_os_Parcel_dataAvail(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); return parcel ? parcel->dataAvail() : 0; } -static jint android_os_Parcel_dataPosition(JNIEnv* env, jclass clazz, jlong nativePtr) +static jint android_os_Parcel_dataPosition(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); return parcel ? parcel->dataPosition() : 0; } -static jint android_os_Parcel_dataCapacity(JNIEnv* env, jclass clazz, jlong nativePtr) +static jint android_os_Parcel_dataCapacity(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); return parcel ? parcel->dataCapacity() : 0; @@ -127,7 +127,7 @@ static jlong android_os_Parcel_setDataSize(JNIEnv* env, jclass clazz, jlong nati return 0; } -static void android_os_Parcel_setDataPosition(JNIEnv* env, jclass clazz, jlong nativePtr, jint pos) +static void android_os_Parcel_setDataPosition(jlong nativePtr, jint pos) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { @@ -146,7 +146,7 @@ static void android_os_Parcel_setDataCapacity(JNIEnv* env, jclass clazz, jlong n } } -static jboolean android_os_Parcel_pushAllowFds(JNIEnv* env, jclass clazz, jlong nativePtr, jboolean allowFds) +static jboolean android_os_Parcel_pushAllowFds(jlong nativePtr, jboolean allowFds) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); jboolean ret = JNI_TRUE; @@ -156,7 +156,7 @@ static jboolean android_os_Parcel_pushAllowFds(JNIEnv* env, jclass clazz, jlong return ret; } -static void android_os_Parcel_restoreAllowFds(JNIEnv* env, jclass clazz, jlong nativePtr, jboolean lastValue) +static void android_os_Parcel_restoreAllowFds(jlong nativePtr, jboolean lastValue) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { @@ -398,7 +398,7 @@ static jbyteArray android_os_Parcel_readBlob(JNIEnv* env, jclass clazz, jlong na return ret; } -static jint android_os_Parcel_readInt(JNIEnv* env, jclass clazz, jlong nativePtr) +static jint android_os_Parcel_readInt(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { @@ -407,7 +407,7 @@ static jint android_os_Parcel_readInt(JNIEnv* env, jclass clazz, jlong nativePtr return 0; } -static jlong android_os_Parcel_readLong(JNIEnv* env, jclass clazz, jlong nativePtr) +static jlong android_os_Parcel_readLong(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { @@ -416,7 +416,7 @@ static jlong android_os_Parcel_readLong(JNIEnv* env, jclass clazz, jlong nativeP return 0; } -static jfloat android_os_Parcel_readFloat(JNIEnv* env, jclass clazz, jlong nativePtr) +static jfloat android_os_Parcel_readFloat(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { @@ -425,7 +425,7 @@ static jfloat android_os_Parcel_readFloat(JNIEnv* env, jclass clazz, jlong nativ return 0; } -static jdouble android_os_Parcel_readDouble(JNIEnv* env, jclass clazz, jlong nativePtr) +static jdouble android_os_Parcel_readDouble(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { @@ -673,7 +673,7 @@ static jlong android_os_Parcel_appendFrom(JNIEnv* env, jclass clazz, jlong thisN return thisParcel->getOpenAshmemSize(); } -static jboolean android_os_Parcel_hasFileDescriptors(JNIEnv* env, jclass clazz, jlong nativePtr) +static jboolean android_os_Parcel_hasFileDescriptors(jlong nativePtr) { jboolean ret = JNI_FALSE; Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); @@ -747,7 +747,7 @@ static jlong android_os_Parcel_getGlobalAllocCount(JNIEnv* env, jclass clazz) return Parcel::getGlobalAllocCount(); } -static jlong android_os_Parcel_getBlobAshmemSize(JNIEnv* env, jclass clazz, jlong nativePtr) +static jlong android_os_Parcel_getBlobAshmemSize(jlong nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { @@ -759,24 +759,24 @@ static jlong android_os_Parcel_getBlobAshmemSize(JNIEnv* env, jclass clazz, jlon // ---------------------------------------------------------------------------- static const JNINativeMethod gParcelMethods[] = { - // @FastNative + // @CriticalNative {"nativeDataSize", "(J)I", (void*)android_os_Parcel_dataSize}, - // @FastNative + // @CriticalNative {"nativeDataAvail", "(J)I", (void*)android_os_Parcel_dataAvail}, - // @FastNative + // @CriticalNative {"nativeDataPosition", "(J)I", (void*)android_os_Parcel_dataPosition}, - // @FastNative + // @CriticalNative {"nativeDataCapacity", "(J)I", (void*)android_os_Parcel_dataCapacity}, // @FastNative {"nativeSetDataSize", "(JI)J", (void*)android_os_Parcel_setDataSize}, - // @FastNative + // @CriticalNative {"nativeSetDataPosition", "(JI)V", (void*)android_os_Parcel_setDataPosition}, // @FastNative {"nativeSetDataCapacity", "(JI)V", (void*)android_os_Parcel_setDataCapacity}, - // @FastNative + // @CriticalNative {"nativePushAllowFds", "(JZ)Z", (void*)android_os_Parcel_pushAllowFds}, - // @FastNative + // @CriticalNative {"nativeRestoreAllowFds", "(JZ)V", (void*)android_os_Parcel_restoreAllowFds}, {"nativeWriteByteArray", "(J[BII)V", (void*)android_os_Parcel_writeByteArray}, @@ -796,13 +796,13 @@ static const JNINativeMethod gParcelMethods[] = { {"nativeCreateByteArray", "(J)[B", (void*)android_os_Parcel_createByteArray}, {"nativeReadByteArray", "(J[BI)Z", (void*)android_os_Parcel_readByteArray}, {"nativeReadBlob", "(J)[B", (void*)android_os_Parcel_readBlob}, - // @FastNative + // @CriticalNative {"nativeReadInt", "(J)I", (void*)android_os_Parcel_readInt}, - // @FastNative + // @CriticalNative {"nativeReadLong", "(J)J", (void*)android_os_Parcel_readLong}, - // @FastNative + // @CriticalNative {"nativeReadFloat", "(J)F", (void*)android_os_Parcel_readFloat}, - // @FastNative + // @CriticalNative {"nativeReadDouble", "(J)D", (void*)android_os_Parcel_readDouble}, {"nativeReadString", "(J)Ljava/lang/String;", (void*)android_os_Parcel_readString}, {"nativeReadStrongBinder", "(J)Landroid/os/IBinder;", (void*)android_os_Parcel_readStrongBinder}, @@ -821,7 +821,7 @@ static const JNINativeMethod gParcelMethods[] = { {"nativeUnmarshall", "(J[BII)J", (void*)android_os_Parcel_unmarshall}, {"nativeCompareData", "(JJ)I", (void*)android_os_Parcel_compareData}, {"nativeAppendFrom", "(JJII)J", (void*)android_os_Parcel_appendFrom}, - // @FastNative + // @CriticalNative {"nativeHasFileDescriptors", "(J)Z", (void*)android_os_Parcel_hasFileDescriptors}, {"nativeWriteInterfaceToken", "(JLjava/lang/String;)V", (void*)android_os_Parcel_writeInterfaceToken}, {"nativeEnforceInterface", "(JLjava/lang/String;)V", (void*)android_os_Parcel_enforceInterface}, @@ -829,6 +829,7 @@ static const JNINativeMethod gParcelMethods[] = { {"getGlobalAllocSize", "()J", (void*)android_os_Parcel_getGlobalAllocSize}, {"getGlobalAllocCount", "()J", (void*)android_os_Parcel_getGlobalAllocCount}, + // @CriticalNative {"nativeGetBlobAshmemSize", "(J)J", (void*)android_os_Parcel_getBlobAshmemSize}, }; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 747f5b8ccf0c..be7934ba3fe5 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -147,6 +147,7 @@ <protected-broadcast android:name="android.bluetooth.device.action.CONNECTION_ACCESS_CANCEL" /> <protected-broadcast android:name="android.bluetooth.device.action.CONNECTION_ACCESS_REQUEST" /> <protected-broadcast android:name="android.bluetooth.device.action.SDP_RECORD" /> + <protected-broadcast android:name="android.bluetooth.device.action.BATTERY_LEVEL_CHANGED" /> <protected-broadcast android:name="android.bluetooth.devicepicker.action.LAUNCH" /> <protected-broadcast android:name="android.bluetooth.devicepicker.action.DEVICE_SELECTED" /> <protected-broadcast diff --git a/core/res/res/layout/notification_template_right_icon.xml b/core/res/res/layout/notification_template_right_icon.xml index aa4e05b15d19..fbf75387b786 100644 --- a/core/res/res/layout/notification_template_right_icon.xml +++ b/core/res/res/layout/notification_template_right_icon.xml @@ -26,8 +26,9 @@ android:layout_gravity="top|end" android:layout_marginTop="36dp" android:layout_marginEnd="@dimen/notification_content_margin_end" - android:scaleType="centerCrop"/> - <ImageView android:id="@+id/reply_icon_action" + android:scaleType="centerCrop" + android:importantForAccessibility="no" /> + <ImageButton android:id="@+id/reply_icon_action" android:layout_width="16dp" android:layout_height="16dp" android:layout_gravity="top|end" @@ -36,6 +37,7 @@ android:background="@drawable/notification_reply_background" android:src="@drawable/ic_reply_notification" android:scaleType="center" + android:contentDescription="@string/notification_reply_button_accessibility" visiblity="gone"/> </FrameLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 05613b76fb05..907f895cbaf7 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dae"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> uur"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> u. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> u. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minute"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekondes"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekonde"</string> <string name="untitled" msgid="4638956954852782576">"<Titelloos>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Geen foonnommer)"</string> <string name="unknownName" msgid="6867811765370350269">"Onbekend"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen stem- of nooddiens nie"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Word tydelik nie deur die selnetwerk by jou ligging aangebied nie"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk nie bereik nie"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Om opvangs te verbeter, probeer die soort verander wat by Instellings > Netwerk en internet > Mobiele netwerke > Voorkeurnetwerksoort gekies is."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Opletberigte"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproepaanstuur"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Noodterugbel-modus"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Soek vir diens"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-oproepe"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Om oproepe te maak en boodskappe oor Wi-Fi te stuur, vra jou diensverskaffer eers om hierdie diens op te stel. Skakel Wi-Fi-oproepe dan weer in Instellings aan."</item> + <item msgid="3910386316304772394">"Om oproepe te maak en boodskappe oor Wi-Fi te stuur, vra eers jou diensverskaffer om hierdie diens op te stel. Skakel Wi-Fi-oproepe dan weer in Instellings aan. (Foutkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registreer by jou diensverskaffer"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Oop Wi-Fi-netwerke beskikbaar</item> <item quantity="one">Oop Wi-Fi-netwerk beskikbaar</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Koppel aan oop Wi-Fi-netwerk"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Koppel tans aan oop Wi‑Fi-netwerk"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Aan Wi-Fi-netwerk gekoppel"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kon nie aan Wi-Fi-netwerk koppel nie"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerke te sien"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Koppel"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle netwerke"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Meld aan by Wi-Fi-netwerk"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Meld by netwerk aan"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index f8070a623714..27ce84d16515 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ቀኖች"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ቀን <xliff:g id="HOURS">%2$d</xliff:g> ሰዓ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ሰዓ <xliff:g id="MINUTES">%2$d</xliff:g> ደቂቃ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃዎች"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃዎች"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ደቂቃ <xliff:g id="SECONDS">%2$d</xliff:g> ሴ"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ሴ"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ሴ"</string> <string name="untitled" msgid="4638956954852782576">"<ርዕስ አልባ>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ምንም ስልክ ቁጥር የለም)"</string> <string name="unknownName" msgid="6867811765370350269">"አይታወቅም"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ምንም የድምፅ እና የድንገተኛ አደጋ ጥሪ አገልግሎት የለም"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"ለጊዜው በአካባቢዎ ባለው የተንቀሳቃሽ ስልክ አውታረ መረብ አይቀርብም"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"አውታረ መረብ ላይ መድረስ አይቻልም"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ቅበላን ለማሻሻል የተመረጠውን ዓይነት በቅንብሮች > አውታረ መረብ እና በይነመረብ > የተንቀሳቃሽ ስልክ አውታረ መረቦች > ተመራጭ የአውታረ መረብ ዓይነት ላይ ለመለወጥ ይሞክሩ።"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"ማንቂያዎች"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"ጥሪ ማስተላለፍ"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"የአደጋ ጊዜ ጥሪ ሁነታ"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"አገልግሎት ፍለጋ"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"የWi-Fi ጥሪ ማድረጊያ"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"በWi-Fi ላይ ጥሪዎችን ለማድረግ እና መልዕክቶችን ለመላክ መጀመሪያ የአገልግሎት አቅራቢዎ ይህን አገልግሎት እንዲያዘጋጅልዎ መጠየቅ አለብዎት። ከዚያ ከቅንብሮች ሆነው እንደገና የWi-Fi ጥሪን ያብሩ።"</item> + <item msgid="3910386316304772394">"በWi-Fi ላይ ጥሪዎችን ለማድረግ እና መልዕክቶችን ለመላክ መጀመሪያ የአገልግሎት አቅራቢዎ ይህን አገልግሎት እንዲያዘጋጅልዎ መጠየቅ አለብዎት። ከዚያ ከቅንብሮች ሆነው እንደገና የWi-Fi ጥሪን ያብሩ። (የስህተት ኮድ፦ <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"የአገልግሎት አቅራቢዎ ጋር ይመዝገቡ"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">የሚገኙ የWi-Fi አውታረ መረቦችን ክፈት</item> <item quantity="other">የሚገኙ የWi-Fi አውታረ መረቦችን ክፈት</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"ከክፍት የWi‑Fi አውታረ መረብ ጋር ያገናኙ"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ከክፍት የWi‑Fi አውታረ መረብ ጋር በመገናኘት ላይ"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"ከWi‑Fi አውታረ መረብ ጋር ተገናኝቷል"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ከWi‑Fi አውታረ መረብ ጋር መገናኘት አልተቻለም"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ሁሉንም አውታረ መረቦችን ለማየት መታ ያድርጉ"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"አገናኝ"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ሁሉም አውታረ መረቦች"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ወደ Wi-Fi አውታረ መረብ በመለያ ግባ"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ወደ አውታረ መረብ በመለያ ይግቡ"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 45405a0f09bd..d038a42ad2b9 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"تيرابايت"</string> <string name="petabyteShort" msgid="5637816680144990219">"بيتابايت"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> يوم"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> يوم <xliff:g id="HOURS">%2$d</xliff:g> ساعة"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعة <xliff:g id="MINUTES">%2$d</xliff:g> دقيقة"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقيقة <xliff:g id="SECONDS">%2$d</xliff:g> ثانية"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانية"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانية"</string> <string name="untitled" msgid="4638956954852782576">"<بلا عنوان>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ليس هناك رقم هاتف)"</string> <string name="unknownName" msgid="6867811765370350269">"غير معروف"</string> @@ -99,8 +87,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"لا تتوفر خدمة الصوت/الطوارئ"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"مؤقتا لا تقدمها شبكة الجوال في موقعك"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"يتعذر الوصول إلى الشبكة"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"لتحسين الاستقبال، يمكنك محاولة تغيير النوع المحدّد من خلال الإعدادات > الشبكة والإنترنت > شبكات الجوّال > نوع الشبكة المفضّل."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"التنبيهات"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"إعادة توجيه المكالمة"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"وضع معاودة الاتصال بالطوارئ"</string> @@ -136,7 +123,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"البحث عن خدمة"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"الاتصال عبر Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"لإجراء مكالمات وإرسال رسائل عبر Wi-Fi، اطلب من مشغّل شبكة الجوّال أولاً إعداد هذا الجهاز، ثم شغّل الاتصال عبر Wi-Fi مرة أخرى من خلال الإعدادات."</item> + <item msgid="3910386316304772394">"لإجراء مكالمات وإرسال رسائل عبر Wi-Fi، اطلب من مشغّل شبكة الجوّال أولاً إعداد هذه الخدمة، ثم شغّل الاتصال عبر Wi-Fi مرة أخرى من خلال الإعدادات. (رمز الخطأ: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"التسجيل لدى مشغّل شبكة الجوّال"</item> @@ -1195,6 +1182,13 @@ <item quantity="other">تتوفر شبكات Wi-Fi مفتوحة</item> <item quantity="one">تتوفر شبكة Wi-Fi واحدة مفتوحة</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"الاتصال بشبكة Wi-Fi المفتوحة"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"جارٍ الاتصال بشبكة Wi-Fi المفتوحة"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"تم الاتصال بشبكة Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"تعذَّر الاتصال بشبكة Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"انقر للاطلاع على جميع الشبكات"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"اتصال"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"جميع الشبكات"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"تسجيل الدخول إلى شبكة Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"تسجيل الدخول إلى الشبكة"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 9c0ee38b1be8..76f7e2c61de6 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gan <xliff:g id="HOURS">%2$d</xliff:g> saat"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> saat"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> saat"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> saat <xliff:g id="MINUTES">%2$d</xliff:g> dəq"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> saat <xliff:g id="MINUTES">%2$d</xliff:g> dəq"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> dəqiqə"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> dəq"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> dəq <xliff:g id="SECONDS">%2$d</xliff:g> san"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> dəq <xliff:g id="SECONDS">%2$d</xliff:g> san"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> saniyə"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> saniyə"</string> <string name="untitled" msgid="4638956954852782576">"Başlıqsız"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon nömrəsi yoxdur)"</string> <string name="unknownName" msgid="6867811765370350269">"Naməlum"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Səsli/təcili xidmət yoxdur"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Müvəqqəti olaraq məkanda mobil şəbəkə tərəfindən təklif edilmir"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Şəbəkəyə daxil olmaq mümkün deyil"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Qəbulu inkişaf etdirmək üçün seçilmiş növü Ayarlar > Şəbəkə və İnternet > Mobil şəbəkə > Tərcih edilən şəbəkə növü bölməsində dəyişə bilərsiniz."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Siqnallar"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Zəng yönləndirmə"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Təcili geriyə zəng rejimi"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Xidmət axtarılır"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi zəngi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi üzərindən zəng etmək və mesaj göndərmək üçün ilk öncə operatordan bu xidməti ayarlamağı tələb edin. Sonra Ayarlardan Wi-Fi çağrısını aktivləşdirin."</item> + <item msgid="3910386316304772394">"Zəng etmək və Wi-Fi üzərindən mesaj göndərmək üçün əvvəlcə operatordan bu cihazı quraşdırmağı tələb edin. Sonra Ayarlardan Wi-Fi zəngini deaktiv edin. (Xəta kodu: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Operatorla qeydiyyatdan keçin"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Əlçatan açıq Wi-Fi şəbəkələri</item> <item quantity="one">Əlçatan açıq Wi-Fi şəbəkəsi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Açıq Wi‑Fi şəbəkəsinə qoşulun"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Açıq Wi‑Fi şəbəkəsinə qoşulur"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi şəbəkəsinə qoşuldu"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi şəbəkəsinə qoşulmaq mümkün deyil"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Bütün şəbəkələri görmək üçün klikləyin"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Qoşulun"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Bütün Şəbəkələr"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi şəbəkəsinə daxil ol"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Şəbəkəyə daxil olun"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 69d56a968218..1b67cf796f03 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dana"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> s"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> s"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> s"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> s <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> s <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> <string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nema broja telefona)"</string> <string name="unknownName" msgid="6867811765370350269">"Nepoznato"</string> @@ -96,8 +84,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovne usluge/usluge za hitne pozive"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Privremeno je onemogućeno na mobilnoj mreži na vašoj lokaciji"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezivanje sa mrežom nije uspelo"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Da biste poboljšali prijem, probajte da promenite izabrani tip u odeljku Podešavanja > Mreža i internet > Mobilne mreže > Željeni tip mreže."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Obaveštenja"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmeravanje poziva"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim za hitan povratni poziv"</string> @@ -133,7 +120,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Pretraživanje usluge"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Pozivanje preko Wi-Fi-ja"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Da biste upućivali pozive i slali poruke preko Wi-Fi-ja, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko Wi-Fi-ja."</item> + <item msgid="3910386316304772394">"Da biste upućivali pozive i slali poruke preko Wi-Fi-ja, prvo zatražite od mobilnog operatera da vam omogući ovu uslugu. Zatim u Podešavanjima ponovo uključite Pozivanje preko Wi-Fi-ja. (kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrujte se kod mobilnog operatera"</item> @@ -1129,6 +1116,13 @@ <item quantity="few">Otvorene Wi-Fi mreže su dostupne</item> <item quantity="other">Otvorene Wi-Fi mreže su dostupne</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Povežite se sa otvorenom Wi‑Fi mrežom"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezujete se sa otvorenom Wi‑Fi mrežom"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezali ste se sa Wi‑Fi mrežom"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Povezivanje sa Wi‑Fi mrežom nije uspelo"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da biste videli sve mreže"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Sve mreže"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prijavljivanje na Wi-Fi mrežu"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Prijavite se na mrežu"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index a477fe5cdb3a..6ad22f629fe4 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"Тб"</string> <string name="petabyteShort" msgid="5637816680144990219">"Пб"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> сут"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> дз. <xliff:g id="HOURS">%2$d</xliff:g> гадз"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дз. <xliff:g id="HOURS">%2$d</xliff:g> гадз"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> гадз"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> гадз <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> гадз <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> хвіліна"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> секунда"</string> <string name="untitled" msgid="4638956954852782576">"<Без назвы>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Няма нумара тэлефона)"</string> <string name="unknownName" msgid="6867811765370350269">"Невядома"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма сэрвісу галасавых / экстранных выклікаў"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Часова не прапаноўваецца сеткай мабільнай сувязі ў вашым месцазанходжанні"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Немагчыма падключыцца да сеткі"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Каб палепшыць якасць прыёму, паспрабуйце змяніць тып, выбраны ў меню \"Налады > Сетка і інтэрнэт > Мабільныя сеткі > Прыярытэтны тып сеткі\"."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Абвесткі"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Пераадрасацыя выкліку"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Рэжым экстраннага зваротнага выкліку"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Пошук службы"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-тэлефанія"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Каб рабіць выклікі і адпраўляць паведамленні па Wi-Fi, спачатку папрасіце свайго аператара наладзіць гэту паслугу. Затым зноў уключыце Wi-Fi-тэлефанію ў меню Налады."</item> + <item msgid="3910386316304772394">"Каб рабіць выклікі і адпраўляць паведамленні па Wi-Fi, спачатку папрасіце свайго аператара наладзіць гэту паслугу. Затым зноў уключыце Wi-Fi-тэлефанію ў меню Налады. (Код памылкі: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Зарэгіструйцеся ў свайго аператара"</item> @@ -1151,6 +1138,13 @@ <item quantity="many">адкрытых сетак Wi-Fi даступна</item> <item quantity="other">адкрытай сеткі Wi-Fi даступна</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Падключыцеся да адкрытай сеткі Wi-Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ідзе падключэнне да адкрытай сеткі Wi‑Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Выканана падключэнне да адкрытай сеткі Wi‑Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не атрымалася падключыцца да адкрытай сеткі Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Дакраніцеся, каб убачыць усе сеткі"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Падключыцца"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Усе сеткі"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Уваход у сетку Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Увайдзіце ў сетку"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index e4abe3a5f582..c9ed0cad7be5 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дни"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> <string name="untitled" msgid="4638956954852782576">"<Без заглавие>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Няма телефонен номер)"</string> <string name="unknownName" msgid="6867811765370350269">"Неизвестно"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Няма услуга за гласови/спешни обаждания"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Временно не се предлага от мобилната мрежа в местоположението ви"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се установи връзка с мрежата"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"За да подобрите сигнала, променете избрания тип мрежа от „Настройки“ > „Мрежа и интернет“ > „Мобилни мрежи“ > „Предпочитан тип мрежа“."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Сигнали"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Пренасочване на обаждания"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на обратно обаждане при спешност"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Търси се покритие"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Обаждания през Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"За да извършвате обаждания и да изпращате съобщения през Wi-Fi, първо помолете оператора си да настрои тази услуга. След това включете отново функцията за обаждания през Wi-Fi от настройките."</item> + <item msgid="3910386316304772394">"За да извършвате обаждания и да изпращате съобщения през Wi-Fi, първо, помолете оператора си да настрои тази услуга. След това включете отново функцията за обаждания през Wi-Fi от настройките. (Код на грешката: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Регистриране с оператора ви"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Има достъпни отворени Wi-Fi мрежи</item> <item quantity="one">Има достъпна отворена Wi-Fi мрежа</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Свързване с отворена Wi‑Fi мрежа"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Установява се връзка с отворена Wi‑Fi мрежа"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Установихте връзка с Wi-Fi мрежата"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можа да се установи връзка с Wi‑Fi мрежата"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Докоснете, за да видите всички мрежи"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Свързване"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Всички мрежи"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Влизане в Wi-Fi мрежа"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Вход в мрежата"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 1134d450fa29..86ff9972c7d5 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> দিন"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘণ্টা"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> দিন <xliff:g id="HOURS">%2$d</xliff:g> ঘণ্টা"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ঘণ্টা"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ঘণ্টা <xliff:g id="MINUTES">%2$d</xliff:g> মিনিট"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ঘণ্টা <xliff:g id="MINUTES">%2$d</xliff:g> মিনিট"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট <xliff:g id="SECONDS">%2$d</xliff:g> সেকেন্ড"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> মিনিট <xliff:g id="SECONDS">%2$d</xliff:g> সেকেন্ড"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> সেকেন্ড"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> সেকেন্ড"</string> <string name="untitled" msgid="4638956954852782576">"<শিরোনামহীন>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(কোনো ফোন নম্বর নেই)"</string> <string name="unknownName" msgid="6867811765370350269">"অজানা"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"কোনো ভয়েস/জরুরী পরিষেবা নেই"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"সাময়িকভাবে মোবাইল নেটওয়ার্ক আপনার অবস্থানে এই পরিষেবা দিচ্ছে না"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"নেটওয়ার্কের সিগন্যাল নেই"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"রিসেপশন উন্নত করতে সেটিংস > নেটওয়ার্ক এবং ইন্টারনেট > মোবাইল নেটওয়ার্ক > পছন্দের নেটওয়ার্কের ধরণ এ গিয়ে নির্বাচিত নেটওয়ার্কের ধরণ পরিবর্তন করে দেখুন।"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"সতর্কবার্তা"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"কল ফরওয়ার্ড করা"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"জরুরি কলব্যাক মোড"</string> @@ -131,9 +118,7 @@ <string name="roamingText12" msgid="1189071119992726320">"রোমিং ব্যানার বন্ধ আছে"</string> <string name="roamingTextSearching" msgid="8360141885972279963">"পরিষেবা অনুসন্ধান করা হচ্ছে"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ওয়াই-ফাই কলিং"</string> - <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"ওয়াই-ফাই এর মাধ্যমে কল করতে ও বার্তা পাঠাতে, প্রথমে আপনার পরিষেবা প্রদানকারীকে এই পরিষেবার সেট আপ করার বিষয়ে জিজ্ঞাসা করুন। তারপরে আবার সেটিংস থেকে ওয়াই-ফাই কলিং চালু করুন।"</item> - </string-array> + <!-- no translation found for wfcOperatorErrorAlertMessages:0 (3910386316304772394) --> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"আপনার পরিষেবা প্রদানকারীকে নথিভুক্ত করুন"</item> </string-array> @@ -1107,6 +1092,13 @@ <item quantity="one">খোলা ওয়াই-ফাই নেটওয়ার্কগুলি উপলব্ধ রয়েছে</item> <item quantity="other">খোলা ওয়াই-ফাই নেটওয়ার্কগুলি উপলব্ধ রয়েছে</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযোগ করুন"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযোগ করা হচ্ছে"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"উন্মুক্ত ওয়াই-ফাই নেটওয়ার্কে সংযুক্ত করা হয়েছে"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ওয়াই-ফাই নেটওয়ার্কে সংযোগ করা গেল না"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"সমস্ত নেটওয়ার্ক দেখতে ট্যাপ করুন"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"সংযুক্ত করুন"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"সমস্ত নেটওয়ার্ক"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ওয়াই-ফাই নেটওয়ার্কে প্রবেশ করুন"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"নেটওয়ার্কে প্রবেশ করুন"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 9462613668dc..f1ec56f4473a 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dana"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> sati"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> <string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nema broja telefona)"</string> <string name="unknownName" msgid="6867811765370350269">"Nepoznato"</string> @@ -96,8 +84,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema govornih/hitnih usluga"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutno nije u ponudi mobilne mreže na vašoj lokaciji"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nije moguće dosegnuti mrežu"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Da poboljšate prijem, pokušajte promijeniti odabrani tip u meniju Postavke < Mreža i internet < Mobilne mreže < Preferirani tip mreže."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način rada za hitni povratni poziv"</string> @@ -133,7 +120,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Traženje usluge"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi pozivanje"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Da biste pozivali i slali poruke preko Wi-Fi-ja, prvo zatražite od operatera da postavi tu uslugu. Potom u Postavkama ponovo uključite Wi-Fi pozivanje."</item> + <item msgid="3910386316304772394">"Da biste pozivali i slali poruke koristeći Wi-Fi mrežu, prvo zatražite od operatera da postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozivanje u Postavkama. (Kôd greške: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrirajte se kod svog operatera"</item> @@ -1131,6 +1118,13 @@ <item quantity="few">Otvorene Wi-Fi mreže su dostupne</item> <item quantity="other">Otvorene Wi-Fi mreže su dostupne</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Povežite se na otvorenu Wi‑Fi mrežu"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezivanje na otvorenu Wi‑Fi mrežu"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezani ste na Wi‑Fi mrežu"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije se moguće povezati na Wi‑Fi mrežu"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite da vidite sve mreže"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Povežite se"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Sve mreže"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prijavljivanje na Wi-Fi mrežu"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Prijava na mrežu"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 75b41b6593b1..dc769e680d9b 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dies"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hores"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuts"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sense títol>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Sense número de telèfon)"</string> <string name="unknownName" msgid="6867811765370350269">"Desconegut"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sense servei de veu/emergència"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"La xarxa de telefonia mòbil de la teva ubicació temporalment no ofereix aquest servei"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No es pot accedir a la xarxa"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Per millorar la recepció, prova de canviar el tipus de xarxa a Configuració > Xarxa i Internet > Xarxes de telefonia mòbil > Tipus de xarxa preferit."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desviació de trucades"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de devolució de trucada d\'emergència"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"S\'està cercant el servei"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Trucades per Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Per fer trucades i enviar missatges per Wi-Fi, primer has de demanar a l\'operador de telefonia mòbil que configuri aquest servei. Després, torna a activar les trucades per Wi-Fi des de Configuració."</item> + <item msgid="3910386316304772394">"Per fer trucades i enviar missatges per Wi-Fi, primer has de demanar a l\'operador de telefonia mòbil que configuri aquest servei. Després, torna a activar les trucades per Wi-Fi a Configuració. (Codi d\'error: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registra\'t amb el teu operador de telefonia mòbil"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Xarxes Wi-Fi obertes disponibles</item> <item quantity="one">Xarxa Wi-Fi oberta disponible</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Connecta\'t a una xarxa Wi-Fi oberta"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"S\'està connectant a una xarxa Wi-Fi oberta"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"S\'ha connectat a la xarxa Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No s\'ha pogut connectar a una xarxa Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca per veure totes les xarxes"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connecta"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Totes les xarxes"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Inicia la sessió a la xarxa Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Inicia la sessió a la xarxa"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> @@ -1618,9 +1612,9 @@ <string name="lock_to_app_toast_locked" msgid="7849470948648628704">"No es pot deixar de fixar aquesta aplicació"</string> <string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string> <string name="lock_to_app_exit" msgid="8598219838213787430">"Fixació de la pantalla anul·lada"</string> - <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Sol·licita el codi PIN per anul·lar"</string> - <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Sol·licita el patró de desbloqueig per anul·lar"</string> - <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demana la contrasenya per anul·lar"</string> + <string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Sol·licita el codi PIN per deixar de fixar"</string> + <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Sol·licita el patró de desbloqueig per deixar de fixar"</string> + <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demana la contrasenya per deixar de fixar"</string> <string name="package_installed_device_owner" msgid="6875717669960212648">"Instal·lat per l\'administrador"</string> <string name="package_updated_device_owner" msgid="1847154566357862089">"Actualitzat per l\'administrador"</string> <string name="package_deleted_device_owner" msgid="2307122077550236438">"Suprimit per l\'administrador"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 94564f3442e3..f11798254fb8 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez názvu>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(žádné telefonní číslo)"</string> <string name="unknownName" msgid="6867811765370350269">"Není známo"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasová ani tísňová volání nejsou k dispozici"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Mobilní síť ve vaší oblasti tuto službu dočasně nenabízí"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"K síti se nelze připojit"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Chcete-li zlepšit příjem, zkuste změnit vybraný typ sítě v Nastavení > Síť a internet > Mobilní sítě > Preferovaný typ sítě."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornění"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Přesměrování hovorů"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tísňového zpětného volání"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Vyhledávání služby"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Volání přes Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Chcete-li volat a odesílat textové zprávy přes síť Wi-Fi, nejprve požádejte operátora, aby vám tuto službu nastavil. Poté volání přes Wi-Fi opět zapněte v Nastavení."</item> + <item msgid="3910386316304772394">"Chcete-li volat a odesílat SMS přes síť Wi-Fi, nejprve požádejte operátora, aby vám tuto službu nastavil. Poté volání přes Wi-Fi opět zapněte v Nastavení. (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrace u operátora"</item> @@ -1151,6 +1138,13 @@ <item quantity="other">K dispozici jsou veřejné sítě Wi-Fi</item> <item quantity="one">K dispozici je veřejná síť Wi-Fi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Připojení k otevřené síti Wi-Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Připojování k otevřené síti Wi-Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Připojeno k síti Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Připojení k síti Wi-Fi se nezdařilo"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všechny sítě"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Připojit"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Všechny sítě"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Přihlásit se k síti Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Přihlásit se k síti"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index d1d30828144e..e7db8d5615cd 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"Tb"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pb"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dage"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> timer"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> <string name="untitled" msgid="4638956954852782576">"<Uden titel>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Intet telefonnummer)"</string> <string name="unknownName" msgid="6867811765370350269">"Ukendt"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale- og nødtjenester"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbydes i øjeblikket ikke af mobilnetværket på din placering"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Der er ingen forbindelse til netværket"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Hvis du vil forbedre signalet, kan du prøve at ændre den valgte netværkstype i Indstillinger > Netværk og internet > Mobilnetværk > Foretrukken netværkstype."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Underretninger"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderestilling af opkald"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Nødtilbagekaldstilstand"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Søger efter tjeneste"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Opkald via Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Hvis du vil foretage opkald og sende beskeder via Wi-Fi, skal du først anmode dit mobilselskab om at konfigurere denne tjeneste. Derefter skal du slå Wi-Fi-opkald til igen fra Indstillinger."</item> + <item msgid="3910386316304772394">"Hvis du vil foretage opkald og sende beskeder via Wi-Fi, skal du først anmode dit mobilselskab om at konfigurere denne tjeneste. Derefter skal du aktivere Wi-Fi-opkald igen fra Indstillinger. (Fejlkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrer dig hos dit mobilselskab"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Åbne Wi-Fi-netværk er tilgængelige</item> <item quantity="other">Åbne Wi-Fi-netværk er tilgængelige</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Opret forbindelse til et åbent Wi-Fi-netværk"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Opretter forbindelse til et åbent Wi‑Fi-netværk"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Forbundet til Wi-Fi-netværket"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Der kan ikke oprettes forbindelse til Wi-Fi-netværket"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryk for at se alle netværk"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Opret forbindelse"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle netværk"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Log ind på Wi-Fi-netværk"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Log ind på netværk"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 1feb2ec06647..7ff623b4907e 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> Tage"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> Tag <xliff:g id="HOURS">%2$d</xliff:g> Std."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> Std."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> Std. <xliff:g id="MINUTES">%2$d</xliff:g> Min."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> Min."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> Min. <xliff:g id="SECONDS">%2$d</xliff:g> Sek."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> Sek."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> Sek."</string> <string name="untitled" msgid="4638956954852782576">"<Unbenannt>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Keine Telefonnummer)"</string> <string name="unknownName" msgid="6867811765370350269">"Unbekannt"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Keine Anrufe/Notrufe"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Derzeit nicht im Mobilfunknetz in deiner Region verfügbar"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Netzwerk nicht erreichbar"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Der Empfang lässt sich möglicherweise verbessern, indem du unter \"Einstellungen\" > \"Netzwerk\" & \"Internet\" > \"Mobilfunknetze\" > \"Bevorzugter Netzwerktyp\" einen anderen Typ auswählst."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Warnmeldungen"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Anrufweiterleitung"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Notfallrückrufmodus"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Suche nach Dienst"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Anrufe über WLAN"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann erneut über die Einstellungen."</item> + <item msgid="3910386316304772394">"Um über WLAN telefonieren und Nachrichten senden zu können, bitte zuerst deinen Mobilfunkanbieter, diesen Dienst einzurichten. Aktiviere die Option \"Anrufe über WLAN\" dann noch einmal über die Einstellungen. (Fehlercode: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registriere dich bei deinem Mobilfunkanbieter."</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Verfügbare WLAN-Netzwerke öffnen</item> <item quantity="one">Verfügbares WLAN-Netzwerk öffnen</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Mit offenem WLAN verbinden"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Verbindung mit offenem WLAN wird hergestellt"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Mit WLAN verbunden"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WLAN-Verbindung konnte nicht hergestellt werden"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tippen, um alle Netzwerke zu sehen"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinden"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle Netzwerke"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"In WLAN-Netzwerk anmelden"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Im Netzwerk anmelden"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index be6dfee56d32..def96a88286a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ημέρες"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρες"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ημ. <xliff:g id="HOURS">%2$d</xliff:g> ώρα"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ώρες"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ώρα <xliff:g id="MINUTES">%2$d</xliff:g> λ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> λεπτά"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> λεπτά"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> λ. <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> λ <xliff:g id="SECONDS">%2$d</xliff:g> δευτ."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> δευτ."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> δευτ."</string> <string name="untitled" msgid="4638956954852782576">"<Χωρίς τίτλο>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Δεν υπάρχει τηλεφωνικός αριθμός)"</string> <string name="unknownName" msgid="6867811765370350269">"Άγνωστο"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Δεν υπάρχει φωνητική υπηρεσία/υπηρεσία έκτακτης ανάγκης"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Δεν προσφέρεται προσωρινά από το δίκτυο κινητής τηλεφωνίας στην τοποθεσία σας"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Δεν είναι δυνατή η σύνδεση στο δίκτυο"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Για να βελτιώσετε τη λήψη, δοκιμάστε να αλλάξετε τον επιλεγμένο τύπο από τις Ρυθμίσεις > Δίκτυο και διαδίκτυο > Δίκτυα κινητής τηλεφωνίας > Προτιμώμενος τύπος δικτύου."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ειδοποιήσεις"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Προώθηση κλήσης"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Λειτουργία επιστροφής κλήσης έκτακτης ανάγκης"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Αναζήτηση υπηρεσιών"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Κλήση Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Για να κάνετε κλήσεις και να στέλνετε μηνύματα μέσω Wi-Fi, ζητήστε πρώτα από την εταιρεία κινητής τηλεφωνίας να ρυθμίσει την υπηρεσία. Στη συνέχεια, ενεργοποιήστε ξανά τη λειτουργία κλήσεων μέσω Wi-Fi από τις Ρυθμίσεις."</item> + <item msgid="3910386316304772394">"Για να κάνετε κλήσεις και να στέλνετε μηνύματα μέσω Wi-Fi, ζητήστε πρώτα από την εταιρεία κινητής τηλεφωνίας να ρυθμίσει την υπηρεσία. Στη συνέχεια, ενεργοποιήστε ξανά την Κλήση Wi-Fi από τις Ρυθμίσεις. (Κωδικός σφάλματος: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Εγγραφείτε μέσω της εταιρείας κινητής τηλεφωνίας"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Υπάρχουν διαθέσιμα ανοικτά δίκτυα Wi-Fi</item> <item quantity="one">Υπάρχει διαθέσιμο ανοικτό δίκτυο Wi-Fi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Ολοκληρώθηκε η σύνδεση στο δίκτυο Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Δεν ήταν δυνατή η σύνδεση σε δίκτυο Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Πατήστε για να δείτε όλα τα δίκτυα"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Σύνδεση"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Όλα τα δίκτυα"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Συνδεθείτε στο δίκτυο Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Σύνδεση στο δίκτυο"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index fdc03680ceab..5db79b869c6d 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> <string name="untitled" msgid="4638956954852782576">"<Untitled>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(No phone number)"</string> <string name="unknownName" msgid="6867811765370350269">"Unknown"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"To improve reception, try changing the type selected at Settings > Network & Internet > Mobile networks > Preferred network type."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + <item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Register with your operator"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Open Wi-Fi networks available</item> <item quantity="one">Open Wi-Fi network available</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"All Networks"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Sign in to a Wi-Fi network"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index fdc03680ceab..5db79b869c6d 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> <string name="untitled" msgid="4638956954852782576">"<Untitled>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(No phone number)"</string> <string name="unknownName" msgid="6867811765370350269">"Unknown"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"To improve reception, try changing the type selected at Settings > Network & Internet > Mobile networks > Preferred network type."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + <item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Register with your operator"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Open Wi-Fi networks available</item> <item quantity="one">Open Wi-Fi network available</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"All Networks"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Sign in to a Wi-Fi network"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index fdc03680ceab..5db79b869c6d 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> days"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hrs"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hrs"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> mins"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hr <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mins"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> secs"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secs"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> <string name="untitled" msgid="4638956954852782576">"<Untitled>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(No phone number)"</string> <string name="unknownName" msgid="6867811765370350269">"Unknown"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"No voice/emergency service"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Temporarily not offered by the mobile network at your location"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t find network"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"To improve reception, try changing the type selected at Settings > Network & Internet > Mobile networks > Preferred network type."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerts"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Call forwarding"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Searching for Service"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"To make calls and send messages over Wi-Fi, first ask your carrier to set up this service. Then turn on Wi-Fi calling again from Settings."</item> + <item msgid="3910386316304772394">"To make calls and send messages over Wi-Fi, first ask your operator to set up this service. Then turn on Wi-Fi calling again from Settings. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Register with your operator"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Open Wi-Fi networks available</item> <item quantity="one">Open Wi-Fi network available</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Connect to open Wi‑Fi network"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connecting to open Wi‑Fi network"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connected to Wi‑Fi network"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Could not connect to Wi‑Fi network"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap to see all networks"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connect"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"All Networks"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Sign in to a Wi-Fi network"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Sign in to network"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 0fc0f2f1f5bd..2a828f7a65f4 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sin título>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(No hay número de teléfono)"</string> <string name="unknownName" msgid="6867811765370350269">"Desconocido"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de voz/emergencia"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil de tu ubicación no ofrece este servicio de forma temporal"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para mejorar la recepción, cambia el tipo de red. Selecciona Configuración > Internet y red > Redes móviles > Tipo de red preferido."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servicio"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Llamada por Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Para realizar llamadas o enviar mensajes por Wi-Fi, primero solicítale al proveedor que instale el servicio. Luego, vuelve a activar las llamadas por Wi-Fi desde Configuración."</item> + <item msgid="3910386316304772394">"Para hacer llamadas y enviar mensajes mediante Wi-Fi, solicítale a tu proveedor que configure este servicio. Luego, vuelve a activar la Llamada con Wi-Fi en Configuración. (código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Regístrate con tu proveedor."</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Abrir redes de Wi-Fi disponibles</item> <item quantity="one">Abrir red de Wi-Fi disponible</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose a una red Wi-Fi abierta"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Se conectó a la red Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No fue posible conectarse a la red Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Presiona para ver todas las redes"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas las redes"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Accede a una red Wi-Fi."</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Acceder a la red"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index db2e9d3b5938..9323e1f0ce6e 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sin título>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Sin número de teléfono)"</string> <string name="unknownName" msgid="6867811765370350269">"Desconocido"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sin servicio de emergencia ni de voz"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"La red móvil disponible en tu ubicación no ofrece esta opción de forma temporal"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"No se puede establecer conexión con la red"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para mejorar la recepción, prueba a cambiar el tipo seleccionado en Ajustes > Red e Internet > Redes móviles > Tipo de red preferido."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de llamada"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de llamada de emergencia"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servicio"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Llamadas Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Para hacer llamadas y enviar mensajes por Wi-Fi, debes pedir antes a tu operador que configure este servicio. Una vez hecho esto, vuelva a activar las llamadas Wi-Fi en Ajustes."</item> + <item msgid="3910386316304772394">"Para hacer llamadas y enviar mensajes por Wi-Fi, pide antes a tu operador que configure este servicio. Una vez hecho esto, vuelva a activar la llamada por Wi-Fi en Ajustes. (Código de error: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Regístrate con tu operador"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Redes Wi-Fi abiertas disponibles</item> <item quantity="one">Red Wi-Fi abierta disponible</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose a una red Wi-Fi abierta"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a la red Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No se ha podido conectar a la red Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas las redes"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas las redes"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Iniciar sesión en red Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Iniciar sesión en la red"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 7f9ff6c37cac..4ff5a6b2bbd6 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päeva"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päev <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Pealkirjata>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefoninumbrit pole)"</string> <string name="unknownName" msgid="6867811765370350269">"Teadmata"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Häälkõned/hädaabiteenus pole saadaval"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Teie asukoha mobiilsidevõrk seda teenust ajutiselt ei paku"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Võrguga ei saa ühendust"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Vastuvõtu parandamiseks muutke valitud tüüpi jaotises Seaded > Võrk ja Internet > Mobiilsidevõrgud > Eelistatud võrgutüüp."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Teatised"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Kõnede suunamine"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hädaolukorra tagasihelistusrežiim"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Teenuse otsimine"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"WiFi-kõned"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Üle WiFi-võrgu helistamiseks ja sõnumite saatmiseks paluge operaatoril esmalt see teenus seadistada. Seejärel lülitage WiFi-kõned menüüs Seaded uuesti sisse."</item> + <item msgid="3910386316304772394">"WiFi-võrgu kaudu helistamiseks ja sõnumite saatmiseks paluge operaatoril esmalt see teenus seadistada. Seejärel lülitage WiFi-kõned menüüs Seaded uuesti sisse. (Veakood: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registreeruge operaatori juures"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Avatud WiFi-võrgud on saadaval</item> <item quantity="one">Avatud WiFi-võrk on saadaval</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Looge ühendus avatud WiFi-võrguga"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ühenduse loomine avatud WiFi-võrguga"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Ühendatud WiFi-võrguga"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WiFi-võrguga ei õnnestunud ühendust luua"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Puudutage kõikide võrkude nägemiseks"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Ühenda"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Kõik võrgud"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Logi sisse WiFi-võrku"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Võrku sisselogimine"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 016f4b440936..ca369c434ede 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> egun"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> egun <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> m"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> m"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> m <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Izengabea>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ez dago telefono-zenbakirik)"</string> <string name="unknownName" msgid="6867811765370350269">"Ezezaguna"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ez dago ahots- edo larrialdi-deien zerbitzurik"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Zauden tokiko sare mugikorrak ez du eskaintzen aukera hori une honetan"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ezin da konektatu sarera"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Seinalea hobea izan dadin, aldatu sare mota Ezarpenak > Sareak eta Internet > Sare mugikorrak > Sare mota hobetsia atalean."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Abisuak"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Dei-desbideratzea"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Larrialdi-deiak soilik jasotzeko modua"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Zerbitzu bila"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi bidezko deiak"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean."</item> + <item msgid="3910386316304772394">"Wi-Fi bidez deiak egiteko eta mezuak bidaltzeko, eskatu operadoreari zerbitzu hori gaitzeko. Ondoren, aktibatu Wi-Fi bidezko deiak Ezarpenak atalean. (Errore-kodea: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Erregistratu operadorearekin"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Wi-Fi sare irekiak erabilgarri</item> <item quantity="one">Wi-Fi sare irekia erabilgarri</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Konektatu Wi‑Fi sare irekira"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Wi‑Fi sare irekira konektatzen"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi sare irekira konektatuta"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ezin izan da konektatu Wi‑Fi sare irekira"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Sakatu hau sare guztiak ikusteko"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Konektatu"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Sare guztiak"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Hasi saioa Wi-Fi sarean"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Hasi saioa sarean"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 31035fa0a2f6..9d4cb6df4b40 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"ترابایت"</string> <string name="petabyteShort" msgid="5637816680144990219">"پتابایت"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> روز"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> روز و <xliff:g id="HOURS">%2$d</xliff:g> ساعت"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ساعت و <xliff:g id="MINUTES">%2$d</xliff:g> دقیقه"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> دقیقه و <xliff:g id="SECONDS">%2$d</xliff:g> ثانیه"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانیه"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ثانیه"</string> <string name="untitled" msgid="4638956954852782576">"<بدون عنوان>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(بدون شماره تلفن)"</string> <string name="unknownName" msgid="6867811765370350269">"نامشخص"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"سرویس صوتی/اضطراری دردسترس نیست"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"موقتاً توسط شبکه داده دستگاه همراه در مکان شما ارائه نمیشود"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"شبکه دردسترس نیست"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"برای بهبود دریافت، نوع شبکه انتخابشده را در «تنظیمات > شبکه و اینترنت > شبکههای تلفن همراه > نوع شبکه ترجیحی» تغییر دهید."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"هشدارها"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"بازارسال تماس"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"حالت پاسخ تماس اضطراری"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"جستجوی سرویس"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"تماس از طریق Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"برای برقراری تماس و ارسال پیام از طریق Wi-Fi، ابتدا از شرکت مخابراتیتان درخواست کنید این سرویس را راهاندازی کند. سپس دوباره از تنظیمات، تماس Wi-Fi را روشن کنید."</item> + <item msgid="3910386316304772394">"برای برقراری تماس و ارسال پیام ازطریق Wi-Fi، ابتدا از شرکت مخابراتی خود بخواهید این سرویس را تنظیم کند. سپس در «تنظیمات»۷ دوباره «تماس ازطریق Wi-Fi» را روشن کنید. (کد خطا: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"ثبتنام با شرکت مخابراتی شما"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">شبکه Wi-Fi باز در دسترس</item> <item quantity="other">شبکه Wi-Fi باز در دسترس</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"اتصال به شبکه Wi‑Fi باز"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"درحال اتصال به شبکه Wi‑Fi باز"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"به شبکه Wi‑Fi متصل شد"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"به شبکه Wi-Fi متصل نشد"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"برای دیدن همه شبکهها ضربه بزنید"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"اتصال"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"همه شبکهها"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ورود به شبکه Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ورود به سیستم شبکه"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index cd642cb2c4ba..ffa6d67dca15 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"Tt"</string> <string name="petabyteShort" msgid="5637816680144990219">"Pt"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> päivää"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> päivä <xliff:g id="HOURS">%2$d</xliff:g> t"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> t"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Nimetön>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ei puhelinnumeroa)"</string> <string name="unknownName" msgid="6867811765370350269">"Tuntematon"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ei ääni- tai hätäpuheluja"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Sijaintisi mobiiliverkko ei tarjoa tätä tilapäisesti."</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ei yhteyttä verkkoon"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Voit yrittää parantaa kuuluvuutta vaihtamalla tyypin asetusta. Valitse Asetukset > Verkko > Internet > Mobiiliverkot > Ensisijainen verkko."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ilmoitukset"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Soitonsiirto"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hätäpuhelujen takaisinsoittotila"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Etsitään signaalia"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-puhelut"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Jos haluat soittaa puheluita ja lähettää viestejä Wi-Fin kautta, pyydä ensin operaattoriasi ottamaan tämä palvelu käyttöön. Ota sitten Wi-Fi-puhelut käyttöön asetuksissa."</item> + <item msgid="3910386316304772394">"Jos haluat soittaa puheluita ja lähettää viestejä Wi-Fin kautta, pyydä ensin operaattoriasi ottamaan tämä palvelu käyttöön. Ota sitten Wi-Fi-puhelut käyttöön asetuksissa. (Virhekoodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Rekisteröidy operaattorisi asiakkaaksi."</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Avoimia Wi-Fi-verkkoja käytettävissä</item> <item quantity="one">Avoin Wi-Fi-verkko käytettävissä</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Yhdistä avoimeen Wi‑Fi-verkkoon"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Yhdistetään avoimeen Wi‑Fi-verkkoon"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Yhdistetty Wi-Fi-verkkoon"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi-verkkoon yhdistäminen epäonnistui"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Napauta, niin näet kaikki verkot."</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Yhdistä"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Kaikki verkot"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Kirjaudu Wi-Fi-verkkoon"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Kirjaudu verkkoon"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 7646ea89a3d4..d4bac7c02627 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sans_titre>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Aucun numéro de téléphone)"</string> <string name="unknownName" msgid="6867811765370350269">"Inconnu"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal ou d\'urgence"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Ce service est temporairement non offert par le réseau cellulaire à l\'endroit où vous êtes"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible de joindre le réseau"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Pour améliorer la réception, essayez de changer le type de réseau sélectionné, sous Paramètres > Réseaux et Internet > Réseaux cellulaires > Type de réseau préféré."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Recherche des services disponibles"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Appels Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Pour effectuer des appels et envoyer des messages par Wi-Fi, demandez tout d\'abord à votre fournisseur de services de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres."</item> + <item msgid="3910386316304772394">"Pour effectuer des appels et envoyer des messages par Wi-Fi, demandez tout d\'abord à votre fournisseur de services de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres. (Code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Inscrivez-vous auprès de votre fournisseur de services"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Réseau Wi-Fi ouvert à proximité</item> <item quantity="other">Réseaux Wi-Fi ouverts à proximité</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Connectez-vous pour ouvrir un réseau Wi-Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connexion en cours au réseau Wi-Fi ouvert…"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Touchez pour afficher tous les réseaux"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connexion"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tous les réseaux"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Connectez-vous au réseau Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Connectez-vous au réseau"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 58a5455744ae..f1e693d02a33 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"To"</string> <string name="petabyteShort" msgid="5637816680144990219">"Po"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> jours"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> j et <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h et <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min et <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sans nom>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Aucun numéro de téléphone)"</string> <string name="unknownName" msgid="6867811765370350269">"Inconnu"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Aucun service vocal/d\'urgence"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Momentanément non proposé par le réseau mobile à votre position"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossible d\'accéder au réseau"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Pour améliorer la réception, essayez de modifier le type sélectionné sous Paramètres > Réseau et Internet > Réseaux mobiles > Type de réseau préféré."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertes"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Transfert d\'appel"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode de rappel d\'urgence"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Recherche des services disponibles"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Appels Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Pour effectuer des appels et envoyer des messages via le Wi-Fi, demandez tout d\'abord à votre opérateur de configurer ce service. Réactivez ensuite les appels Wi-Fi dans les paramètres."</item> + <item msgid="3910386316304772394">"Pour passer des appels et envoyer des messages via le Wi-Fi, demandez d\'abord à votre opérateur de configurer ce service. Ensuite, réactivez les appels Wi-Fi dans les paramètres. (Code d\'erreur : <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Inscrivez-vous auprès de votre opérateur."</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Réseau Wi-Fi ouvert disponible</item> <item quantity="other">Réseaux Wi-Fi ouverts disponibles</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Se connecter pour ouvrir le réseau Wi-Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connexion pour ouvrir un réseau Wi-Fi…"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Appuyer pour afficher tous les réseaux"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Se connecter"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tous les réseaux"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Connectez-vous au réseau Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Se connecter au réseau"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index e8359a8b3b47..c45b7a97905c 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> días"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> día <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> segundos"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> segundo"</string> <string name="untitled" msgid="4638956954852782576">"<Sen título>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Sen número de teléfono)"</string> <string name="unknownName" msgid="6867811765370350269">"Descoñecido"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Non hai servizo de chamadas de emerxencia nin de voz"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"A rede de telefonía móbil non ofrece o servizo na túa localización temporalmente"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Non se pode conectar coa rede"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para mellorar a recepción, proba a cambiar o tipo seleccionado en Configuración > Rede e Internet > Redes de telefonía móbil > Tipo de rede preferido."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Desvío de chamadas"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de devolución de chamadas de emerxencia"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Buscando servizo"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas por wifi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Para facer chamadas e enviar mensaxes a través da wifi, primeiro pídelle ao teu operador que configure este servizo. A continuación, activa de novo as chamadas wifi en Configuración."</item> + <item msgid="3910386316304772394">"Para facer chamadas e enviar mensaxes a través da wifi, primeiro solicítalle ao operador que configure este servizo. Despois, activa de novo as chamadas por wifi en Configuración. (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Rexístrate co teu operador"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Abrir redes wifi dispoñibles</item> <item quantity="one">Abrir rede wifi dispoñible</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Conéctate a unha rede wifi aberta"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose á rede wifi aberta"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectouse á rede wifi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Non se puido conectar á rede wifi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toca para ver todas as redes"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectarse"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas as redes"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Inicia sesión na rede wifi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Inicia sesión na rede"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index 0e4a77bf094e..bd4789ad0e43 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> દિવસ <xliff:g id="HOURS">%2$d</xliff:g> કલાક"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> કલાક"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> કલાક <xliff:g id="MINUTES">%2$d</xliff:g> મિનિટ"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> કલાક <xliff:g id="MINUTES">%2$d</xliff:g> મિનિટ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> મિનિટ"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> મિનિટ"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> મિનિટ <xliff:g id="SECONDS">%2$d</xliff:g> સેકંડ"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> મિ <xliff:g id="SECONDS">%2$d</xliff:g> સે"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> સેકંડ"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> સેકંડ"</string> <string name="untitled" msgid="4638956954852782576">"<અનામાંકિત>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(કોઈ ફોન નંબર નથી)"</string> <string name="unknownName" msgid="6867811765370350269">"અજાણ્યું"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"કોઈ વૉઇસ/કટોકટીની સેવા નથી"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"તમારા સ્થળે મોબાઇલ નેટવર્ક દ્વારા અસ્થાયીરૂપે ઑફર કરવામાં આવતી નથી"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"નેટવર્ક પર પહોંચી શકાતું નથી"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"રિસેપ્શનને બહેતર બનાવવા માટે, સેટિંગ્સ > નેટવર્ક અને ઇન્ટરનેટ > મોબાઇલ નેટવર્ક > પસંદગીના નેટવર્ક પ્રકાર પર પસંદ કરેલ પ્રકાર બદલવાનો પ્રયાસ કરો."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"ચેતવણીઓ"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"કૉલ ફૉર્વર્ડિંગ"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"કટોકટી કૉલબૅક મોડ"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"સેવા શોધી રહ્યું છે"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi કૉલિંગ"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi પર કૉલ્સ કરવા અને સંદેશા મોકલવા માટે, પહેલા તમારા કેરીઅરને આ સેવા સેટ કરવા માટે કહો. પછી સેટિંગ્સમાંથી Wi-Fi કૉલિંગ ચાલુ કરો."</item> + <item msgid="3910386316304772394">"Wi-Fi પરથી કૉલ કરવા અને સંદેશા મોકલવા માટે પહેલા તમારા કૅરિઅરને આ સેવા સેટ કરવા માટે કહો. પછી સેટિંગ્સમાંથી Wi-Fi કૉલિંગ ફરીથી ચાલુ કરો. (ભૂલ કોડ: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"તમારા કેરીઅર સાથે નોંધણી કરો"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">ખુલ્લા Wi-Fi નેટવર્ક્સ ઉપલબ્ધ છે</item> <item quantity="other">ખુલ્લા Wi-Fi નેટવર્ક્સ ઉપલબ્ધ છે</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"ખુલ્લા Wi‑Fi નેટવર્ક સાથે કનેક્ટ કરો"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ખુલ્લા Wi‑Fi નેટવર્ક સાથે કનેક્ટ કરી રહ્યાં છીએ"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi નેટવર્ક સાથે કનેક્ટ કર્યુ"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi નેટવર્ક સાથે કનેક્ટ કરી શકાયું નથી"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"બધા નેટવર્ક જોવા ટૅપ કરો"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"કનેક્ટ કરો"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"બધા નેટવર્ક"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi નેટવર્ક પર સાઇન ઇન કરો"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"નેટવર્ક પર સાઇન ઇન કરો"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index c5e532fce801..7baa83baf214 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटे"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन <xliff:g id="HOURS">%2$d</xliff:g> घंटा"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> घंटे"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> घं. <xliff:g id="MINUTES">%2$d</xliff:g> मि."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनट"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनट"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मि. <xliff:g id="SECONDS">%2$d</xliff:g> से."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंड"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंड"</string> <string name="untitled" msgid="4638956954852782576">"<शीर्षक-रहित>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(कोई फ़ोन नंबर नहीं)"</string> <string name="unknownName" msgid="6867811765370350269">"अज्ञात"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कोई वॉइस/आपातकालीन सेवा नहीं है"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"आपके स्थान के मोबाइल नेटवर्क की ओर से इस समय ऑफ़र नहीं किया जा रहा है"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्क तक नहीं पहुंच पा रहे हैं"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"रिसेप्शन बेहतर करने के लिए, सेटिंग > नेटवर्क और इंटरनेट > मोबाइल नेटवर्क > पसंदीदा नेटवर्क प्रकार पर जाकर, चुना गया प्रकार बदलकर देखें."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"सूचनाएं"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल अग्रेषण"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपातकालीन कॉलबैक मोड"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"सेवा खोज रहा है"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"वाई-फ़ाई कॉलिंग"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"वाई-फ़ाई से कॉल करने और संदेश भेजने के लिए, सबसे पहले अपने वाहक से इस सेवा को सेट करने के लिए कहें. उसके बाद सेटिंग से पुन: वाई-फ़ाई कॉलिंग चालू करें."</item> + <item msgid="3910386316304772394">"वाई-फ़ाई से कॉल करने और संदेश भेजने के लिए, सबसे पहले अपने वाहक से इस सेवा को सेट करने के लिए कहें. उसके बाद सेटिंग से वाई-फ़ाई कॉलिंग को दोबारा चालू करें. (गड़बड़ी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"अपने वाहक के साथ पंजीकृत करें"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">खुले वाई-फ़ाई नेटवर्क उपलब्ध</item> <item quantity="other">खुले वाई-फ़ाई नेटवर्क उपलब्ध</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"खुले वाई-फ़ाई नेटवर्क से कनेक्ट करें"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुले वाई-फ़ाई नेटवर्क से कनेक्ट हो रहा है"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"वाई-फ़ाई नेटवर्क से कनेक्ट हो गया है"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाई-फ़ाई नेटवर्क से कनेक्ट नहीं हो सका"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सभी नेटवर्क देखने के लिए यहां पर टैप करें"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करें"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"सभी नेटवर्क"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"वाई-फ़ाई नेटवर्क में प्रवेश करें"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"नेटवर्क में प्रवेश करें"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 3d7743bd342f..92d4651a8ec0 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nema telefonskog broja)"</string> <string name="unknownName" msgid="6867811765370350269">"Nepoznato"</string> @@ -96,8 +84,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nema glasovnih i hitnih usluga"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Trenutačno nije u ponudi mobilne mreže na vašoj lokaciji"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Pristup mreži nije moguć"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Za bolji prijem pokušajte promijeniti vrstu odabranu u odjeljku Postavke > Mreža i internet > Mobilne mreže > Preferirana vrsta mreže."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozorenja"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmjeravanje poziva"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način hitnog povratnog poziva"</string> @@ -133,7 +120,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Pretraživanje usluge"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi pozivi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Da biste telefonirali i slali pozive putem Wi-Fi-ja, morate tražiti od mobilnog operatera da vam postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozive u Postavkama."</item> + <item msgid="3910386316304772394">"Da biste telefonirali i slali poruke putem Wi-Fi-ja, od mobilnog operatera morate tražiti da postavi tu uslugu. Zatim ponovo uključite Wi-Fi pozive u postavkama. (Kôd pogreške: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrirajte se kod mobilnog operatera"</item> @@ -1129,6 +1116,13 @@ <item quantity="few">Dostupne su otvorene Wi-Fi mreže</item> <item quantity="other">Dostupne su otvorene Wi-Fi mreže</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Povezivanje s otvorenom Wi‑Fi mrežom"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezivanje s otvorenom Wi‑Fi mrežom"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezano s Wi-Fi mrežom"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije uspjelo povezivanje s Wi-Fi mrežom"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dodirnite za prikaz svih mreža"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Poveži"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Sve mreže"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prijava na Wi-Fi mrežu"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Prijava na mrežu"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 51c111c78417..107581c50849 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> nap"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> nap <xliff:g id="HOURS">%2$d</xliff:g> óra"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> óra"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> óra <xliff:g id="MINUTES">%2$d</xliff:g> perc"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> perc"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> perc"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> perc <xliff:g id="SECONDS">%2$d</xliff:g> mp"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> másodperc"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> másodperc"</string> <string name="untitled" msgid="4638956954852782576">"<Névtelen>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nincs telefonszám)"</string> <string name="unknownName" msgid="6867811765370350269">"Ismeretlen"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hang- és segélyszolgáltatás letiltva"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Az Ön tartózkodási helyén ideiglenesen nem áll rendelkezésre a mobilhálózaton"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"A hálózat nem érhető el"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"A vétel javítása érdekében próbálja módosítani a kiválasztott hálózattípust a Beállítások > Hálózat és internet > Mobilhálózatok > Preferált hálózattípus menüpontban."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Értesítések"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Hívásátirányítás"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Sürgősségi visszahívás mód"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Szolgáltatás keresése"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-hívás"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Ha Wi-Fi-n szeretne telefonálni és üzenetet küldeni, kérje meg szolgáltatóját, hogy állítsa be ezt a szolgáltatást. Ezután a Beállítások menüben kapcsolhatja be újra a Wi-Fi-hívást."</item> + <item msgid="3910386316304772394">"Ha Wi-Fi-hálózaton szeretne telefonálni és üzenetet küldeni, kérje meg szolgáltatóját, hogy állítsa be ezt a szolgáltatást. Ezután kapcsolja be újra a Wi-Fi-hívást a Beállításokban. (Hibakód: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Regisztráljon a szolgáltatójánál"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Nyílt Wi-Fi hálózatok érhetők el</item> <item quantity="one">Nyílt Wi-Fi hálózat érhető el</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Nyílt Wi-Fi-hálózathoz kapcsolódhat"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kapcsolódás nyílt Wi‑Fi-hálózathoz…"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Sikeres kapcsolódás a Wi-Fi-hálózathoz"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nem sikerült kapcsolódni a Wi‑Fi-hálózathoz"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Koppintással megjelenítheti az összes hálózatot"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Kapcsolódás"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Összes hálózat"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Bejelentkezés Wi-Fi hálózatba"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Bejelentkezés a hálózatba"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 01a6faebfd68..9c5b1e090d8b 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"ՏԲ"</string> <string name="petabyteShort" msgid="5637816680144990219">"Պբ"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> օր"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> օր <xliff:g id="HOURS">%2$d</xliff:g> ժ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ժ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ժ <xliff:g id="MINUTES">%2$d</xliff:g> ր"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> րոպե"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> րոպե"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ր <xliff:g id="SECONDS">%2$d</xliff:g> վ"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> վ"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> վ"</string> <string name="untitled" msgid="4638956954852782576">"<Անանուն>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Հեռախոսահամար չկա)"</string> <string name="unknownName" msgid="6867811765370350269">"Անհայտ"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ձայնային/արտակարգ իրավիճակների ծառայությունն անհասանելի է"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Ձեր գտնվելու վայրում ծառայությունը ժամանակավորապես չի տրամադրվում բջջային ցանցի կողմից"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ցանցն անհասանելի է"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ազդանշանի ընդունման որակը բարելավելու համար փոխեք ցանցի տեսակը՝ անցնելով Համակարգ > Ցանց և ինտերնետ > Բջջային ցանցեր > Ցանկալի ցանցի տեսակը։"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ծանուցումներ"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Զանգի վերահասցեավորում"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Շտապ հետկանչի ռեժիմ"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Ծառայության որոնում..."</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Զանգեր Wi-Fi-ի միջոցով"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi-ի միջոցով զանգեր կատարելու և հաղորդագրություններ ուղարկելու համար նախ դիմեք ձեր օպերատորին՝ ծառայությունը կարգավորելու համար: Ապա նորից միացրեք Wi-Fi զանգերը Կարգավորումներում:"</item> + <item msgid="3910386316304772394">"Wi-Fi-ի միջոցով զանգեր կատարելու և հաղորդագրություններ ուղարկելու համար նախ դիմեք ձեր օպերատորին՝ այս ծառայությունը կարգավորելու համար: Այնուհետև նորից միացրեք «Զանգեր Wi-Fi-ի միջոցով» ընտրանքը Կարգավորումներից: (Սխալի կոդ՝ <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Գրանցվեք օպերատորի մոտ"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Հասանելի են չպաշտպանված Wi-Fi ցանցեր</item> <item quantity="other">Հասանելի են չպաշտպանված Wi-Fi ցանցեր</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Միացեք բաց Wi‑Fi ցանցին"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Միացում բաց Wi‑Fi ցանցին"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Միացել է Wi‑Fi ցանցին"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Չհաջողվեց միանալ Wi‑Fi ցանցին"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Հպեք՝ բոլոր ցանցերը տեսնելու համար"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Միանալ"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Բոլոր ցանցերը"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Մուտք գործեք Wi-Fi ցանց"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Մուտք գործեք ցանց"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 42c612888980..f6fcef7c6e66 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> jam"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> mnt"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> menit"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> mnt <xliff:g id="SECONDS">%2$d</xliff:g> dtk"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> dtk"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> dtk"</string> <string name="untitled" msgid="4638956954852782576">"<Tanpa judul>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Tidak ada nomor telepon)"</string> <string name="unknownName" msgid="6867811765370350269">"Tidak diketahui"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tidak ada layanan panggilan suara/darurat"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Untuk sementara tidak ditawarkan oleh jaringan seluler di lokasi Anda"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat menjangkau jaringan"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Untuk menyempurnakan penerimaan sinyal, coba ubah jenis yang dipilih di Setelan > Jaringan & Internet > Jaringan seluler > Jenis jaringan pilihan."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Notifikasi"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Penerusan panggilan"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mode panggilan balik darurat"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Mencari layanan"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Panggilan Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Untuk melakukan panggilan telepon dan mengirim pesan melalui Wi-Fi, terlebih dahulu minta operator untuk menyiapkan layanan ini. Lalu, aktifkan lagi panggilan telepon Wi-Fi dari Setelan."</item> + <item msgid="3910386316304772394">"Untuk menelepon dan mengirim pesan melalui Wi-Fi, tanyalah ke operator Anda terlebih dahulu untuk menyiapkan layanan ini. Kemudian, aktifkan kembali panggilan Wi-Fi dari Setelan. (Kode error: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Harap daftarkan ke operator"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Jaringan Wi-Fi terbuka tersedia</item> <item quantity="one">Jaringan Wi-Fi terbuka tersedia</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Hubungkan ke jaringan Wi-Fi terbuka"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Menghubungkan ke jaringan Wi-Fi terbuka"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Terhubung ke jaringan Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menghubungkan ke jaringan Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tap untuk melihat semua jaringan"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Hubungkan"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Semua Jaringan"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Masuk ke jaringan Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Masuk ke jaringan"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 6acc12e6eec1..2c0fb3b60414 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> klst."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> klst."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> k. <xliff:g id="MINUTES">%2$d</xliff:g> mín."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> k. <xliff:g id="MINUTES">%2$d</xliff:g> mín."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> mín."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> mín."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> m. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> m. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> <string name="untitled" msgid="4638956954852782576">"<Ónefnt>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ekkert símanúmer)"</string> <string name="unknownName" msgid="6867811765370350269">"Óþekkt"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Símtöl/neyðarsímtöl eru ekki í boði"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Ekki í boði á farsímakerfinu á þínum stað eins og er"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ekki næst samband við símkerfi"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Reyndu að breyta valinni gerð í Stillingar > Netkerfi og internet > Farsímakerfi > Valin símkerfistegund til að bæta móttökuskilyrðin."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Tilkynningar"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Símtalsflutningur"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Stilling fyrir svarhringingu neyðarsímtala"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Leitar að þjónustu"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi símtöl"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Til að hringja og senda skilaboð yfir Wi-Fi þarftu fyrst að biðja símafyrirtækið þitt um að setja þá þjónustu upp. Kveiktu síðan á Wi-Fi símtölum í stillingunum."</item> + <item msgid="3910386316304772394">"Til að hringja og senda skilaboð yfir Wi-Fi þarftu fyrst að biðja símafyrirtækið þitt um að setja þá þjónustu upp. Kveiktu síðan á Wi-Fi símtölum í stillingunum. (Villukóði: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Skráðu þig hjá símafyrirtækinu"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Opin Wi-Fi net í boði</item> <item quantity="other">Opin Wi-Fi net í boði</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Tengjast opnu Wi-Fi neti"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Tengist opnu Wi‑Fi neti"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Tengt við Wi‑Fi net"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ekki hægt að tengjast Wi-Fi neti"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ýttu til að sjá öll netkerfi"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Tengjast"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Öll netkerfi"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Skrá inn á Wi-Fi net"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Skrá inn á net"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 7cf051ae54ee..f14b65b28a5e 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> giorni"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ore"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> giorno <xliff:g id="HOURS">%2$d</xliff:g> ora"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ore"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuti"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ora <xliff:g id="MINUTES">%2$d</xliff:g> minuto"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuti"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondi"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> minuto <xliff:g id="SECONDS">%2$d</xliff:g> secondo"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> secondi"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> secondo"</string> <string name="untitled" msgid="4638956954852782576">"<Senza nome>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nessun numero di telefono)"</string> <string name="unknownName" msgid="6867811765370350269">"Sconosciuto"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nessun servizio di telefonia/emergenza"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Servizio temporaneamente non offerto dalla rete mobile nella tua località"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Impossibile raggiungere la rete"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Per migliorare la ricezione, prova a modificare il tipo selezionato in Impostazioni > Rete e Internet > Reti mobili > Tipo di rete preferito."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Avvisi"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Deviazione chiamate"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modalità di richiamata di emergenza"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Ricerca servizio"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chiamate Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Per effettuare chiamate e inviare messaggi tramite Wi-Fi, è necessario prima chiedere all\'operatore telefonico di attivare il servizio. Successivamente, riattiva le chiamate Wi-Fi dalle Impostazioni."</item> + <item msgid="3910386316304772394">"Per effettuare chiamate e inviare messaggi tramite Wi-Fi, chiedi prima al tuo operatore di impostare questo servizio. Dopodiché, attiva di nuovo la funzione Chiamate Wi-Fi nelle impostazioni. (Codice di errore: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrati con il tuo operatore"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Apri reti Wi-Fi disponibili</item> <item quantity="one">Apri rete Wi-Fi disponibile</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Stabilisci la connessione per aprire la rete Wi‑Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connessione per aprire la rete Wi‑Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Connessione alla rete Wi-Fi stabilita"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossibile connettersi alla rete Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tocca per vedere tutte le reti"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Connetti"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tutte le reti"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Accedi a rete Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Accedi alla rete"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> @@ -1370,7 +1364,7 @@ <string name="action_menu_overflow_description" msgid="2295659037509008453">"Altre opzioni"</string> <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string> <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string> - <string name="storage_internal" msgid="3570990907910199483">"Archivio condiviso interno"</string> + <string name="storage_internal" msgid="3570990907910199483">"Memoria condivisa interna"</string> <string name="storage_sd_card" msgid="3282948861378286745">"Scheda SD"</string> <string name="storage_sd_card_label" msgid="6347111320774379257">"Scheda SD <xliff:g id="MANUFACTURER">%s</xliff:g>"</string> <string name="storage_usb_drive" msgid="6261899683292244209">"Unità USB"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 57c0ba38eff5..5a3de37b73f4 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ימים"</string> - <string name="durationDayHours" msgid="2713107458736744435">"יום <xliff:g id="DAYS">%1$d</xliff:g> <xliff:g id="HOURS">%2$d</xliff:g> שע\'"</string> - <string name="durationDayHour" msgid="7293789639090958917">"יום <xliff:g id="DAYS">%1$d</xliff:g> שעה <xliff:g id="HOURS">%2$d</xliff:g>"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> שעות"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"שעה <xliff:g id="HOURS">%1$d</xliff:g> <xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> שעות <xliff:g id="MINUTES">%2$d</xliff:g> דק\'"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> דקות"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> דקות"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> <xliff:g id="SECONDS">%2$d</xliff:g> שנ\'"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"דקה <xliff:g id="MINUTES">%1$d</xliff:g> שנ\' <xliff:g id="SECONDS">%2$d</xliff:g>"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> שניות"</string> - <string name="durationSecond" msgid="985669622276420331">"שנייה <xliff:g id="SECONDS">%1$d</xliff:g>"</string> <string name="untitled" msgid="4638956954852782576">">ללא כותרת<"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(אין מספר טלפון)"</string> <string name="unknownName" msgid="6867811765370350269">"לא ידוע"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"אין אפשרות לבצע שיחות חירום ושיחות קוליות רגילות"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"הרשת הסלולרית במיקום הזה חסמה את השירות באופן זמני"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"לא ניתן להתחבר לרשת"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"כדי לשפר את הקליטה, כדאי לנסות לשנות את סוג הרשת ב\'הגדרות\' > \'רשת ואינטרנט\' > \'רשתות סלולריות\' > \'סוג רשת מועדף\'."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"התראות"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"העברת שיחות"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"מצב \'התקשרות חזרה בחירום\'"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"מחפש שירות"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"שיחות ב-Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב התקשרות Wi-Fi מ\'הגדרות\'."</item> + <item msgid="3910386316304772394">"כדי להתקשר ולשלוח הודעות ברשת Wi-Fi, תחילה יש לבקש מהספק להגדיר את השירות. לאחר מכן, יש להפעיל שוב שיחות Wi-Fi ב\'הגדרות\'. (קוד שגיאה: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"הירשם אצל הספק"</item> @@ -1151,6 +1138,13 @@ <item quantity="other">יש רשתות Wi-Fi פתוחות וזמינות</item> <item quantity="one">יש רשת Wi-Fi פתוחה וזמינה</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"התחברות לרשת Wi‑Fi פתוחה"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"מתחבר לרשת Wi‑Fi פתוחה"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"מחובר לרשת Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"לא ניתן היה להתחבר לרשת Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"יש להקיש כדי לראות את כל הרשתות"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"התחבר"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"כל הרשתות"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"היכנס לרשת Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"היכנס לרשת"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index f7de291819cf..b2374390e610 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>日"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>日<xliff:g id="HOURS">%2$d</xliff:g>時間"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>時間"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>時間<xliff:g id="MINUTES">%2$d</xliff:g>分"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g>分"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> <string name="untitled" msgid="4638956954852782576">"<新規>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(電話番号なし)"</string> <string name="unknownName" msgid="6867811765370350269">"不明"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"音声通話 / 緊急通報サービス停止"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"現在地のモバイル ネットワークでは一時的に提供されていません"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ネットワークにアクセスできません"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"受信状態を改善するには、[設定] > [ネットワークとインターネット] > [モバイル ネットワーク] > [優先ネットワーク タイプ] で選択したタイプを変更してみてください。"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"電話の転送"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急通報待機モード"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"サービスを検索中"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi通話"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社にWi-Fiサービスを申し込んだ上で、設定画面でWi-Fi発信を再度ONにしてください。"</item> + <item msgid="3910386316304772394">"Wi-Fi 経由で音声通話の発信やメッセージの送信を行うには、携帯通信会社に Wi-Fi サービスを申し込んだ上で、設定画面で Wi-Fi 発信を再度 ON にしてください(エラーコード: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"携帯通信会社に登録してください"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">複数のWi-Fiオープンネットワークが利用できます</item> <item quantity="one">Wi-Fiオープンネットワークが利用できます</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Wi-Fi オープン ネットワークに接続"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Wi-Fi オープン ネットワークに接続しています"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ネットワークに接続しました"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ネットワークに接続できませんでした"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"すべてのネットワークを表示するにはタップします"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"接続"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"すべてのネットワーク"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fiネットワークにログイン"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ネットワークにログインしてください"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 5e5b43ee2c56..af653bd9aff5 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"ტბაიტი"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> დღე"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> დღე <xliff:g id="HOURS">%2$d</xliff:g> სთ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> სთ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> სთ <xliff:g id="MINUTES">%2$d</xliff:g> წთ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> წთ <xliff:g id="SECONDS">%2$d</xliff:g> წმ"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> წმ"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> წმ"</string> <string name="untitled" msgid="4638956954852782576">"უსათაურო"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ტელეფონის ნომრის გარეშე)"</string> <string name="unknownName" msgid="6867811765370350269">"უცნობი"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ხმოვანი/გადაუდებელი ზარების სერვისი არ არის"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"დროებით არ არის შემოთავაზებული მობილური ქსელის მიერ თქვენს მდებარეობაზე"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ქსელთან დაკავშირება ვერ ხერხდება"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"მიღების გასაუმჯობესებლად ცადეთ არჩეული ტიპის შეცვლა აქ: პარამეტრები > ქსელი და ინტერნეტი > მობილური ქსელები > ქსელის სასურველი ტიპი."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"გაფრთხილებები"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"ზარის გადამისამართება"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"გადაუდებელი გადმორეკვის რეჟიმი"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"სერვისის ძიება"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"დარეკვა Wi-Fi-ს მეშვეობით"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi-ს მეშვეობით ზარების განხორციელების ან შეტყობინების გაგზავნისათვის, პირველ რიგში დაეკითხეთ თქვენს ოპერატორს აღნიშნულ მომსახურებაზე. შემდეგ ხელახლა ჩართეთ Wi-Fi ზარები პარამეტრებიდან."</item> + <item msgid="3910386316304772394">"Wi-Fi-ს მეშვეობით ზარების განსახორციელებლად ან შეტყობინებების გასაგზავნად, პირველ რიგში, ამ სერვისის გააქტიურება თქვენს ოპერატორს უნდა თხოვოთ. შემდეგ კი ხელახლა ჩართეთ Wi-Fi დარეკვა პარამეტრებიდან.. (შეცდომის კოდი: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"დაარეგისტრირეთ თქვენი ოპერატორი"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">ხელმისაწვდომია ღია Wi-Fi ქსელები</item> <item quantity="one">ხელმისაწვდომია ღია Wi-Fi ქსელი</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"დაუკავშირდით ღია Wi‑Fi ქსელს"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"მიმდინარეობს ღია Wi‑Fi ქსელთან დაკავშირება"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ქსელთან დაკავშირება წარმატებით მოხერხდა"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ქსელთან დაკავშირება ვერ მოხერხდა"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"შეეხეთ ყველა ქსელის სანახავად"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"დაკავშირება"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ყველა ქსელი"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi ქსელთან დაკავშირება"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ქსელში შესვლა"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index bc9a79e65ebe..e185552de2d2 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> сағ."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> сағ."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> сағ. <xliff:g id="MINUTES">%2$d</xliff:g> м."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> сағ. <xliff:g id="MINUTES">%2$d</xliff:g> м."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string> <string name="untitled" msgid="4638956954852782576">"<Атаусыз>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Телефон нөмірі жоқ)"</string> <string name="unknownName" msgid="6867811765370350269">"Белгісіз"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дауыстық/жедел қызметке қоңыраулар қызметі жоқ"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Орналасқан аймағыңызда мобильдік желі уақытша ұсынбады"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Желіге қосылу мүмкін емес"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Қабылдауды жақсарту үшін \"Параметрлер > Желі және интернет > Мобильді желілер және қалаулы желі түрі\" тармағынан түрді өзгертіп көріңіз."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Дабылдар"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Қоңырауды басқа нөмірге бағыттау"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шұғыл кері қоңырау шалу режимі"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Қызметті іздеу"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi қоңыраулары"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi арқылы қоңырау шалу және хабарларды жіберу үшін алдымен жабдықтаушыңыздан осы қызметті орнатуды сұраңыз. Содан кейін Параметрлерден Wi-Fi қоңырау шалуын іске қосыңыз."</item> + <item msgid="3910386316304772394">"Wi-Fi арқылы қоңырау шалу немесе хабарлар жіберу үшін, алдымен операторыңыздан құрылғыны реттеуді сұраңыз. Содан кейін \"Параметрлер\" бөлімінен Wi-Fi қоңырауларын қайта қосыңыз. (Қате коды: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Жабдықтаушыңыз арқылы тіркелу"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Ашық Wi-Fi желілері қол жетімді</item> <item quantity="one">Ашық Wi-Fi желісі қол жетімді</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Ашық Wi‑Fi желісіне қосылу"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ашық Wi‑Fi желісіне қосылуда"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi желісіне қосылды"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi желісіне қосылмады"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Барлық желілерді көру үшін түртіңіз"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Қосылу"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Барлық желілер"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi желісіне кіру"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Желіге кіру"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index c2d6bec49edd..3843daa7c90b 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"តេរ៉ាបៃ"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ថ្ងៃ <xliff:g id="HOURS">%2$d</xliff:g> ម៉ោង"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ម៉ោង <xliff:g id="MINUTES">%2$d</xliff:g> នាទី"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> នាទី"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> នាទី"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>នាទី <xliff:g id="SECONDS">%2$d</xliff:g>វិនាទី"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> វិនាទី"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> វិនាទី"</string> <string name="untitled" msgid="4638956954852782576">"<គ្មានចំណងជើង>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(គ្មានលេខទូរស័ព្ទ)"</string> <string name="unknownName" msgid="6867811765370350269">"មិនស្គាល់"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"គ្មានសេវាកម្មសំឡេង/សង្រ្គោះបន្ទាន់ទេ"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"មិនបានផ្តល់ជូនដោយបណ្តាញចល័តនៅទីកន្លែងរបស់អ្នកជាបណ្តោះអាសន្ន"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"មិនអាចភ្ជាប់ទៅបណ្តាញបានទេ"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ដើម្បីធ្វើឲ្យការទទួលរលកសញ្ញាប្រសើរជាងមុន សូមសាកល្បងប្តូរប្រភេទដែលបានជ្រើសរើសនៅ ការកំណត់ > បណ្តាញ និងអ៊ីនធឺណិត > បណ្តាញទូរសព្ទចល័ត > ប្រភេទបណ្តាញដែលចង់ប្រើ។"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"ការជូនដំណឹង"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"ការបញ្ជូនការហៅទូរសព្ទបន្ត"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"មុខងារហៅត្រឡប់វិញបន្ទាន់"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"ស្វែងរកសេវាកម្ម"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ការហៅតាម Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"ដើម្បីធ្វើការហៅ និងផ្ញើសារតាម Wi-Fi ដំបូងឡើយអ្នកត្រូវស្នើឲ្យក្រុមហ៊ុនរបស់អ្នកដំឡើងសេវាកម្មនេះសិន។ បន្ទាប់មកបើកការហៅតាម Wi-Fi ម្តងទៀតចេញពីការកំណត់។"</item> + <item msgid="3910386316304772394">"ដើម្បីធ្វើការហៅ និងផ្ញើសារតាម Wi-Fi អ្នកត្រូវស្នើឲ្យក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នកដំឡើងសេវាកម្មនេះជាមុនសិន។ បន្ទាប់មកបើកការហៅតាម Wi-Fi ម្តងទៀតនៅក្នុងការកំណត់។ (លេខកូដបញ្ហា៖ <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"ចុះឈ្មោះជាមួយក្រុមហ៊ុនរបស់អ្នក"</item> @@ -1109,6 +1096,13 @@ <item quantity="other">បើកបណ្តាញ Wi-Fi ដែលមាន</item> <item quantity="one">បើកបណ្តាញ Wi-Fi ដែលមាន</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"ភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"កំពុងភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"បានភ្ជាប់ទៅបណ្តាញ Wi‑Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"មិនអាចភ្ជាប់ទៅបណ្តាញ Wi‑Fi បានទេ"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ចុចដើម្បីមើលបណ្តាញទាំងអស់"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"ភ្ជាប់"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"បណ្តាញទាំងអស់"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ចូលបណ្ដាញវ៉ាយហ្វាយ"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ចូលទៅបណ្តាញ"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 16342d09cb6c..8d3db2098240 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನಗಳು"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂಟೆಗಳು"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ದಿನ <xliff:g id="HOURS">%2$d</xliff:g> ಗಂ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆಗಳು"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆ <xliff:g id="MINUTES">%2$d</xliff:g> ನಿಮಿಷಗಳು"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ಗಂಟೆ <xliff:g id="MINUTES">%2$d</xliff:g> ನಿಮಿಷ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿಷಗಳು"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿಷ"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿ <xliff:g id="SECONDS">%2$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ನಿಮಿ <xliff:g id="SECONDS">%2$d</xliff:g> ಸೆ"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ಸೆಕೆಂಡುಗಳು"</string> <string name="untitled" msgid="4638956954852782576">"<ಶೀರ್ಷಿಕೆ ರಹಿತ>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ಯಾವುದೇ ಫೋನ್ ಸಂಖ್ಯೆಯಿಲ್ಲ)"</string> <string name="unknownName" msgid="6867811765370350269">"ಅಪರಿಚಿತ"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ಧ್ವನಿ/ತುರ್ತು ಸೇವೆ ಇಲ್ಲ"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"ತಾತ್ಕಾಲಿಕವಾಗಿ ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ನಿಂದ ನಿಮ್ಮ ಸ್ಥಳದಲ್ಲಿ ಒದಗಿಸುತ್ತಿಲ್ಲ"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ನೆಟ್ವರ್ಕ್ ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ನೆಟ್ವರ್ಕ್ ಸಂಪರ್ಕ ಪಡೆಯುವುದನ್ನು ಸುಧಾರಿಸಲು, ಆಯ್ಕೆ ಮಾಡಿರುವ ವಿಧವನ್ನು ಸೆಟ್ಟಿಂಗ್ಗಳು > ನೆಟ್ವರ್ಕ್ ಮತ್ತು ಇಂಟರ್ನೆಟ್ > ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ಗಳು > ಆದ್ಯತೆಯ ನೆಟ್ವರ್ಕ್ ವಿಧದಲ್ಲಿ ಬದಲಿಸಿ ನೋಡಿ."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"ಎಚ್ಚರಿಕೆಗಳು"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"ಕರೆ ಫಾರ್ವರ್ಡ್ ಮಾಡುವಿಕೆ"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ತುರ್ತು ಕಾಲ್ಬ್ಯಾಕ್ ಮೋಡ್"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"ಸೇವೆ ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"ವೈ-ಫೈ ಬಳಸಿಕೊಂಡು ಕರೆ ಮಾಡಲು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು, ಮೊದಲು ಈ ಸಾಧನವನ್ನು ಹೊಂದಿಸಲು ನಿಮ್ಮ ವಾಹಕವನ್ನು ಕೇಳಿ. ತದನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಮತ್ತೆ ವೈ-ಫೈ ಆನ್ ಮಾಡಿ."</item> + <item msgid="3910386316304772394">"ವೈ-ಫೈ ಮೂಲಕ ಕರೆಗಳನ್ನು ಮಾಡಲು ಮತ್ತು ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಲು, ಈ ಸೇವೆಯನ್ನು ಹೊಂದಿಸಲು ಮೊದಲು ನಿಮ್ಮ ವಾಹಕವನ್ನು ಕೇಳಿ. ಆ ನಂತರ ಸೆಟ್ಟಿಂಗ್ಗಳಿಂದ ವೈ-ಫೈ ಕರೆಮಾಡುವಿಕೆಯನ್ನು ಅನ್ನು ಆನ್ ಮಾಡಿ. (ದೋಷ ಕೋಡ್: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"ನಿಮ್ಮ ವಾಹಕದಲ್ಲಿ ನೋಂದಾಯಿಸಿಕೊಳ್ಳಿ"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿವೆ</item> <item quantity="other">ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿವೆ</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ಮುಕ್ತ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗುತ್ತಿದೆ"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ಗಳನ್ನು ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"ಸಂಪರ್ಕಿಸಿ"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ಎಲ್ಲಾ ನೆಟ್ವರ್ಕ್ಗಳು"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ನೆಟ್ವರ್ಕ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 38fe6a7dcf6d..497cfe914f56 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g><xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>일"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>일 <xliff:g id="HOURS">%2$d</xliff:g>시간"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>시간"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>시간 <xliff:g id="MINUTES">%2$d</xliff:g>분"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>분"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g>분"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>분 <xliff:g id="SECONDS">%2$d</xliff:g>초"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>초"</string> <string name="untitled" msgid="4638956954852782576">"<제목 없음>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(전화번호 없음)"</string> <string name="unknownName" msgid="6867811765370350269">"알 수 없음"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"음성/긴급 서비스를 이용할 수 없음"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"현재 위치에서 모바일 네트워크가 서비스 제공을 일시적으로 중단했습니다."</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"네트워크에 연결할 수 없습니다."</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"수신 상태를 개선하려면 설정 > 네트워크 및 인터넷 > 모바일 네트워크 > 기본 네트워크 유형에서 선택된 유형을 변경해 보세요."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"알림"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"착신전환"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"긴급 콜백 모드"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"서비스 검색 중"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 통화"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 이 기능을 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다."</item> + <item msgid="3910386316304772394">"Wi-Fi를 사용하여 전화를 걸고 메시지를 보내려면 먼저 이동통신사에 문의하여 서비스를 설정해야 합니다. 그런 다음 설정에서 Wi-Fi 통화를 사용 설정하시기 바랍니다. (오류 코드: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"이동통신사에 등록"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">개방형 Wi-Fi 네트워크 사용 가능</item> <item quantity="one">개방형 Wi-Fi 네트워크 사용 가능</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"공개 Wi‑Fi 네트워크에 연결"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"공개 Wi‑Fi 네트워크에 연결 중"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi 네트워크에 연결됨"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi 네트워크에 연결할 수 없음"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"모든 네트워크를 보려면 탭하세요."</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"연결"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"모든 네트워크"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi 네트워크에 로그인"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"네트워크에 로그인"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 475b491c4847..ea01218bac1b 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> күн"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> күн <xliff:g id="HOURS">%2$d</xliff:g> с"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> с"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> с. <xliff:g id="MINUTES">%2$d</xliff:g> мүн"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> саат <xliff:g id="MINUTES">%2$d</xliff:g> мүн"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн. <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мүн. <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> <string name="untitled" msgid="4638956954852782576">"<Баш аты жок>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Телефон номери жок)"</string> <string name="unknownName" msgid="6867811765370350269">"Белгисиз"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Бардык чалуулар жана кызматтар бөгөттөлгөн"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Өзгөчө кырдаалдагы кызматтар сиз жайгашкан жердеги мобилдик тармак тарабынан убактылуу бөгөттөлгөн"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Тармакка туташпай жатат"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Кабыл алуу мүмкүнчүлүгүн жакшыртуу үчүн Жөндөөлөр > Тармак жана Интернет > Мобилдик тармактар > Тандалган тармак бөлүмүнөн тармактын түрүн өзгөртүп көрүңүз."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Эскертүүлөр"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Чалууну башка номерге багыттоо"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Шашылыш кайра чалуу режими"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Кызмат изделүүдө"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Чалуу"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi аркылуу чалууларды аткарып жана билдирүүлөрдү жөнөтүү үчүн адегенде операторуңуздан бул кызматты орнотушун сураныңыз. Андан соң, Жөндөөлөрдөн Wi-Fi чалууну кайра күйгүзүңүз."</item> + <item msgid="3910386316304772394">"Wi-Fi аркылуу чалууларды аткарып жана билдирүүлөрдү жөнөтүү үчүн адегенде байланыш операторуңуздан бул кызматты орнотушун сураныңыз. Андан соң, Жөндөөлөрдөн Wi-Fi чалууну кайра күйгүзүңүз. (Ката коду: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Операторуңузга катталыңыз"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Ачык Wi-Fi тармагы жеткиликтүү</item> <item quantity="one">Ачык Wi-Fi тармагы жеткиликтүү</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Ачык Wi‑Fi тармагына туташуу"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ачык Wi‑Fi тармагына туташууда"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Ачык Wi‑Fi тармагына туташты"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi тармагына туташпай калды"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бардык тармактарды көрүү үчүн басыңыз"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Туташуу"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Бардык тармактар"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi түйүнүнө кирүү"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Тармакка кирүү"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index ab1c18c1f130..9bdfd39d7394 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ມື້ <xliff:g id="HOURS">%2$d</xliff:g> ຊມ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ຊມ <xliff:g id="MINUTES">%2$d</xliff:g> ນທ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ນທ <xliff:g id="SECONDS">%2$d</xliff:g> ວິ"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ວິ"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ວິ"</string> <string name="untitled" msgid="4638956954852782576">"<ບໍ່ມີຊື່>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ບໍ່ມີເບີໂທລະສັບ)"</string> <string name="unknownName" msgid="6867811765370350269">"ບໍ່ຮູ້ຈັກ"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ບໍ່ມີບໍລິການສຽງ/ສຸກເສີນ"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"ເຄືອຂ່າຍຂອງທ່ານບໍ່ໄດ້ໃຫ້ບໍລິການຢູ່ສະຖານທີ່ນີ້ເປັນການຊົ່ວຄາວ"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Can’t reach network"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ເພື່ອປັບປຸງການຮັບສັນຍານ, ໃຫ້ລອງປ່ຽນປະເພດທີ່ເລືອກໄວ້ຢູ່ທີ່ ການຕັ້ງຄ່າ > ເຄືອຂ່າຍ ແລະ ອິນເຕີເນັດ > ເຄືອຂ່າຍມືຖື > ປະເພດເຄືອຂ່າຍທີ່ຕ້ອງການ."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"ການເຕືອນ"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"ການໂອນສາຍ"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ໂໝດໂທກັບສຸກເສີນ"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"ຊອກຫາບໍລິການ"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"ການໂທ Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"ເພື່ອໂທ ແລະສົ່ງຂໍ້ຄວາມຢູ່ເທິງ Wi-Fi, ກ່ອນອື່ນໝົດໃຫ້ຖ້າມຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານ ເພື່ອຕັ້ງການບໍລິການນີ້. ຈາກນັ້ນເປີດການໂທ Wi-Fi ອີກຈາກການຕັ້ງຄ່າ."</item> + <item msgid="3910386316304772394">"ເພື່ອໂທ ແລະ ສົ່ງຂໍ້ຄວາມຜ່ານ Wi-Fi, ໃຫ້ແຈ້ງໃຫ້ຜູ້ໃຫ້ບໍລິການຂອງທ່ານຕັ້ງບໍລິການນີ້. ຈາກນັ້ນເປີດໃຊ້ການໂທ Wi-Fi ອີກຄັ້ງຈາກການຕັ້ງຄ່າ. (ລະຫັດຂໍ້ຜິດພາດ: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"ລົງທະບຽນກັບຜູ້ໃຫ້ບໍລິການເຄືອຂ່າຍຂອງທ່ານ"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">ເປີດເຄືອຂ່າຍ Wi-Fi ທີ່ມີໃຫ້</item> <item quantity="one">ເປີດເຄືອຂ່າຍ Wi-Fi ທີ່ມີໃຫ້</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແບບເປີດ"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ກຳລັງເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"ເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ແລ້ວ"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ບໍ່ສາມາດເຊື່ອມຕໍ່ຫາເຄືອຂ່າຍ Wi‑Fi ໄດ້"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ແຕະເພື່ອເບິ່ງເຄືອຂ່າຍທັງໝົດ"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"ເຊື່ອມຕໍ່"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ເຄືອຂ່າຍທັງໝົດ"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ເຂົ້າສູ່ລະບົບເຄືອຂ່າຍ Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ລົງຊື່ເຂົ້າເຄືອຂ່າຍ"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 989046d363fc..a6aa9c0c11b6 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> val."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> val."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> val. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> sek."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek."</string> <string name="untitled" msgid="4638956954852782576">"<Be pavadinimo>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nėra telefono numerio)"</string> <string name="unknownName" msgid="6867811765370350269">"Nežinoma"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balso skambučių / skambučių pagalbos numeriais paslauga neteikiama"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Laikinai nesiūloma mobiliojo ryšio tinkle jūsų vietovėje"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepavyko pasiekti tinklo"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Kad pagerintumėte ryšį, pabandykite pakeisti tipą, pasirinktą skiltyje „Nustatymai“ > „Tinklas ir internetas“ > „Mobiliojo ryšio tinklai“ > „Pageidaujamas tinklo tipas“."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Įspėjimai"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Skambučio peradresavimas"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Atskambinimo pagalbos numeriu režimas"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Ieškoma paslaugos"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"„Wi-Fi“ skambinimas"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Jei norite skambinti ir siųsti pranešimus „Wi-Fi“ ryšiu, pirmiausia paprašykite operatoriaus nustatyti šią paslaugą. Tada vėl įjunkite skambinimą „Wi-Fi“ ryšiu „Nustatymų“ skiltyje."</item> + <item msgid="3910386316304772394">"Jei norite skambinti ir siųsti pranešimus naudodami „Wi-Fi“, pirmiausia paprašykite operatoriaus nustatyti šią paslaugą. Tada vėl įjunkite „Wi-Fi“ skambinimą skiltyje „Nustatymai“. (Klaidos kodas: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Užregistruokite pas operatorių"</item> @@ -1151,6 +1138,13 @@ <item quantity="many">Pasiekiami atvirieji „Wi-Fi“ tinklai</item> <item quantity="other">Pasiekiami atvirieji „Wi-Fi“ tinklai</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Prisijunkite prie atviro „Wi‑Fi“ tinklo"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Prisijungiama prie atviro „Wi‑Fi“ tinklo"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Prisijungta prie „Wi-Fi“ tinklo"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nepavyko prisijungti prie „Wi‑Fi“ tinklo"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Palieskite, jei norite matyti visus tinklus"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Prisijungti"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Visi tinklai"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prisijungti prie „Wi-Fi“ tinklo"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Prisijungti prie tinklo"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index ed649f76860c..d96ea068fb61 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez nosaukuma>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nav tālruņa numura)"</string> <string name="unknownName" msgid="6867811765370350269">"Nezināms"</string> @@ -96,8 +84,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Balss un ārkārtas izsaukumu pakalpojums nedarbojas"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Pagaidām netiek piedāvāts mobilajā tīklā jūsu atrašanās vietā"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nevar sasniegt tīklu"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Lai uzlabotu uztveršanu, mainiet atlasīto veidu sadaļā Iestatījumi > Tīkls un internets > Mobilie tīkli > Ieteicamais tīkla veids."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Brīdinājumi"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Zvanu pāradresācija"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Ārkārtas atzvana režīms"</string> @@ -133,7 +120,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Pakalpojuma meklēšana"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi zvani"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Lai veiktu zvanus un sūtītu īsziņas Wi-Fi tīklā, vispirms lūdziet mobilo sakaru operatoru iestatīt šo pakalpojumu. Pēc tam iestatījumos vēlreiz ieslēdziet Wi-Fi zvanus."</item> + <item msgid="3910386316304772394">"Lai veiktu zvanus un sūtītu īsziņas Wi-Fi tīklā, vispirms lūdziet mobilo sakaru operatoram iestatīt šo pakalpojumu. Pēc tam iestatījumos vēlreiz ieslēdziet Wi-Fi zvanus. (Kļūdas kods: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Reģistrēt to pie sava mobilo sakaru operatora"</item> @@ -1129,6 +1116,13 @@ <item quantity="one">Ir pieejami atvērti Wi-Fi tīkli</item> <item quantity="other">Ir pieejami atvērti Wi-Fi tīkli</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Savienojuma izveide ar atvērtu Wi-Fi tīklu"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Notiek savienojuma izveide ar atvērtu Wi-Fi tīklu"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Ir izveidots savienojums ar Wi-Fi tīklu"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nevarēja izveidot savienojumu ar Wi‑Fi tīklu"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Pieskarieties, lai skatītu visus tīklus"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Izveidot savienojumu"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Visi tīkli"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Pierakstieties Wi-Fi tīklā"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Pierakstīšanās tīklā"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-mcc302-mnc370-af/strings.xml b/core/res/res/values-mcc302-mnc370-af/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-af/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-am/strings.xml b/core/res/res/values-mcc302-mnc370-am/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-am/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ar/strings.xml b/core/res/res/values-mcc302-mnc370-ar/strings.xml new file mode 100644 index 000000000000..f1c8176cb706 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ar/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s مع Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-az/strings.xml b/core/res/res/values-mcc302-mnc370-az/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-az/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-b+sr+Latn/strings.xml b/core/res/res/values-mcc302-mnc370-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-b+sr+Latn/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-be/strings.xml b/core/res/res/values-mcc302-mnc370-be/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-be/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-bg/strings.xml b/core/res/res/values-mcc302-mnc370-bg/strings.xml new file mode 100644 index 000000000000..b3a9589b1eac --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-bg/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi от %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-bs/strings.xml b/core/res/res/values-mcc302-mnc370-bs/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-bs/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ca/strings.xml b/core/res/res/values-mcc302-mnc370-ca/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ca/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-cs/strings.xml b/core/res/res/values-mcc302-mnc370-cs/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-cs/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-da/strings.xml b/core/res/res/values-mcc302-mnc370-da/strings.xml new file mode 100644 index 000000000000..709530cc56ae --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-da/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi fra %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-de/strings.xml b/core/res/res/values-mcc302-mnc370-de/strings.xml new file mode 100644 index 000000000000..6aa76438581a --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-de/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"WLAN: %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-el/strings.xml b/core/res/res/values-mcc302-mnc370-el/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-el/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-en-rAU/strings.xml b/core/res/res/values-mcc302-mnc370-en-rAU/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-en-rAU/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-en-rGB/strings.xml b/core/res/res/values-mcc302-mnc370-en-rGB/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-en-rGB/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-en-rIN/strings.xml b/core/res/res/values-mcc302-mnc370-en-rIN/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-en-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-es-rUS/strings.xml b/core/res/res/values-mcc302-mnc370-es-rUS/strings.xml new file mode 100644 index 000000000000..5ba6413304a6 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-es-rUS/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-es/strings.xml b/core/res/res/values-mcc302-mnc370-es/strings.xml new file mode 100644 index 000000000000..5ba6413304a6 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-es/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-et/strings.xml b/core/res/res/values-mcc302-mnc370-et/strings.xml new file mode 100644 index 000000000000..648544d81555 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-et/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s WiFi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-eu/strings.xml b/core/res/res/values-mcc302-mnc370-eu/strings.xml new file mode 100644 index 000000000000..960e1e563b07 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-eu/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi sarea"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-fa/strings.xml b/core/res/res/values-mcc302-mnc370-fa/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-fa/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-fi/strings.xml b/core/res/res/values-mcc302-mnc370-fi/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-fi/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-fr-rCA/strings.xml b/core/res/res/values-mcc302-mnc370-fr-rCA/strings.xml new file mode 100644 index 000000000000..5ba6413304a6 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-fr-rCA/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-fr/strings.xml b/core/res/res/values-mcc302-mnc370-fr/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-fr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-gl/strings.xml b/core/res/res/values-mcc302-mnc370-gl/strings.xml new file mode 100644 index 000000000000..b64447160530 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-gl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wifi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-hi/strings.xml b/core/res/res/values-mcc302-mnc370-hi/strings.xml new file mode 100644 index 000000000000..3521dd408d6e --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-hi/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s वाई-फ़ाई"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-hr/strings.xml b/core/res/res/values-mcc302-mnc370-hr/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-hr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-hu/strings.xml b/core/res/res/values-mcc302-mnc370-hu/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-hu/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-hy/strings.xml b/core/res/res/values-mcc302-mnc370-hy/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-hy/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-in/strings.xml b/core/res/res/values-mcc302-mnc370-in/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-in/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-is/strings.xml b/core/res/res/values-mcc302-mnc370-is/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-is/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-it/strings.xml b/core/res/res/values-mcc302-mnc370-it/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-it/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-iw/strings.xml b/core/res/res/values-mcc302-mnc370-iw/strings.xml new file mode 100644 index 000000000000..90b73ad4518b --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-iw/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ja/strings.xml b/core/res/res/values-mcc302-mnc370-ja/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ja/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ka/strings.xml b/core/res/res/values-mcc302-mnc370-ka/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ka/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-kk/strings.xml b/core/res/res/values-mcc302-mnc370-kk/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-kk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-km/strings.xml b/core/res/res/values-mcc302-mnc370-km/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-km/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ko/strings.xml b/core/res/res/values-mcc302-mnc370-ko/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ko/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ky/strings.xml b/core/res/res/values-mcc302-mnc370-ky/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ky/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-lo/strings.xml b/core/res/res/values-mcc302-mnc370-lo/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-lo/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-lt/strings.xml b/core/res/res/values-mcc302-mnc370-lt/strings.xml new file mode 100644 index 000000000000..95746fb21691 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-lt/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"„%s“ „Wi-Fi“"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-lv/strings.xml b/core/res/res/values-mcc302-mnc370-lv/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-lv/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-mk/strings.xml b/core/res/res/values-mcc302-mnc370-mk/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-mk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ml/strings.xml b/core/res/res/values-mcc302-mnc370-ml/strings.xml new file mode 100644 index 000000000000..810b72ccea3a --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ml/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s വൈഫൈ"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-mn/strings.xml b/core/res/res/values-mcc302-mnc370-mn/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-mn/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-mr/strings.xml b/core/res/res/values-mcc302-mnc370-mr/strings.xml new file mode 100644 index 000000000000..4b033335bb48 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-mr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s वाय-फाय"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ms/strings.xml b/core/res/res/values-mcc302-mnc370-ms/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ms/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-my/strings.xml b/core/res/res/values-mcc302-mnc370-my/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-my/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-nb/strings.xml b/core/res/res/values-mcc302-mnc370-nb/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-nb/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-nl/strings.xml b/core/res/res/values-mcc302-mnc370-nl/strings.xml new file mode 100644 index 000000000000..036633506e93 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-nl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wifi via %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-pl/strings.xml b/core/res/res/values-mcc302-mnc370-pl/strings.xml new file mode 100644 index 000000000000..f359c0300628 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-pl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi – %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-pt-rBR/strings.xml b/core/res/res/values-mcc302-mnc370-pt-rBR/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-pt-rBR/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-pt-rPT/strings.xml b/core/res/res/values-mcc302-mnc370-pt-rPT/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-pt-rPT/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-pt/strings.xml b/core/res/res/values-mcc302-mnc370-pt/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-pt/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ro/strings.xml b/core/res/res/values-mcc302-mnc370-ro/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ro/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ru/strings.xml b/core/res/res/values-mcc302-mnc370-ru/strings.xml new file mode 100644 index 000000000000..5fdf802c9883 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ru/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Сеть Wi-Fi \"%s\""</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-si/strings.xml b/core/res/res/values-mcc302-mnc370-si/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-si/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-sk/strings.xml b/core/res/res/values-mcc302-mnc370-sk/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-sk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-sl/strings.xml b/core/res/res/values-mcc302-mnc370-sl/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-sl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-sq/strings.xml b/core/res/res/values-mcc302-mnc370-sq/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-sq/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-sr/strings.xml b/core/res/res/values-mcc302-mnc370-sr/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-sr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-sv/strings.xml b/core/res/res/values-mcc302-mnc370-sv/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-sv/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-sw/strings.xml b/core/res/res/values-mcc302-mnc370-sw/strings.xml new file mode 100644 index 000000000000..8c1c88798030 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-sw/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi ya %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-ta/strings.xml b/core/res/res/values-mcc302-mnc370-ta/strings.xml new file mode 100644 index 000000000000..58075938c1da --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-ta/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s வைஃபை"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-te/strings.xml b/core/res/res/values-mcc302-mnc370-te/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-te/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-th/strings.xml b/core/res/res/values-mcc302-mnc370-th/strings.xml new file mode 100644 index 000000000000..fa5ff47fb62f --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-th/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi ของ %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-tl/strings.xml b/core/res/res/values-mcc302-mnc370-tl/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-tl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-tr/strings.xml b/core/res/res/values-mcc302-mnc370-tr/strings.xml new file mode 100644 index 000000000000..2f9ff047c700 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-tr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s kablosuz"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-uk/strings.xml b/core/res/res/values-mcc302-mnc370-uk/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-uk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-uz/strings.xml b/core/res/res/values-mcc302-mnc370-uz/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-uz/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-vi/strings.xml b/core/res/res/values-mcc302-mnc370-vi/strings.xml new file mode 100644 index 000000000000..74d4f17ce643 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-vi/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-zh-rCN/strings.xml b/core/res/res/values-mcc302-mnc370-zh-rCN/strings.xml new file mode 100644 index 000000000000..a89f6a288197 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-zh-rCN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s WLAN"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-zh-rHK/strings.xml b/core/res/res/values-mcc302-mnc370-zh-rHK/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-zh-rHK/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-zh-rTW/strings.xml b/core/res/res/values-mcc302-mnc370-zh-rTW/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-zh-rTW/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc370-zu/strings.xml b/core/res/res/values-mcc302-mnc370-zu/strings.xml new file mode 100644 index 000000000000..b93949e190c7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc370-zu/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="5022384999749536798">"%s"</item> + <item msgid="8117276330682171665">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-af/strings.xml b/core/res/res/values-mcc302-mnc720-af/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-af/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-am/strings.xml b/core/res/res/values-mcc302-mnc720-am/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-am/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ar/strings.xml b/core/res/res/values-mcc302-mnc720-ar/strings.xml new file mode 100644 index 000000000000..869678fdbf4a --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ar/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s مع Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-az/strings.xml b/core/res/res/values-mcc302-mnc720-az/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-az/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-b+sr+Latn/strings.xml b/core/res/res/values-mcc302-mnc720-b+sr+Latn/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-b+sr+Latn/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-be/strings.xml b/core/res/res/values-mcc302-mnc720-be/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-be/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-bg/strings.xml b/core/res/res/values-mcc302-mnc720-bg/strings.xml new file mode 100644 index 000000000000..890f19b4dd90 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-bg/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi от %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-bs/strings.xml b/core/res/res/values-mcc302-mnc720-bs/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-bs/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ca/strings.xml b/core/res/res/values-mcc302-mnc720-ca/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ca/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-cs/strings.xml b/core/res/res/values-mcc302-mnc720-cs/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-cs/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-da/strings.xml b/core/res/res/values-mcc302-mnc720-da/strings.xml new file mode 100644 index 000000000000..483dee583459 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-da/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi fra %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-de/strings.xml b/core/res/res/values-mcc302-mnc720-de/strings.xml new file mode 100644 index 000000000000..825fa0087cd8 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-de/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"WLAN: %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-el/strings.xml b/core/res/res/values-mcc302-mnc720-el/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-el/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-en-rAU/strings.xml b/core/res/res/values-mcc302-mnc720-en-rAU/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-en-rAU/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-en-rGB/strings.xml b/core/res/res/values-mcc302-mnc720-en-rGB/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-en-rGB/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-en-rIN/strings.xml b/core/res/res/values-mcc302-mnc720-en-rIN/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-en-rIN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-es-rUS/strings.xml b/core/res/res/values-mcc302-mnc720-es-rUS/strings.xml new file mode 100644 index 000000000000..c8c4c5eaeace --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-es-rUS/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-es/strings.xml b/core/res/res/values-mcc302-mnc720-es/strings.xml new file mode 100644 index 000000000000..c8c4c5eaeace --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-es/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-et/strings.xml b/core/res/res/values-mcc302-mnc720-et/strings.xml new file mode 100644 index 000000000000..3e5a7efaf7d5 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-et/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s WiFi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-eu/strings.xml b/core/res/res/values-mcc302-mnc720-eu/strings.xml new file mode 100644 index 000000000000..802df65c5348 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-eu/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi sarea"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-fa/strings.xml b/core/res/res/values-mcc302-mnc720-fa/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-fa/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-fi/strings.xml b/core/res/res/values-mcc302-mnc720-fi/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-fi/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-fr-rCA/strings.xml b/core/res/res/values-mcc302-mnc720-fr-rCA/strings.xml new file mode 100644 index 000000000000..c8c4c5eaeace --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-fr-rCA/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-fr/strings.xml b/core/res/res/values-mcc302-mnc720-fr/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-fr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-gl/strings.xml b/core/res/res/values-mcc302-mnc720-gl/strings.xml new file mode 100644 index 000000000000..d3a9055d8a09 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-gl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wifi de %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-hi/strings.xml b/core/res/res/values-mcc302-mnc720-hi/strings.xml new file mode 100644 index 000000000000..9a10eed9a140 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-hi/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s वाई-फ़ाई"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-hr/strings.xml b/core/res/res/values-mcc302-mnc720-hr/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-hr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-hu/strings.xml b/core/res/res/values-mcc302-mnc720-hu/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-hu/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-hy/strings.xml b/core/res/res/values-mcc302-mnc720-hy/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-hy/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-in/strings.xml b/core/res/res/values-mcc302-mnc720-in/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-in/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-is/strings.xml b/core/res/res/values-mcc302-mnc720-is/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-is/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-it/strings.xml b/core/res/res/values-mcc302-mnc720-it/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-it/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-iw/strings.xml b/core/res/res/values-mcc302-mnc720-iw/strings.xml new file mode 100644 index 000000000000..d0a799f8e379 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-iw/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ja/strings.xml b/core/res/res/values-mcc302-mnc720-ja/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ja/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ka/strings.xml b/core/res/res/values-mcc302-mnc720-ka/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ka/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-kk/strings.xml b/core/res/res/values-mcc302-mnc720-kk/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-kk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-km/strings.xml b/core/res/res/values-mcc302-mnc720-km/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-km/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ko/strings.xml b/core/res/res/values-mcc302-mnc720-ko/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ko/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ky/strings.xml b/core/res/res/values-mcc302-mnc720-ky/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ky/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-lo/strings.xml b/core/res/res/values-mcc302-mnc720-lo/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-lo/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-lt/strings.xml b/core/res/res/values-mcc302-mnc720-lt/strings.xml new file mode 100644 index 000000000000..2d3b87a58034 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-lt/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"„%s“ „Wi-Fi“"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-lv/strings.xml b/core/res/res/values-mcc302-mnc720-lv/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-lv/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-mk/strings.xml b/core/res/res/values-mcc302-mnc720-mk/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-mk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ml/strings.xml b/core/res/res/values-mcc302-mnc720-ml/strings.xml new file mode 100644 index 000000000000..325b5db249e7 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ml/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s വൈഫൈ"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-mn/strings.xml b/core/res/res/values-mcc302-mnc720-mn/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-mn/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-mr/strings.xml b/core/res/res/values-mcc302-mnc720-mr/strings.xml new file mode 100644 index 000000000000..9708843f5413 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-mr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s वाय-फाय"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ms/strings.xml b/core/res/res/values-mcc302-mnc720-ms/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ms/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-my/strings.xml b/core/res/res/values-mcc302-mnc720-my/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-my/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-nb/strings.xml b/core/res/res/values-mcc302-mnc720-nb/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-nb/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-nl/strings.xml b/core/res/res/values-mcc302-mnc720-nl/strings.xml new file mode 100644 index 000000000000..4c5caddb9dcd --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-nl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wifi via %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-pl/strings.xml b/core/res/res/values-mcc302-mnc720-pl/strings.xml new file mode 100644 index 000000000000..4e78857d94bc --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-pl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi – %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-pt-rBR/strings.xml b/core/res/res/values-mcc302-mnc720-pt-rBR/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-pt-rBR/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-pt-rPT/strings.xml b/core/res/res/values-mcc302-mnc720-pt-rPT/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-pt-rPT/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-pt/strings.xml b/core/res/res/values-mcc302-mnc720-pt/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-pt/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ro/strings.xml b/core/res/res/values-mcc302-mnc720-ro/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ro/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ru/strings.xml b/core/res/res/values-mcc302-mnc720-ru/strings.xml new file mode 100644 index 000000000000..b88013beef37 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ru/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Сеть Wi-Fi \"%s\""</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-si/strings.xml b/core/res/res/values-mcc302-mnc720-si/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-si/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-sk/strings.xml b/core/res/res/values-mcc302-mnc720-sk/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-sk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-sl/strings.xml b/core/res/res/values-mcc302-mnc720-sl/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-sl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-sq/strings.xml b/core/res/res/values-mcc302-mnc720-sq/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-sq/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-sr/strings.xml b/core/res/res/values-mcc302-mnc720-sr/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-sr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-sv/strings.xml b/core/res/res/values-mcc302-mnc720-sv/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-sv/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-sw/strings.xml b/core/res/res/values-mcc302-mnc720-sw/strings.xml new file mode 100644 index 000000000000..ee780df78ca5 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-sw/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi ya %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-ta/strings.xml b/core/res/res/values-mcc302-mnc720-ta/strings.xml new file mode 100644 index 000000000000..61c8b84800cc --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-ta/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s வைஃபை"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-te/strings.xml b/core/res/res/values-mcc302-mnc720-te/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-te/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-th/strings.xml b/core/res/res/values-mcc302-mnc720-th/strings.xml new file mode 100644 index 000000000000..d536f4510138 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-th/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi ของ %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-tl/strings.xml b/core/res/res/values-mcc302-mnc720-tl/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-tl/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-tr/strings.xml b/core/res/res/values-mcc302-mnc720-tr/strings.xml new file mode 100644 index 000000000000..e41287af104b --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-tr/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s kablosuz"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-uk/strings.xml b/core/res/res/values-mcc302-mnc720-uk/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-uk/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-uz/strings.xml b/core/res/res/values-mcc302-mnc720-uz/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-uz/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-vi/strings.xml b/core/res/res/values-mcc302-mnc720-vi/strings.xml new file mode 100644 index 000000000000..20e4f47ad6e1 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-vi/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"Wi-Fi %s"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-zh-rCN/strings.xml b/core/res/res/values-mcc302-mnc720-zh-rCN/strings.xml new file mode 100644 index 000000000000..c5526b24cb94 --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-zh-rCN/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s WLAN"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-zh-rHK/strings.xml b/core/res/res/values-mcc302-mnc720-zh-rHK/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-zh-rHK/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-zh-rTW/strings.xml b/core/res/res/values-mcc302-mnc720-zh-rTW/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-zh-rTW/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mcc302-mnc720-zu/strings.xml b/core/res/res/values-mcc302-mnc720-zu/strings.xml new file mode 100644 index 000000000000..9b2336d8006d --- /dev/null +++ b/core/res/res/values-mcc302-mnc720-zu/strings.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wfcSpnFormats"> + <item msgid="2776657861851140021">"%s"</item> + <item msgid="5094669985484060934">"%s Wi-Fi"</item> + </string-array> +</resources> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index f777f8394fde..9ffc7ad1fa68 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"ТБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дена"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ден <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек."</string> <string name="untitled" msgid="4638956954852782576">"<Без наслов>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Нема телефонски број)"</string> <string name="unknownName" msgid="6867811765370350269">"Непознато"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема услуга за говорни/итни повици"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено не се нуди од мобилната мрежа на вашата локација"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не може да се дојде до мрежата"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"За подобрување на приемот, обидете се да го промените избраниот тип во „Поставки > Мрежа и интернет > Мобилни мрежи > Претпочитан тип мрежа“."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Предупредувања"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Проследување повик"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим на итен повратен повик"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Пребарување за услуга"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Повикување преку Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"За повикување и испраќање пораки преку Wi-Fi, прво побарајте од операторот да ви ја постави оваа услуга. Потоа повторно вклучете повикување преку Wi-Fi во Поставки."</item> + <item msgid="3910386316304772394">"За да воспоставувате повици и да испраќате пораки преку Wi-Fi, прво побарајте од операторот да ја постави услугава. Потоа, вклучете ја повторно „Повикување преку Wi-Fi“ во „Поставки“. (Код за грешка: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Регистрирајте се со операторот"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Отворени Wi-Fi мрежи се достапни</item> <item quantity="other">Отворени Wi-Fi мрежи се достапни</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Поврзете се на отворена Wi‑Fi-мрежа"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Поврзување на отворена Wi‑Fi-мрежа"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Се поврзавте на Wi‑Fi-мрежа"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можеше да се поврзе на Wi‑Fi-мрежа"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Допрете за да ги видите сите мрежи"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Поврзете се"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Сите мрежи"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Најавете се на мрежа на Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Најавете се на мрежа"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 0eda9cbec59b..cc19ec617417 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ദിവസം <xliff:g id="HOURS">%2$d</xliff:g> മണിക്കൂർ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ <xliff:g id="MINUTES">%2$d</xliff:g> മിനിറ്റ്"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> മണിക്കൂർ <xliff:g id="MINUTES">%2$d</xliff:g> മിനിറ്റ്"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ്"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> മി."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ് <xliff:g id="SECONDS">%2$d</xliff:g> സെക്കൻഡ്"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> മിനിറ്റ് <xliff:g id="SECONDS">%2$d</xliff:g> സെക്കൻഡ്"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> സെക്കൻഡ്"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> സെക്കൻഡ്"</string> <string name="untitled" msgid="4638956954852782576">"<ശീർഷകമില്ലാത്ത>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ഫോൺ നമ്പറില്ല)"</string> <string name="unknownName" msgid="6867811765370350269">"അജ്ഞാതം"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"വോയ്സ്/അടിയന്തിര സേവനമില്ല"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"നിങ്ങളുടെ ലൊക്കേഷനിൽ മൊബൈൽ നെറ്റ്വര്ക്ക് താൽക്കാലികമായി ലഭ്യമല്ല"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനാവുന്നില്ല"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"സ്വീകരണം മെച്ചപ്പെടുത്തുന്നതിന് സിസ്റ്റം > നെറ്റ്വർക്കും ഇന്റെർനെറ്റും > മൊബൈൽ നെറ്റ്വർക്കുകൾ > തിരഞ്ഞെടുത്ത നെറ്റ്വർക്ക് തരം എന്നതിൽ തിരഞ്ഞെടുത്തിരിക്കുന്ന തരം മാറ്റിക്കൊണ്ട് ശ്രമിച്ചുനോക്കുക."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"അലേർട്ടുകൾ"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"കോൾ ഫോർവേഡിംഗ്"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"അടിയന്തര കോൾബാക്ക് മോഡ്"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"സേവനത്തിനായി തിരയുന്നു"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"വൈഫൈ കോളിംഗ്"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"വൈഫൈ വഴി കോളുകൾ വിളിക്കാനും സന്ദേശങ്ങൾ അയയ്ക്കാനും ആദ്യം നിങ്ങളുടെ കാരിയറോട് ഈ സേവനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക. ക്രമീകരണത്തിൽ നിന്ന് വീണ്ടും വൈഫൈ കോളിംഗ് ഓണാക്കുക."</item> + <item msgid="3910386316304772394">"വൈഫൈ വഴി കോളുകൾ ചെയ്യാനും സന്ദേശങ്ങൾ അയയ്ക്കാനും ആദ്യം നിങ്ങളുടെ കാരിയറോട് ഈ സേവനം സജ്ജമാക്കാൻ ആവശ്യപ്പെടുക. ക്രമീകരണത്തിൽ നിന്ന് വീണ്ടും വൈഫൈ കോളിംഗ് ഓണാക്കുക. (പിശക് കോഡ്: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"നിങ്ങളുടെ കാരിയറിൽ രജിസ്റ്റർ ചെയ്യുക"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കുകൾ തുറക്കുക</item> <item quantity="one">ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്ക് തുറക്കുക</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുക"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ലഭ്യമായ വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യുന്നു"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"വൈഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്തു"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"വൈ-ഫൈ നെറ്റ്വർക്കിലേക്ക് കണക്റ്റുചെയ്യാനായില്ല"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"എല്ലാ നെറ്റ്വർക്കുകളും കാണാൻ ടാപ്പുചെയ്യുക"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"കണക്റ്റുചെയ്യുക"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"എല്ലാ നെറ്റ്വർക്കുകളും"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"വൈഫൈ നെറ്റ്വർക്കിലേക്ക് സൈൻ ഇൻ ചെയ്യുക"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"നെറ്റ്വർക്കിലേക്ക് സൈൻ ഇൻ ചെയ്യുക"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index a9f81e1f65c8..a2b08e0a7067 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> өдөр <xliff:g id="HOURS">%2$d</xliff:g> цаг"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> цаг"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> минут"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> цаг <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> минут"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> секунд"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> <string name="untitled" msgid="4638956954852782576">"<Гарчиггүй>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Утасны дугаар байхгүй)"</string> <string name="unknownName" msgid="6867811765370350269">"Тодорхойгүй"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Дуу хоолой/яаралтай үйлчилгээ алга"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Таны байршилд таны мобайл сүлжээнээс түр хугацаанд блоклосон"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сүлжээнд холбогдох боломжгүй байна"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Хүлээн авалтыг сайжруулахын тулд Тохиргоо > Сүлжээ & Интернэт > Мобайл сүлжээ > Сонгосон сүлжээний төрөл хэсгийг сонгон төрлөө өөрчилнө үү."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Сануулга"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Дуудлага шилжүүлэх"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Яаралтай дуудлага хийх горим"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Үйлчилгээг хайж байна…"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi Calling"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi-аар дуудлага хийх болон мессеж илгээхээр бол эхлээд оператороосоо энэ төхөөрөмжийг тохируулж өгөхийг хүсээрэй. Дараа нь Тохиргооноос Wi-Fi дуудлага хийх үйлдлийг асаагаарай."</item> + <item msgid="3910386316304772394">"Wi-Fi-аар дуудлага хийх, мессеж илгээх бол эхлээд оператор компаниасаа энэ үйлчилгээг тохируулж өгөхийг хүснэ үү. Дараа нь Тохиргооноос Wi-Fi дуудлага хийх үйлдлийг асаана уу. (Алдааны код: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Операторт бүртгүүлэх"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Нээлттэй Wi-Fi сүлжээ ашиглах боломжтой</item> <item quantity="one">Нээлттэй Wi-Fi сүлжээ ашиглах боломжтой</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Нээлттэй Wi‑Fi сүлжээнд холбогдох"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Нээлттэй Wi‑Fi сүлжээнд холбогдож байна"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi сүлжээнд холбогдлоо"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi сүлжээнд холбогдож чадсангүй"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Бүх сүлжээг харахын тулд товшино уу"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Холбогдох"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Бүх сүлжээ"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi сүлжээнд нэвтэрнэ үү"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Сүлжээнд нэвтэрнэ үү"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index 461790992930..12026d84ca24 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिवस <xliff:g id="HOURS">%2$d</xliff:g> तास"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> तास"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ता <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ता <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनिटे"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनिट"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मि <xliff:g id="SECONDS">%2$d</xliff:g> से"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मि <xliff:g id="SECONDS">%2$d</xliff:g> से"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंद"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकंद"</string> <string name="untitled" msgid="4638956954852782576">"<अशीर्षकांकित>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(कोणताही फोन नंबर नाही)"</string> <string name="unknownName" msgid="6867811765370350269">"अज्ञात"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"व्हॉइस/आणीबाणी सेवा नाही"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"तुम्ही असलेल्या स्थानी मोबाइल नेटवर्क तात्पुरते उपलब्ध नाही"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कवर पोहोचूू शकत नाही"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"रिसेप्शन सुधारण्यासाठी, सोटिंग्ज > नेटवर्क आणि इंटरनेट > मोबाइल नेटवर्क > प्राधान्य दिलेला नेटवर्क प्रकार बदलून पहा."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्ट"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"कॉल फॉरवर्डिंग"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"इमर्जन्सी कॉलबॅक मोड"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"सेवा शोधत आहे"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"वाय-फाय कॉलिंग"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"वाय-फायवरून कॉल करण्यासाठी आणि संदेश पाठविण्यासाठी, प्रथम आपल्या वाहकास ही सेवा सेट करण्यास सांगा. नंतर सेटिंग्जमधून पुन्हा वाय-फाय कॉलिंग चालू करा."</item> + <item msgid="3910386316304772394">"वाय-फायवरून कॉल करण्यासाठी आणि संदेश पाठवण्यासाठी आधी तुमच्या कॅरियरला ही सेवा सेट अप करण्यास सांगा. नंतर सेटिंग्जमधून वाय-फाय वापरून कॉल करणे पुन्हा चालू करा. (एरर कोड <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"आपल्या वाहकासह नोंदणी करा"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">खुले वाय-फाय नेटवर्क उपलब्ध</item> <item quantity="other">खुले वाय-फाय नेटवर्क उपलब्ध</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"खुल्या वाय-फाय नेटवर्कशी कनेक्ट करा"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुल्या वाय-फाय नेटवर्कशी कनेक्ट करत आहे"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"वाय-फाय नेटवर्कशी कनेक्ट केले"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"वाय-फाय नेटवर्कशी कनेक्ट करू शकत नाही"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सर्व नेटवर्क पाहण्यासाठी टॅप करा"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"कनेक्ट करा"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"सर्व नेटवर्क"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"वाय-फाय नेटवर्कमध्ये साइन इन करा"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"नेटवर्कवर साइन इन करा"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 7aae94fc875b..bd7e6ac3e938 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> hari"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> hari <xliff:g id="HOURS">%2$d</xliff:g> jam"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> jam"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> jam <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minit"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> minit"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> saat"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> saat"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> saat"</string> <string name="untitled" msgid="4638956954852782576">"<Tidak bertajuk>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Tiada nombor telefon)"</string> <string name="unknownName" msgid="6867811765370350269">"Tidak diketahui"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tiada perkhidmatan suara/kecemasan"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Tidak ditawarkan oleh rangkaian mudah alih di lokasi anda untuk sementara waktu"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tidak dapat mencapai rangkaian"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Untuk memperbaik penerimaan, cuba tukar jenis rangkaian yang dipilih di Tetapan > Rangkaian & Internet > Rangkaian mudah alih > Jenis rangkaian pilihan."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Makluman"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Pemajuan panggilan"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod paggil balik kecemasan"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Mencari Perkhidmatan"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Panggilan Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Untuk membuat panggilan dan menghantar mesej melalui Wi-Fi, mula-mula minta pembawa anda untuk menyediakan perkhidmatan ini. Kemudian hidupkan panggilan Wi-Fi semula daripada Tetapan."</item> + <item msgid="3910386316304772394">"Untuk membuat panggilan dan menghantar mesej melalui Wi-Fi, minta pembawa anda menyediakan perkhidmatan ini terlebih dahulu. Kemudian, hidupkan panggilan Wi-Fi sekali lagi daripada Tetapan. (Kod ralat: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Daftar dengan pembawa anda"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Rangkaian Wi-Fi terbuka tersedia</item> <item quantity="one">Rangkaian Wi-Fi terbuka tersedia</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Sambung ke rangkaian Wi-Fi terbuka"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Menyambung ke rangkaian Wi‑Fi terbuka"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Disambungkan ke rangkaian Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menyambung ke rangkaian Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Ketik untuk melihat semua rangkaian"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Sambung"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Semua Rangkaian"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Log masuk ke rangkaian Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Log masuk ke rangkaian"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index f02efbe97b31..983213737348 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ရက် <xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ရက်<xliff:g id="HOURS">%2$d</xliff:g> နာရီ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> နာရီ <xliff:g id="MINUTES">%2$d</xliff:g> မိနစ်"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ်"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ်"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> မိနစ် <xliff:g id="SECONDS">%2$d</xliff:g> စက္ကန့်"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> စက္ကန့်"</string> <string name="untitled" msgid="4638956954852782576">"<ခေါင်းစဉ်မဲ့>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ဖုန်းနံပါတ်မရှိပါ)"</string> <string name="unknownName" msgid="6867811765370350269">"မသိရ"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ဖုန်း/အရေးပေါ် ဝန်ဆောင်မှုများမရရှိနိုင်ပါ"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"သင်၏ ဒေသတွင် မိုဘိုင်းကွန်ရက် ယာယီမရရှိနိုင်ပါ"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ကွန်ရက်ကို ချိတ်ဆက်၍မရပါ"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"လိုင်းဖမ်းယူမှု ကောင်းမွန်စေရန် ဆက်တင်များ > ကွန်ရက်နှင့် အင်တာနက် > မိုဘိုင်းကွန်ရက်များ > အသုံးပြုလိုသည့် ကွန်ရက်အမျိုးအစားတွင် ရွေးချယ်ထားသည့် အမျိုးအစားကို ပြောင်းကြည့်ပါ။"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"သတိပေးချက်များ"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"အဝင်ခေါ်ဆိုမှုအား ထပ်ဆင့်ပို့ခြင်း"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"အရေးပေါ် ပြန်လည်ခေါ်ဆိုနိုင်သောမုဒ်"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"ဆားဗစ်အားရှာဖွေနေသည်"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi ခေါ်ဆိုမှု"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi သုံး၍ ဖုန်းခေါ်ဆိုရန်နှင့် မက်ဆေ့ဂျ်များပို့ရန်၊ ဤဝန်ဆောင်မှုအား စတင်သုံးနိုင်ရန်အတွက် သင့် မိုဘိုင်းဝန်ဆောင်မှုအား ဦးစွာမေးမြန်းပါ။ ထို့နောက် ဆက်တင်မှတဆင့် Wi-Fi ခေါ်ဆိုမှုအား ထပ်ဖွင့်ပါ။"</item> + <item msgid="3910386316304772394">"Wi-Fi အသုံးပြု၍ ဖုန်းခေါ်ရန်နှင့် မက်ဆေ့ဂျ်ပို့ရန်အတွက် သင့်ဝန်ဆောင်မှုပေးသူကို ဤဝန်ဆောင်မှုအား သတ်မှတ်ပေးရန် ဦးစွာတောင်းဆိုပါ။ ထို့နောက် ဆက်တင်ထဲသို့ သွား၍ Wi-Fi ဖြင့် ဖုန်းခေါ်ခြင်းကို ဖွင့်ရပါမည်။ (အမှားကုဒ်- <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"သင့် မိုဘိုင်းဝန်ဆောင်မှုဖြင့် မှတ်ပုံတင်ရန်"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Wi-Fi ကွန်ယက်များရရှိနိုင်သည်အား ဖွင့်ပါ</item> <item quantity="one">Wi-Fi ကွန်ယက်ရရှိနိုင်သည်အား ဖွင့်ပါ</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"အများသုံး Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပါ"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"အများသုံး Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်နေသည်"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်ပြီးပါပြီ"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ကွန်ရက်သို့ ချိတ်ဆက်၍ မရပါ"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ကွန်ရက်အားလုံးကို ကြည့်ရန် တို့ပါ"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"ချိတ်ဆက်ရန်"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ကွန်ရက်အားလုံး"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ဝိုင်ဖိုင်ကွန်ရက်သို့ လက်မှတ်ထိုးဝင်ပါ"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ကွန်ယက်သို့ လက်မှတ်ထိုးဝင်ရန်"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 4f6065190483..7103ea9ef418 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dager"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> t"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> t"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> t <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string> <string name="untitled" msgid="4638956954852782576">"<Uten navn>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Mangler telefonnummer)"</string> <string name="unknownName" msgid="6867811765370350269">"Ukjent"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ingen tale-/nødtjeneste"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Tilbys midlertidig ikke gjennom mobilnettverket der du er"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Får ikke kontakt med nettverket"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"For å forbedre signalet, prøv å endre valgt nettverkstype i Innstillinger > Nettverk og Internett > Mobilnettverk > Foretrukket nettverkstype."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Varsler"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Viderekobling"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modusen nødsamtale-tilbakeringing"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Leter etter tjeneste"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-anrop"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"For å ringe og sende meldinger over Wi-Fi må du først be operatøren om å konfigurere denne tjenesten. Deretter slår du på Wi-Fi-anrop igjen fra Innstillinger."</item> + <item msgid="3910386316304772394">"For å ringe og sende meldinger over Wi-Fi må du først be operatøren om å konfigurere denne tjenesten. Deretter slår du på Wi-Fi-anrop igjen fra Innstillinger. (Feilkode: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrer deg hos operatøren din"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Åpne Wi-Fi-nettverk er tilgjengelig</item> <item quantity="one">Åpent Wi-Fi-nettverk er tilgjengelig</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Koble til et åpent Wi‑Fi-nettverk"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kobler til åpent Wi-Fi-nettverk"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Koblet til Wi-Fi-nettverk"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kunne ikke koble til Wi-Fi-nettverket"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trykk for å se alle nettverkene"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Koble til"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle nettverk"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Logg på Wi-Fi-nettverket"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Logg på nettverk"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 2734873f2c31..717b91fb4b77 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> दिन"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> दिन<xliff:g id="HOURS">%2$d</xliff:g> घन्टा"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> घन्टा"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> घन्टा <xliff:g id="MINUTES">%2$d</xliff:g> मि"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> घन्टा <xliff:g id="MINUTES">%2$d</xliff:g> मिनेट"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट <xliff:g id="SECONDS">%2$d</xliff:g> से"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> मिनेट <xliff:g id="SECONDS">%2$d</xliff:g> से"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकेन्ड"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> सेकेन्ड"</string> <string name="untitled" msgid="4638956954852782576">"<बिना शीर्षक>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(कुनै फोन नम्बर छैन)"</string> <string name="unknownName" msgid="6867811765370350269">"अज्ञात"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"कुनै पनि भ्वाइस/आपतकालीन सेवा उपलब्ध छैन"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"तपाईंको स्थानमा सञ्चालन भइरहेको मोबाइल नेटवर्कले अस्थायी रूपमा यो सुविधा प्रदान गर्दैन"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"नेटवर्कमाथि पहुँच राख्न सकिँदैन"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"रिसेप्सनमा सुधार गर्न प्रणालीहरू > नेटवर्क तथा इन्टरनेट > मोबाइल नेटवर्कहरू > रुचाइएको नेटवर्कको प्रकारमा गई चयन गरिएको प्रकार परिवर्तन गरी हेर्नुहोस्।"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"अलर्टहरू"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"कल फर्वार्ड गर्ने सेवा"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"आपतकालीन कलब्याक मोड"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"सेवाको खोजी गर्दै…"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi कलिङ"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi बाट कल गर्न र सन्देशहरू पठाउन, सबभन्दा पहिला यो सेवा सेटअप गर्न तपाईँको वाहकलाई भन्नुहोस्। त्यसपछि फेरि सेटिङहरूबाट Wi-Fi कलिङ सक्रिय पार्नुहोस्।"</item> + <item msgid="3910386316304772394">"Wi-Fi मार्फत कलहरू गर्न र सन्देशहरू पठाउन सबभन्दा पहिला आफ्नो सेवा प्रदायकलाई यो सेवा सेट गर्न भन्नुहोस्। त्यसपछि सेटिङहरूबाट Wi-Fi कलिङलाई सक्रिय पार्नुहोस्। (त्रुटिसम्बन्धी कोड: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"तपाईँको वाहकसँग दर्ता गर्नुहोस्"</item> @@ -1113,6 +1100,13 @@ <item quantity="other"> खुल्ला Wi-Fi सञ्जालहरू उपलब्ध छन्</item> <item quantity="one">खुल्ला Wi-Fi सञ्जाल उपलब्ध छ</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"खुला Wi‑Fi नेटवर्कमा जडान गर्नुहोस्"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"खुला Wi‑Fi नेटवर्कमा जडान गर्दै"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi नेटवर्कमा जडान गरियो"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi नेटवर्कमा जडान गर्न सकिएन"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"सबै नेटवर्कहरू हेर्न ट्याप गर्नुहोस्"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"जडान गर्नुहोस्"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"सबै नेटवर्कहरू"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi नेटवर्कमा साइन इन गर्नुहोस्"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"सञ्जालमा साइन इन गर्नुहोस्"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 52ffb7c61e26..72072557a7ed 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagen"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> uur"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> uur"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> uur <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuten"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seconden"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> seconde"</string> <string name="untitled" msgid="4638956954852782576">"<Naamloos>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Geen telefoonnummer)"</string> <string name="unknownName" msgid="6867811765370350269">"Onbekend"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Geen service voor spraak-/noodoproepen"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Tijdelijk niet aangeboden door het mobiele netwerk op je locatie"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Kan netwerk niet bereiken"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Als je de ontvangst wilt verbeteren, kun je het netwerktype wijzigen dat is geselecteerd bij Instellingen > Netwerk en internet > Mobiele netwerken > Voorkeursnetwerktype."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Meldingen"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Oproep doorschakelen"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modus voor noodoproepen"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Service zoeken"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Bellen via wifi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via \'Instellingen\'."</item> + <item msgid="3910386316304772394">"Als je wilt bellen en berichten wilt verzenden via wifi, moet je eerst je provider vragen deze service in te stellen. Schakel bellen via wifi vervolgens opnieuw in via Instellingen. (Foutcode: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registreren bij je provider"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Open wifi-netwerken beschikbaar</item> <item quantity="one">Open wifi-netwerk beschikbaar</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Verbinding maken met een open wifi-netwerk"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Verbinding maken met een open wifi-netwerk…"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Verbonden met een wifi-netwerk"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kan geen verbinding maken met het wifi-netwerk"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tik om alle netwerken te bekijken"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Verbinding maken"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alle netwerken"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Inloggen bij wifi-netwerk"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Inloggen bij netwerk"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index 1d42eeaec948..c779361b1b36 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟੇ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ਦਿਨ <xliff:g id="HOURS">%2$d</xliff:g> ਘੰਟਾ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ਘੰਟੇ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ਘੰਟਾ <xliff:g id="MINUTES">%2$d</xliff:g> ਮਿੰਟ"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ਘੰਟਾ <xliff:g id="MINUTES">%2$d</xliff:g> ਮਿੰਟ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ <xliff:g id="SECONDS">%2$d</xliff:g> ਸਕਿੰਟ"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> ਮਿੰਟ <xliff:g id="SECONDS">%2$d</xliff:g> ਸਕਿੰਟ"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> ਸਕਿੰਟ"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> ਸਕਿੰਟ"</string> <string name="untitled" msgid="4638956954852782576">"<ਬਿਨਾਂ ਸਿਰਲੇਖ>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ਕੋਈ ਫ਼ੋਨ ਨੰਬਰ ਨਹੀਂ)"</string> <string name="unknownName" msgid="6867811765370350269">"ਅਗਿਆਤ"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ਕੋਈ ਆਵਾਜ਼ੀ/ਸੰਕਟਕਾਲੀਨ ਸੇਵਾ ਨਹੀਂ"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"ਤੁਹਾਡੇ ਟਿਕਾਣੇ \'ਤੇ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਵੱਲੋਂ ਉਪਲਬਧ ਨਹੀਂ ਕਰਵਾਈ ਗਈ"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ਸਿਗਨਲ ਪ੍ਰਾਪਤੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਣ ਲਈ, ਸੈਟਿੰਗਾਂ > ਨੈੱਟਵਰਕ ਅਤੇ ਇੰਟਰਨੈੱਟ > ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ > ਤਰਜੀਹੀ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ \'ਤੇ ਚੁਣੀ ਗਈ ਕਿਸਮ ਨੂੰ ਬਦਲਣ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"ਸੁਚੇਤਨਾਵਾਂ"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"ਕਾਲ ਫਾਰਵਾਰਡਿੰਗ"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ਸੰਕਟਕਾਲੀਨ ਕਾਲਬੈਕ ਮੋਡ"</string> @@ -131,9 +118,7 @@ <string name="roamingText12" msgid="1189071119992726320">"ਰੋਮਿੰਗ ਬੈਨਰ ਬੰਦ"</string> <string name="roamingTextSearching" msgid="8360141885972279963">"ਸੇਵਾ ਦੀ ਖੋਜ ਕਰ ਰਿਹਾ ਹੈ"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi ਕਾਲਿੰਗ"</string> - <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi ਤੇ ਕਾਲਾਂ ਕਰਨ ਅਤੇ ਸੁਨੇਹੇ ਭੇਜਣ ਲਈ, ਪਹਿਲਾਂ ਆਪਣੇ ਕੈਰੀਅਰ ਨੂੰ ਇਹ ਸੇਵਾ ਸੈਟ ਅਪ ਕਰਨ ਲਈ ਕਹੋ। ਫਿਰ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ Wi-Fi ਕਾਲਿੰਗ ਦੁਬਾਰਾ ਚਾਲੂ ਕਰੋ।"</item> - </string-array> + <!-- no translation found for wfcOperatorErrorAlertMessages:0 (3910386316304772394) --> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"ਆਪਣੇ ਕੈਰੀਅਰ ਨਾਲ ਰਜਿਸਟਰ ਕਰੋ"</item> </string-array> @@ -1107,6 +1092,13 @@ <item quantity="one">ਉਪਲਬਧ Wi-Fi ਨੈੱਟਵਰਕ ਖੋਲ੍ਹੋ</item> <item quantity="other">ਉਪਲਬਧ Wi-Fi ਨੈੱਟਵਰਕ ਖੋਲ੍ਹੋ</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"ਖੁੱਲ੍ਹੇ Wi‑Fi ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਹੋਵੋ"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"ਖੁੱਲ੍ਹੇ Wi‑Fi ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ਨੈੱਟਵਰਕ ਨਾਲ ਕਨੈਕਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"ਸਾਰੇ ਨੈੱਟਵਰਕਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"ਕਨੈਕਟ ਕਰੋ"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"ਸਾਰੇ ਨੈੱਟਵਰਕ"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi ਨੈੱਟਵਰਕ ਵਿੱਚ ਸਾਈਨ ਇਨ ਕਰੋ"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ਨੈੱਟਵਰਕ ਤੇ ਸਾਈਨ ਇਨ ਕਰੋ"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index ff869abe6b17..e36eaf30cfd0 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dni"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dzień <xliff:g id="HOURS">%2$d</xliff:g> godz."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> godz."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> godz. <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez nazwy>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Brak numeru telefonu)"</string> <string name="unknownName" msgid="6867811765370350269">"Nieznana"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Brak usługi połączeń głosowych/alarmowych"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Usługa tymczasowo nieoferowana przez sieć komórkową w Twojej lokalizacji"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Brak zasięgu sieci"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Aby poprawić odbiór, zmień typ sieci: wybierz Ustawienia > Sieć i internet > Sieci komórkowe > Preferowany typ sieci."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerty"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Przekierowanie połączeń"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Tryb alarmowego połączenia zwrotnego"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Wyszukiwanie usługi"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Połączenia przez Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach."</item> + <item msgid="3910386316304772394">"Aby dzwonić i wysyłać wiadomości przez Wi-Fi, poproś swojego operatora o skonfigurowanie tej usługi. Potem ponownie włącz połączenia przez Wi-Fi w Ustawieniach. (Kod błędu: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Zarejestruj u operatora"</item> @@ -1151,6 +1138,13 @@ <item quantity="other">Dostępne są otwarte sieci Wi-Fi</item> <item quantity="one">Dostępna jest otwarta sieć Wi-Fi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Połącz się z otwartą siecią Wi-Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Łączę się z otwartą siecią Wi-Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Połączono z siecią Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nie udało się połączyć z siecią Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Kliknij, by zobaczyć wszystkie sieci"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Połącz"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Wszystkie sieci"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Zaloguj się w sieci Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Zaloguj się do sieci"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index e13a20f2b7fd..acaafd6f655b 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> m"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sem título>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nenhum número de telefone)"</string> <string name="unknownName" msgid="6867811765370350269">"Desconhecido"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para melhorar a recepção, tente alterar o tipo selecionado em Configurações > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Pesquisando serviço"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas por Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois ative novamente as chamadas por Wi-Fi nas configurações."</item> + <item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente a chamada no Wi-Fi nas configurações. Código de erro: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Faça registro na sua operadora"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Abrir redes Wi-Fi disponíveis</item> <item quantity="other">Abrir redes Wi-Fi disponíveis</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectando-se a uma rede Wi‑Fi aberta"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas as redes"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Fazer login na rede Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Fazer login na rede"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index df2bb9a32164..3c1011b59f63 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> horas"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> seg"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> seg"</string> <string name="untitled" msgid="4638956954852782576">"<Sem nome>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nenhum número de telefone)"</string> <string name="unknownName" msgid="6867811765370350269">"Desconhecido"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente não disponibilizado pela rede móvel na sua localização"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não é possível ligar à rede"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para melhorar a receção, experimente alterar o tipo selecionado em Definições > Rede e Internet > Redes móveis > Tipo de rede preferido."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Reencaminhamento de chamadas"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de chamada de retorno de emergência"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"A procurar Serviço"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar este serviço. Em seguida, nas Definições, ative novamente as chamadas por Wi-Fi."</item> + <item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, comece por pedir ao seu operador para configurar este serviço. De seguida, nas Definições, ative novamente as Chamadas Wi-Fi. (Código de erro: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registar-se junto do seu operador"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Open Wi-Fi networks available</item> <item quantity="other">Redes Wi-Fi abertas disponíveis</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Ligar à rede Wi-Fi aberta"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"A ligar à rede Wi-Fi aberta…"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Ligado à rede Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível ligar à rede Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Ligar"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas as redes"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Iniciar sessão na rede Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Início de sessão na rede"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index e13a20f2b7fd..acaafd6f655b 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dias"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dia <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> m"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Sem título>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nenhum número de telefone)"</string> <string name="unknownName" msgid="6867811765370350269">"Desconhecido"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Sem serviço de voz/emergência"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Serviço temporariamente bloqueado pela rede móvel no seu local"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Não foi possível acessar a rede"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Para melhorar a recepção, tente alterar o tipo selecionado em Configurações > Rede & Internet > Redes móveis > Tipo de rede preferencial."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alertas"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Encaminhamento de chamada"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modo de retorno de chamada de emergência"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Pesquisando serviço"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Chamadas por Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois ative novamente as chamadas por Wi-Fi nas configurações."</item> + <item msgid="3910386316304772394">"Para fazer chamadas e enviar mensagens por Wi-Fi, primeiro peça à sua operadora para configurar esse serviço. Depois, ative novamente a chamada no Wi-Fi nas configurações. Código de erro: <xliff:g id="CODE">%1$s</xliff:g>"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Faça registro na sua operadora"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Abrir redes Wi-Fi disponíveis</item> <item quantity="other">Abrir redes Wi-Fi disponíveis</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Conectar-se a uma rede Wi‑Fi aberta"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectando-se a uma rede Wi‑Fi aberta"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectado a uma rede Wi‑Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Não foi possível conectar-se à rede Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Toque para ver todas as redes"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectar"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Todas as redes"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Fazer login na rede Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Fazer login na rede"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 6844f45cb1e8..33c36d896b7a 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TO"</string> <string name="petabyteShort" msgid="5637816680144990219">"PO"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> zile"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> zile <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> zi <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sec"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sec"</string> <string name="untitled" msgid="4638956954852782576">"<Fără titlu>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Niciun număr de telefon)"</string> <string name="unknownName" msgid="6867811765370350269">"Necunoscut"</string> @@ -96,8 +84,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Fără servicii vocale/de urgență"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Momentan nu este oferit de rețeaua mobilă în locația dvs."</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nu se poate stabili conexiunea la rețea"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Pentru o recepție mai bună, încercați să schimbați tipul selectat în Setări > Rețea și internet > Rețele mobile > Tip preferat de rețea."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Alerte"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Redirecționarea apelurilor"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Mod de apelare inversă de urgență"</string> @@ -133,7 +120,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Se caută serviciul"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Apelare prin Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Pentru a apela și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări."</item> + <item msgid="3910386316304772394">"Pentru a efectua apeluri și a trimite mesaje prin Wi-Fi, mai întâi solicitați configurarea acestui serviciu la operator. Apoi, activați din nou apelarea prin Wi-Fi din Setări. (Cod de eroare: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Înregistrați-vă la operatorul dvs."</item> @@ -1129,6 +1116,13 @@ <item quantity="other">Rețele Wi-Fi deschise disponibile</item> <item quantity="one">Rețea Wi-Fi deschisă disponibilă</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Conectați-vă la o rețea Wi‑Fi deschisă"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Se stabilește conexiunea la o rețea Wi‑Fi deschisă"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"S-a realizat conexiunea la rețeaua Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nu s-a putut stabili conexiunea la rețeaua Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Atingeți pentru a vedea toate rețelele"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Conectați-vă"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Toate rețelele"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Conectați-vă la rețeaua Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Conectați-vă la rețea"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index b11bf0cce809..853586f15a9e 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TБ"</string> <string name="petabyteShort" msgid="5637816680144990219">"ПБ"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> ч."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ч."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ч. <xliff:g id="MINUTES">%2$d</xliff:g> мин."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин. <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string> <string name="untitled" msgid="4638956954852782576">"<Без названия>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Нет номера телефона)"</string> <string name="unknownName" msgid="6867811765370350269">"Неизвестно"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Голосовые и экстренные вызовы недоступны"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Местная мобильная сеть временно не поддерживает эту функцию."</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Сеть недоступна"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Чтобы улучшить сигнал, попробуйте выбрать другой тип сети в настройках (раздел \"Мобильные сети\")."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Оповещения"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресация вызовов"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим экстренных обратных вызовов"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Поиск службы"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Звонки по Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Чтобы совершать звонки и отправлять сообщения по Wi-Fi, необходимо сначала обратиться к оператору связи и подключить эту услугу. После этого вы сможете снова выбрать этот параметр в настройках."</item> + <item msgid="3910386316304772394">"Чтобы совершать звонки и отправлять сообщения по Wi-Fi, необходимо подключить эту услугу через оператора связи. После этого вы сможете выбрать этот параметр в настройках. Код ошибки: <xliff:g id="CODE">%1$s</xliff:g>."</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Укажите оператора и зарегистрируйтесь"</item> @@ -1151,6 +1138,13 @@ <item quantity="many">Есть открытые сети Wi-Fi</item> <item quantity="other">Есть открытые сети Wi-Fi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Подключитесь к открытой сети Wi‑Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Подключение к открытой сети Wi‑Fi…"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Подключено к сети Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не удалось подключиться к сети Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Нажмите, чтобы увидеть список сетей"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Подключиться"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Все сети"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Подключение к Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Регистрация в сети"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 00fbbd8bda10..1f373fe8b847 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"දින <xliff:g id="DAYS">%1$d</xliff:g>"</string> - <string name="durationDayHours" msgid="2713107458736744435">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string> - <string name="durationDayHour" msgid="7293789639090958917">"දින <xliff:g id="DAYS">%1$d</xliff:g> පැය <xliff:g id="HOURS">%2$d</xliff:g>"</string> - <string name="durationHours" msgid="4266858287167358988">"පැය <xliff:g id="HOURS">%1$d</xliff:g>"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"පැය <xliff:g id="HOURS">%1$d</xliff:g> මිනි <xliff:g id="MINUTES">%2$d</xliff:g>"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"පැය <xliff:g id="HOURS">%1$d</xliff:g> මිනි <xliff:g id="MINUTES">%2$d</xliff:g>"</string> - <string name="durationMinutes" msgid="3134226679883579347">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g>"</string> - <string name="durationMinute" msgid="7155301744174623818">"මිනිත්තු <xliff:g id="MINUTES">%1$d</xliff:g>"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g> තත් <xliff:g id="SECONDS">%2$d</xliff:g>"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"මිනි <xliff:g id="MINUTES">%1$d</xliff:g> තත් <xliff:g id="SECONDS">%2$d</xliff:g>"</string> - <string name="durationSeconds" msgid="8050088505238241405">"තත් <xliff:g id="SECONDS">%1$d</xliff:g>"</string> - <string name="durationSecond" msgid="985669622276420331">"තත් <xliff:g id="SECONDS">%1$d</xliff:g>"</string> <string name="untitled" msgid="4638956954852782576">"<නම් යොදා නැත>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(දුරකථන අංකයක් නොමැත)"</string> <string name="unknownName" msgid="6867811765370350269">"නොදනී"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"හඬ/හදිසි සේවාව නොමැත"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"ඔබේ ස්ථානයේ ජංගම ජාලය මගින් තාවකාලිකව පිරිනොනමයි"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"ජාලය වෙත ළඟා විය නොහැකිය"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ප්රතිග්රහණය වැඩි දියුණු කිරීමට, සැකසීම් > ජාලය සහ අන්තර්ජාලය > ජංගම ජාල > වඩා කැමති ජාල වර්ගය තුළ තෝරන ලද වර්ගය වෙනස් කිරීම උත්සාහ කරන්න."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"ඇඟවීම්"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"ඇමතුම ප්රතියොමු කිරීම"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"හදිසි අවස්ථා පසු ඇමතුම් ප්රකාරය"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"සේවාව සඳහා සොයමින්"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi ඇමතීම"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi හරහා ඇමතුම් සිදු කිරීමට සහ පණිවිඩ යැවීමට, පළමුව මෙම සේවාව පිහිටුවන ලෙස ඔබේ වාහකයෙන් ඉල්ලන්න. අනතුරුව සැකසීම් වෙතින් Wi-Fi ඇමතුම නැවත ක්රියාත්මක කරන්න."</item> + <item msgid="3910386316304772394">"Wi-Fi හරහා ඇමතුම් සිදු කිරීමට සහ පණිවිඩ යැවීමට, පළමුව මෙම සේවාව පිහිටුවන ලෙස ඔබේ වාහකයෙන් ඉල්ලන්න. අනතුරුව සැකසීම් වෙතින් Wi-Fi ඇමතුම නැවත ක්රියාත්මක කරන්න. (දෝෂ කේතය <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"ඔබගේ වාහකය සමඟ ලියාපදිංචි වන්න"</item> @@ -1109,6 +1096,13 @@ <item quantity="one">විවෘත Wi-Fi ජාල තිබේ</item> <item quantity="other">විවෘත Wi-Fi ජාල තිබේ</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"විවෘත Wi-Fi ජාලය වෙත සම්බන්ධ වෙන්න"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"විවෘත Wi-Fi ජාලය වෙත සම්බන්ධ වෙමින්"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi ජාලයක් වෙත සම්බන්ධ විය නොහැකි විය"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"සියලු ජාල බැලීමට තට්ටු කරන්න"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"සම්බන්ධ කරන්න"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"සියලු ජාල"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi ජාලයට පුරනය වන්න"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ජාලයට පුරනය වන්න"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 0cd967a8837e..47b0b850bd18 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> d."</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d. <xliff:g id="HOURS">%2$d</xliff:g> hod."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> hod."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> hod. <xliff:g id="MINUTES">%2$d</xliff:g> min."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min. <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Bez mena>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(žiadne telefónne číslo)"</string> <string name="unknownName" msgid="6867811765370350269">"Bez názvu"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hlasové ani tiesňové volania nie sú k dispozícii"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Momentálne nie sú v ponuke mobilnej siete na vašom mieste"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Nepodarilo sa pripojiť k sieti"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ak chcete vylepšiť príjem, skúste zmeniť vybraný typ v časti Nastavenia > Sieť a internet > Mobilné siete > Preferovaný typ siete."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Upozornenia"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Presmerovanie hovorov"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Režim tiesňového spätného volania"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Vyhľadávanie služby"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Volanie cez Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Ak chcete volať a odosielať správy prostredníctvom siete Wi-Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi-Fi."</item> + <item msgid="3910386316304772394">"Ak chcete volať a odosielať správy prostredníctvom siete Wi-Fi, kontaktujte najskôr svojho operátora v súvislosti s nastavením tejto služby. Potom opäť zapnite v Nastaveniach volanie cez Wi-Fi. (Kód chyby: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrujte sa so svojím operátorom"</item> @@ -1151,6 +1138,13 @@ <item quantity="other">K dispozícii sú verejné siete Wi-Fi</item> <item quantity="one">K dispozícii je verejná sieť Wi-Fi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Pripojenie k otvorenej sieti Wi-Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Pripája sa k otvorenej sieti Wi-Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Pripojenie k sieti Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"K sieti Wi‑Fi sa nepodarilo pripojiť"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Klepnutím zobrazíte všetky siete"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Pripojiť"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Všetky siete"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prihlásiť sa do siete Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Prihlásenie do siete"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 68678d787d59..457f324e81f2 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"Št. dni: <xliff:g id="DAYS">%1$d</xliff:g>"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> h"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> h"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> s"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> s"</string> <string name="untitled" msgid="4638956954852782576">"<Brez naslova>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ni telefonske številke)"</string> <string name="unknownName" msgid="6867811765370350269">"Neznano"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ni storitve za glasovne klice / klice v sili"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Ta storitev trenutno ni na voljo v mobilnem omrežju na vaši lokaciji"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Povezave z omrežjem ni mogoče vzpostaviti"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Če želite izboljšati sprejem, poskusite zamenjati vrsto omrežja v »Nastavitve« > »Omrežje in internet« > »Mobilna omrežja« > »Prednostna vrsta omrežja«."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Opozorila"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Preusmerjanje klicev"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Način za povratni klic v sili"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Iskanje storitve"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Klicanje prek Wi-Fi-ja"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Če želite klicati ali pošiljati sporočila prek omrežja Wi-Fi, se najprej obrnite na operaterja, da nastavi to storitev. Nato v nastavitvah znova vklopite klicanje prek omrežja Wi-Fi."</item> + <item msgid="3910386316304772394">"Če želite klicati ali pošiljati sporočila prek omrežja Wi-Fi, se najprej obrnite na operaterja, da nastavi to storitev. Nato v nastavitvah znova vklopite klicanje prek omrežja Wi-Fi. (Koda napake: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registracija pri operaterju"</item> @@ -287,7 +274,7 @@ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"dostop do koledarja"</string> <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string> <string name="permgroupdesc_sms" msgid="4656988620100940350">"pošiljanje in ogled sporočil SMS"</string> - <string name="permgrouplab_storage" msgid="1971118770546336966">"Prostor za shranjevanje"</string> + <string name="permgrouplab_storage" msgid="1971118770546336966">"Shramba"</string> <string name="permgroupdesc_storage" msgid="637758554581589203">"dostop do fotografij, predstavnosti in datotek v napravi"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string> <string name="permgroupdesc_microphone" msgid="4988812113943554584">"snemanje zvoka"</string> @@ -1151,6 +1138,13 @@ <item quantity="few">Na voljo so odprta omrežja Wi-Fi</item> <item quantity="other">Na voljo so odprta omrežja Wi-Fi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Vzpostavite povezavo z odprtim omrežjem Wi‑Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Vzpostavljanje povezave z odprtim omrežjem Wi‑Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezava z omrežjem Wi-Fi je vzpostavljena"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Povezave z omrežjem Wi-Fi ni bilo mogoče vzpostaviti"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Dotaknite se, če si želite ogledati vsa omrežja"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Vzpostavi povezavo"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Vsa omrežja"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Prijavite se v omrežje Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Prijava v omrežje"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index 94005852effd..96f3ae6ad728 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"terabajt"</string> <string name="petabyteShort" msgid="5637816680144990219">"petabajt"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ditë"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ditë e <xliff:g id="HOURS">%2$d</xliff:g> orë"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> orë"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> orë e <xliff:g id="MINUTES">%2$d</xliff:g> minuta"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> orë e <xliff:g id="MINUTES">%2$d</xliff:g> minuta"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta e <xliff:g id="SECONDS">%2$d</xliff:g> sekonda"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> minuta e <xliff:g id="SECONDS">%2$d</xliff:g> sekonda"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekonda"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekonda"</string> <string name="untitled" msgid="4638956954852782576">"<Pa titull>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Nuk ka numër telefoni)"</string> <string name="unknownName" msgid="6867811765370350269">"E panjohur"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Nuk ka shërbim zanor/urgjence"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Përkohësisht nuk ofrohet nga rrjeti celular në vendndodhjen tënde"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Rrjeti i paarritshëm"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Për të përmirësuar marrjen e sinjalit, provo të ndryshosh llojin e zgjedhur te Cilësimet > Rrjeti dhe interneti > Lloji i preferuar i rrjetit."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Sinjalizimet"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Transferimi i telefonatave"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Modaliteti i \"Kthimit të telefonatës së urgjencës\""</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Po kërkon për shërbim"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Telefonatë me Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Për të bërë telefonata dhe për të dërguar mesazhe me Wi-Fi, në fillim kërkoji operatorit celular ta konfigurojë këtë shërbim. Më pas aktivizo përsëri telefonatat me Wi-Fi, nga Cilësimet."</item> + <item msgid="3910386316304772394">"Për të bërë telefonata dhe për të dërguar mesazhe nëpërmjet Wi-Fi, në fillim kërkoji operatorit celular të konfigurojë këtë shërbim. Më pas aktivizo përsëri telefonatat me Wi-Fi nga \"Cilësimet\". (Kodi i gabimit: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Regjistrohu me operatorin tënd celular"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Rrjete të hapura Wi-Fi në përdorim</item> <item quantity="one">Rrjet i hapur Wi-Fi në përdorim</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Lidhu me rrjetin e hapur Wi‑Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Po lidhet me rrjetin e hapur Wi‑Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Lidhur me rrjetin e hapur Wi‑Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nuk mund të lidhet me rrjetin Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Trokit për të parë të gjitha rrjetet"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Lidhu"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Të gjitha rrjetet"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Identifikohu në rrjetin Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Identifikohu në rrjet"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index ab369ad77d56..9d5963b79076 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дана"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дан <xliff:g id="HOURS">%2$d</xliff:g> с"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> с"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> с <xliff:g id="MINUTES">%2$d</xliff:g> мин"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> мин"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> мин <xliff:g id="SECONDS">%2$d</xliff:g> сек"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> сек"</string> <string name="untitled" msgid="4638956954852782576">"<Без наслова>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Нема броја телефона)"</string> <string name="unknownName" msgid="6867811765370350269">"Непознато"</string> @@ -96,8 +84,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Нема гласовне услуге/услуге за хитне позиве"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Привремено је онемогућено на мобилној мрежи на вашој локацији"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Повезивање са мрежом није успело"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Да бисте побољшали пријем, пробајте да промените изабрани тип у одељку Подешавања > Мрежа и интернет > Мобилне мреже > Жељени тип мреже."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Обавештења"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Преусмеравање позива"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим за хитан повратни позив"</string> @@ -133,7 +120,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Претраживање услуге"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Позивање преко Wi-Fi-ја"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Да бисте упућивали позиве и слали поруке преко Wi-Fi-ја, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко Wi-Fi-ја."</item> + <item msgid="3910386316304772394">"Да бисте упућивали позиве и слали поруке преко Wi-Fi-ја, прво затражите од мобилног оператера да вам омогући ову услугу. Затим у Подешавањима поново укључите Позивање преко Wi-Fi-ја. (кôд грешке: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Региструјте се код мобилног оператера"</item> @@ -1129,6 +1116,13 @@ <item quantity="few">Отворене Wi-Fi мреже су доступне</item> <item quantity="other">Отворене Wi-Fi мреже су доступне</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Повежите се са отвореном Wi‑Fi мрежом"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Повезујете се са отвореном Wi‑Fi мрежом"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Повезали сте се са Wi‑Fi мрежом"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Повезивање са Wi‑Fi мрежом није успело"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Додирните да бисте видели све мреже"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Повежи"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Све мреже"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Пријављивање на Wi-Fi мрежу"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Пријавите се на мрежу"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index b9f08e2c3085..59f59c62044b 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dagar"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dag <xliff:g id="HOURS">%2$d</xliff:g> tim"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> timmar"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> tim <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> minuter"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sekunder"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sekund"</string> <string name="untitled" msgid="4638956954852782576">"<Okänd>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Inget telefonnummer)"</string> <string name="unknownName" msgid="6867811765370350269">"Okänt"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Tjänster för röst- och nödsamtal har blockerats"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Detta erbjuds för tillfället inte på mobilnätverket där du befinner dig"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Det går inte att nå nätverket"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Testa om du får bättre mottagning genom att ändra till en annan typ under Inställningar > Nätverk och internet > Mobila nätverk > Önskad nätverkstyp."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Aviseringar"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Vidarekoppla samtal"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Läget Återuppringning vid nödsamtal"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Söker efter tjänst"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi-samtal"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Om du vill ringa samtal och skicka meddelanden via Wi-Fi ber du först operatören att konfigurera tjänsten. Därefter kan du aktivera Wi-Fi-samtal på nytt från Inställningar."</item> + <item msgid="3910386316304772394">"Om du vill ringa samtal och skicka meddelanden via Wi-Fi ber du först operatören att konfigurera tjänsten. Därefter kan du aktivera Wi-Fi-samtal på nytt från Inställningar. (Felkod: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Registrera dig hos operatören"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Öppna Wi-Fi-nätverk är tillgängliga</item> <item quantity="one">Öppet Wi-Fi-nätverk är tillgängligt</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Anslut till ett öppet Wi-Fi-nätverk"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ansluter till ett öppet Wi-Fi-nätverk"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Ansluten till Wi-Fi-nätverket"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Det gick inte att ansluta till Wi‑Fi-nätverket"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tryck för att visa alla nätverk"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Anslut"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Alla nätverk"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Logga in på ett Wi-Fi-nätverk"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Logga in på nätverket"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 3f1152604bfc..472867236862 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"Siku <xliff:g id="DAYS">%1$d</xliff:g>"</string> - <string name="durationDayHours" msgid="2713107458736744435">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> - <string name="durationDayHour" msgid="7293789639090958917">"Siku <xliff:g id="DAYS">%1$d</xliff:g> saa <xliff:g id="HOURS">%2$d</xliff:g>"</string> - <string name="durationHours" msgid="4266858287167358988">"Saa <xliff:g id="HOURS">%1$d</xliff:g>"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"Saa <xliff:g id="HOURS">%1$d</xliff:g> dak <xliff:g id="MINUTES">%2$d</xliff:g>"</string> - <string name="durationMinutes" msgid="3134226679883579347">"Dakika <xliff:g id="MINUTES">%1$d</xliff:g>"</string> - <string name="durationMinute" msgid="7155301744174623818">"Dak <xliff:g id="MINUTES">%1$d</xliff:g>"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"Dak <xliff:g id="MINUTES">%1$d</xliff:g> sek <xliff:g id="SECONDS">%2$d</xliff:g>"</string> - <string name="durationSeconds" msgid="8050088505238241405">"Sekunde <xliff:g id="SECONDS">%1$d</xliff:g>"</string> - <string name="durationSecond" msgid="985669622276420331">"Sekunde <xliff:g id="SECONDS">%1$d</xliff:g>"</string> <string name="untitled" msgid="4638956954852782576">"<Haina jina>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Hakuna nambari ya simu)"</string> <string name="unknownName" msgid="6867811765370350269">"Isiyojulikana"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Hakuna huduma ya simu za dharura au za sauti"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Kwa sasa, huduma hii haipatikani katika mtandao wa simu mahali ulipo"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Haiwezi kufikia mtandao"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ili kupata mtandao thabiti, jaribu kubadilisha aina uliyochagua katika Mipangilio > Mtandao na Intaneti > Mitandao ya simu > Aina ya mtandao unaopendelea."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Arifa"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Kupeleka simu kwenye nambari nyingine"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Hali ya kupiga simu za dharura"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Inatafuta Huduma"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Upigaji Simu kwa Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Ili upige simu na kutuma ujumbe kupitia Wi-Fi, mwambie mtoa huduma wako asanidi huduma hii kwanza. Kisha uwashe tena upigaji simu kwa Wi-Fi kutoka kwenye Mipangilio."</item> + <item msgid="3910386316304772394">"Ili upige simu na kutuma ujumbe kupitia Wi-Fi, mwambie mtoa huduma wako aweke mipangilio ya huduma hii kwanza. Kisha uwashe tena kipengele cha kupiga simu kupitia Wi-Fi kwenye Mipangilio. (Msimbo wa hitilafu: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Jisajili na mtoa huduma wako"</item> @@ -1105,6 +1092,13 @@ <item quantity="other">Fungua mitandao ya Wi-Fi inayopatikana</item> <item quantity="one">Fungua mtandao wa Wi-Fi unaopatikana</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Unganisha kwenye mtandao wa Wi‑Fi unaotumiwa na mtu yeyote"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Inaunganisha kwenye mtandao wa Wi‑Fi unaotumiwa na mtu yeyote"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Imeunganisha kwenye mtandao wa Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Imeshindwa kuunganisha kwenye mtandao wa Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Gonga ili uone mitandao yote"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Unganisha"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Mitandao Yote"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Ingia kwa mtandao wa Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Ingia katika mtandao"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index afe5bd93cdfe..e9ced05c9f3f 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"டெ.பை."</string> <string name="petabyteShort" msgid="5637816680144990219">"பெ.பை."</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> நாட்கள்"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> நாள் <xliff:g id="HOURS">%2$d</xliff:g> ம.நே."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ம.நே."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ம.நே. <xliff:g id="MINUTES">%2$d</xliff:g> நிமி."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> மநே <xliff:g id="MINUTES">%2$d</xliff:g> நிமி"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமிடங்கள்"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி <xliff:g id="SECONDS">%2$d</xliff:g> வி"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> நிமி <xliff:g id="SECONDS">%2$d</xliff:g> வி"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> வினாடிகள்"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> வினாடி"</string> <string name="untitled" msgid="4638956954852782576">"<பெயரிடப்படாதது>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(தொலைபேசி எண் இல்லை)"</string> <string name="unknownName" msgid="6867811765370350269">"அறியப்படாதவர்"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"குரல்/அவசரச் சேவை இல்லை"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"தற்காலிகமாக உங்கள் இருப்பிடத்தில் மொபைல் நெட்வொர்க் வழங்கவில்லை"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"பெறுதலை மேம்படுத்த, அமைப்புகள் > நெட்வொர்க் & இணையம் > மொபைல் நெட்வொர்க்குகள் > விரும்பும் நெட்வொர்க் வகை என்பதற்குச் சென்று, தேர்ந்தெடுத்த வகையை மாற்றவும்."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"விழிப்பூட்டல்கள்"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"அழைப்புப் பகிர்வு"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"அவசரகாலத் திரும்ப அழைக்கும் பயன்முறை"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"சேவையைத் தேடுகிறது"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"வைஃபை அழைப்பு"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"வைஃபை மூலம் அழைக்க மற்றும் செய்திகள் அனுப்ப, முதலில் மொபைல் நிறுவனத்திடம் இந்தச் சேவையை அமைக்குமாறு கேட்கவும். பிறகு அமைப்புகளில் மீண்டும் வைஃபை அழைப்பை இயக்கவும்."</item> + <item msgid="3910386316304772394">"வைஃபை மூலம் அழைக்கவும் செய்திகளை அனுப்பவும், முதலில் தொலைத்தொடர்பு நிறுவனத்திடம் இந்தச் சேவையை அமைக்குமாறு கேட்கவும். பிறகு அமைப்புகளில் மீண்டும் வைஃபை அழைப்பை இயக்கவும். (பிழைக் குறியீடு <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"உங்கள் மொபைல் நிறுவனத்தில் பதிவுசெய்யவும்"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">பொது வைஃபை நெட்வொர்க்குகள் உள்ளன</item> <item quantity="one">பொது வைஃபை நெட்வொர்க் உள்ளது</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"திறந்த வைஃபை நெட்வொர்க்குடன் இணைக்கவும்"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"திறந்த வைஃபை நெட்வொர்க்குடன் இணைக்கிறது"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"வைஃபை நெட்வொர்க்குடன் இணைக்கப்பட்டது"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"வைஃபை நெட்வொர்க்குடன் இணைக்க முடியவில்லை"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"எல்லா நெட்வொர்க்குகளையும் பார்க்க, தட்டவும்"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"இணை"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"எல்லா நெட்வொர்க்குகளும்"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"வைஃபை நெட்வொர்க்கில் உள்நுழையவும்"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"நெட்வொர்க்கில் உள்நுழையவும்"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index 553fde17a7bf..375c82db7c5d 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> రోజులు"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> రో <xliff:g id="HOURS">%2$d</xliff:g> గం"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> గంటలు"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> గం <xliff:g id="MINUTES">%2$d</xliff:g> నిమి"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> గం <xliff:g id="MINUTES">%2$d</xliff:g> నిమి"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమిషాలు"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి <xliff:g id="SECONDS">%2$d</xliff:g> సె"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> నిమి <xliff:g id="SECONDS">%2$d</xliff:g> సె"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> సెకన్లు"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> సెకను"</string> <string name="untitled" msgid="4638956954852782576">"<శీర్షిక లేనిది>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ఫోన్ నంబర్ లేదు)"</string> <string name="unknownName" msgid="6867811765370350269">"తెలియదు"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"వాయిస్/అత్యవసర సేవ లేదు"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"మీ స్థానంలో మొబైల్ నెట్వర్క్ ద్వారా తాత్కాలికంగా అందించబడదు"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"నెట్వర్క్ను చేరుకోలేరు"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"స్వీకరణను మెరుగుపరచాలంటే, సెట్టింగ్లు > నెట్వర్క్ & ఇంటర్నెట్ > మొబైల్ నెట్వర్క్లు > ప్రాధాన్య నెట్వర్క్ రకంలో మీరు ఎంచుకున్న రకాన్ని మార్చి ప్రయత్నించండి."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"హెచ్చరికలు"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"కాల్ ఫార్వార్డింగ్"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"అత్యవసర కాల్బ్యాక్ మోడ్"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"సేవ కోసం శోధిస్తోంది"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi కాలింగ్"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fiలో కాల్లు చేయడం మరియు సందేశాలు పంపడం కోసం ముందుగా ఈ సేవను సెటప్ చేయడానికి మీ క్యారియర్ను అడగండి. ఆపై సెట్టింగ్ల నుండి మళ్లీ Wi-Fi కాలింగ్ను ఆన్ చేయండి."</item> + <item msgid="3910386316304772394">"Wi-Fiతో కాల్లను చేయడానికి మరియు సందేశాలను పంపించడానికి, మొదట ఈ సేవను సెటప్ చేయాల్సిందిగా మీ క్యారియర్కి చెప్పండి. ఆ తర్వాత సెట్టింగ్ల నుండి Wi-Fi కాలింగ్ని మళ్లీ ఆన్ చేయండి. (లోపం కోడ్: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"మీ క్యారియర్తో నమోదు చేయండి"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">ఓపెన్ Wi-Fi నెట్వర్క్లు అందుబాటులో ఉన్నాయి</item> <item quantity="one">ఓపెన్ Wi-Fi నెట్వర్క్ అందుబాటులో ఉంది</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"బహిరంగ Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయండి"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"బహిరంగ Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేస్తోంది"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయబడింది"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi నెట్వర్క్కు కనెక్ట్ చేయడం సాధ్యపడలేదు"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"అన్ని నెట్వర్క్లు చూడటానికి నొక్కండి"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"కనెక్ట్ చేయి"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"అన్ని నెట్వర్క్లు"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi నెట్వర్క్కి సైన్ ఇన్ చేయండి"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"నెట్వర్క్కి సైన్ ఇన్ చేయండి"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index f4d7779ad1b8..9a58edd997e7 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> วัน"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> วัน <xliff:g id="HOURS">%2$d</xliff:g> ชม."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> ชม."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ชม. <xliff:g id="MINUTES">%2$d</xliff:g> นาที"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> นาที <xliff:g id="SECONDS">%2$d</xliff:g> วิ."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> วินาที"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> วินาที"</string> <string name="untitled" msgid="4638956954852782576">"<ไม่มีชื่อ>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(ไม่มีหมายเลขโทรศัพท์)"</string> <string name="unknownName" msgid="6867811765370350269">"ไม่ทราบ"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"ไม่มีบริการเสียง/บริการฉุกเฉิน"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"งดให้บริการชั่วคราวโดยเครือข่ายมือถือในตำแหน่งของคุณ"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"เข้าถึงเครือข่ายไม่ได้"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ลองเปลี่ยนประเภทที่เลือกใน \"การตั้งค่า\" > \"เครือข่ายและอินเทอร์เน็ต\" > \"เครือข่ายมือถือ\" > \"ประเภทเครือข่ายที่ต้องการ\" เพื่อให้การรับสัญญาณดีขึ้น"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"การแจ้งเตือน"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"การโอนสาย"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"โหมดติดต่อกลับฉุกเฉิน"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"กำลังค้นหาบริการ"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"การโทรผ่าน Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"หากต้องการโทรออกและส่งข้อความผ่าน Wi-Fi โปรดสอบถามผู้ให้บริการของคุณก่อนเพื่อตั้งค่าบริการนี้ แล้วเปิดการโทรผ่าน Wi-Fi อีกครั้งจากการตั้งค่า"</item> + <item msgid="3910386316304772394">"หากต้องการโทรออกและส่งข้อความผ่าน Wi-Fi โปรดสอบถามผู้ให้บริการของคุณก่อนเพื่อตั้งค่าบริการนี้ แล้วเปิดการโทรผ่าน Wi-Fi อีกครั้งจากการตั้งค่า (รหัสข้อผิดพลาด: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"ลงทะเบียนกับผู้ให้บริการ"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">มีหลายเครือข่าย Wi-Fi สาธารณะที่ใช้งานได้</item> <item quantity="one">มี 1 เครือข่าย Wi-Fi สาธารณะที่ใช้งานได้</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"เชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"กำลังเชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"เชื่อมต่อเครือข่าย Wi-Fi แล้ว"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ไม่สามารถเชื่อมต่อเครือข่าย Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"แตะเพื่อดูเครือข่ายทั้งหมด"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"เชื่อมต่อ"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"เครือข่ายทั้งหมด"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"ลงชื่อเข้าใช้เครือข่าย WiFi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"ลงชื่อเข้าใช้เครือข่าย"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 0d79441c3697..2c33a0f930f9 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> (na) araw"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> day <xliff:g id="HOURS">%2$d</xliff:g> hr"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> (na) oras"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> oras <xliff:g id="MINUTES">%2$d</xliff:g> min"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> (na) min"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> seg"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> (na) seg"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> (na) seg"</string> <string name="untitled" msgid="4638956954852782576">"<Walang pamagat>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Walang numero ng telepono)"</string> <string name="unknownName" msgid="6867811765370350269">"Hindi alam"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Walang serbisyo para sa voice/emergency"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Pansamantalang hindi inaalok ng mobile network sa iyong lokasyon"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Hindi maabot ang network"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Upang mapahusay ang reception, subukang baguhin ang uring napili sa Mga Setting > Network at Internet > Mga mobile network > Gustong uri ng network."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Mga Alerto"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Pagpasa ng tawag"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Emergency callback mode"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Naghahanap ng Serbisyo"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Pagtawag sa pamamagitan ng Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Upang tumawag at magpadala ng mga mensahe sa pamamagitan ng Wi-Fi, hilingin muna sa iyong carrier na i-set up ang serbisyong ito. Pagkatapos ay muling i-on ang pagtawag sa Wi-Fi mula sa Mga Setting."</item> + <item msgid="3910386316304772394">"Upang makatawag at makapagpadala ng mga mensahe sa Wi-Fi, hilingin muna sa iyong carrier na i-set up ang serbisyong ito. Pagkatapos ay i-on muli ang pagtawag gamit ang Wi-Fi mula sa Mga Setting. (Error code: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Magparehistro sa iyong carrier"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Available ang mga bukas na Wi-Fi network</item> <item quantity="other">Available ang mga bukas na Wi-Fi network</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Kumonekta sa bukas na Wi‑Fi network"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kumokonekta sa bukas na Wi‑Fi network"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Nakakonekta sa Wi‑Fi network"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Hindi makakonekta sa Wi‑Fi network"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"I-tap upang makita ang lahat ng network"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Kumonekta"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Lahat ng Network"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Mag-sign in sa Wi-Fi network"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Mag-sign in sa network"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 9c8d3edff51b..8c4c4277bfeb 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> gün"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> gün <xliff:g id="HOURS">%2$d</xliff:g> sa."</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> sa."</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> sa. <xliff:g id="MINUTES">%2$d</xliff:g> dk."</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> dk."</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> dk."</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> dk. <xliff:g id="SECONDS">%2$d</xliff:g> sn."</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sn."</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sn."</string> <string name="untitled" msgid="4638956954852782576">"<Adsız>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon numarası yok)"</string> <string name="unknownName" msgid="6867811765370350269">"Bilinmiyor"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ses/acil durum hizmeti yok"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Bulunduğunuz yerdeki mobil ağ tarafından geçici olarak sunulmuyor"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ağa erişilemiyor"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Sinyal gücünü iyileştirmek için Ayarlar > Ağ ve İnternet > Mobil ağlar > Tercih edilen ağ türü bölümünde seçili türü değiştirmeyi deneyin."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Uyarılar"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Çağrı yönlendirme"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Acil geri arama modu"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Hizmet Aranıyor"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Kablosuz Çağrı"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Kablosuz ağ üzerinden telefon etmek ve ileti göndermek için ilk önce operatörünüzden bu hizmeti ayarlamasını isteyin. Sonra tekrar Ayarlar\'dan Kablosuz çağrı özelliğini açın."</item> + <item msgid="3910386316304772394">"Kablosuz ağ üzerinden telefon etmek ve mesaj göndermek için öncelikle operatörünüzden bu hizmeti ayarlamasını isteyin. Sonra, Ayarlar\'dan Kablosuz çağrı özelliğini tekrar açın. (Hata kodu: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Operatörünüze kaydolun"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Kullanılabilir Kablosuz ağları aç</item> <item quantity="one">Kullanılabilir Kablosuz ağı aç</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Açık kablosuz ağa bağlanın"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Açık kablosuz ağa bağlandı"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Kablosuz ağa bağlanıldı"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kablosuz ağa bağlanamadı"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Tüm ağları görmek için dokunun"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Bağlan"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tüm Ağlar"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Kablosuz ağda oturum açın"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Ağda oturum açın"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index f90b25274a03..79bf1f9f6d1f 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"Тб"</string> <string name="petabyteShort" msgid="5637816680144990219">"Пб"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> дн."</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> день <xliff:g id="HOURS">%2$d</xliff:g> год"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> дн. <xliff:g id="HOURS">%2$d</xliff:g> год"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> год"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> год <xliff:g id="MINUTES">%2$d</xliff:g> хв"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> хв"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> хв <xliff:g id="SECONDS">%2$d</xliff:g> с"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> с"</string> <string name="untitled" msgid="4638956954852782576">"<Без назви>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Немає номера тел.)"</string> <string name="unknownName" msgid="6867811765370350269">"Невідомо"</string> @@ -97,8 +85,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Немає голосової/екстреної служби"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Тимчасово не пропонується мобільною мережею у вашому місцезнаходженні"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Не вдається під’єднатися до мережі"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Щоб покращити прийняття сигналу, змініть тип у меню \"Налаштування\" > \"Мережа й Інтернет\" > \"Мобільні мережі\" > \"Тип мережі\"."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Сповіщення"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Переадресація виклику"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Режим екстреного зворотного виклику"</string> @@ -134,7 +121,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Пошук служби"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Дзвінок через Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Щоб телефонувати або надсилати повідомлення через Wi-Fi, спочатку попросіть свого оператора налаштувати цю послугу. Після цього ввімкніть дзвінки через Wi-Fi у налаштуваннях."</item> + <item msgid="3910386316304772394">"Щоб телефонувати або надсилати повідомлення через Wi-Fi, спершу попросіть свого оператора налаштувати цю послугу. Після цього знову ввімкніть дзвінки через Wi-Fi у налаштуваннях. (Код помилки: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Зареєструйтеся в оператора"</item> @@ -1151,6 +1138,13 @@ <item quantity="many">Відкриті мережі Wi-Fi доступні</item> <item quantity="other">Відкриті мережі Wi-Fi доступні</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Під’єднайтеся до відкритої мережі Wi-Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Під’єднання до відкритої мережі Wi-Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Під’єднано до мережі Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не вдалося під’єднатися до мережі Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Торкніться, щоб побачити всі мережі"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Під’єднатися"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Усі мережі"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Вхід у мережу Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Вхід у мережу"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index 8c7026cf9f0e..38353f142e3d 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> دن"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹے"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> دن <xliff:g id="HOURS">%2$d</xliff:g> گھنٹہ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹے"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹہ <xliff:g id="MINUTES">%2$d</xliff:g> منٹ"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> گھنٹہ <xliff:g id="MINUTES">%2$d</xliff:g> منٹ"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ <xliff:g id="SECONDS">%2$d</xliff:g> سیکنڈ"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> منٹ <xliff:g id="SECONDS">%2$d</xliff:g> سیکنڈ"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> سیکنڈ"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> سیکنڈ"</string> <string name="untitled" msgid="4638956954852782576">">بلا عنوان<"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(کوئی فون نمبر نہیں ہے)"</string> <string name="unknownName" msgid="6867811765370350269">"نامعلوم"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"کوئی صوتی/ہنگامی سروس نہیں"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"عارضی طور پر آپ کے مقام پر موبائل نیٹ ورک کی طرف سے پیش نہیں ہے"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"نیٹ ورک تک نہیں پہنچا جا سکتا"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"ریسپشن کو بہتر بنانے کیلئے، ترتیبات > نیٹ ورک اور انٹرنیٹ > موبائل نیٹ ورکس > ترجیحی نیٹ ورک کی قسم تبدیل کرنے کی کوشش کریں۔"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"الرٹس"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"کال آگے منتقل کرنا"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"ہنگامی کال بیک وضع"</string> @@ -131,9 +118,7 @@ <string name="roamingText12" msgid="1189071119992726320">"رومنگ بینر آف"</string> <string name="roamingTextSearching" msgid="8360141885972279963">"سروس کی تلاش کر رہا ہے"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi کالنگ"</string> - <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi سے کالز کرنے اور پیغامات بھیجنے کیلئے، پہلے اپنے کیریئر سے اس سروس کو ترتیب دینے کیلئے کہیں۔ پھر ترتیبات سے دوبارہ Wi-Fi کالنگ آن کریں۔"</item> - </string-array> + <!-- no translation found for wfcOperatorErrorAlertMessages:0 (3910386316304772394) --> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"اپنے کیریئر کے ساتھ رجسٹر کریں"</item> </string-array> @@ -1107,6 +1092,13 @@ <item quantity="other">عوامی Wi-Fi نیٹ ورکس دستیاب ہیں</item> <item quantity="one">عوامی Wi-Fi نیٹ ورک دستیاب ہے</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہوں"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہو رہا ہے"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"عوامی Wi‑Fi نیٹ ورک سے منسلک ہو گيا"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi نیٹ ورک سے منسلک نہیں ہو سکا"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"تمام نیٹ ورکس دیکھنے کیلئے تھپتھپائيں"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"منسلک کریں"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"تمام نیٹ ورکس"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi نیٹ ورک میں سائن ان کریں"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"نیٹ ورک میں سائن ان کریں"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 1d6e313d6ba7..b20440117fb1 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> kun"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> kun <xliff:g id="HOURS">%2$d</xliff:g> soat"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> soat"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> soat <xliff:g id="MINUTES">%2$d</xliff:g> daq"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> soat <xliff:g id="MINUTES">%2$d</xliff:g> daq"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> daqiqa"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> daqiqa"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> daq <xliff:g id="SECONDS">%2$d</xliff:g> son"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> daq <xliff:g id="SECONDS">%2$d</xliff:g> son"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> soniya"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> soniya"</string> <string name="untitled" msgid="4638956954852782576">"<Nomsiz>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Telefon raqami yo‘q)"</string> <string name="unknownName" msgid="6867811765370350269">"Noma’lum"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ovozli va favqulodda chaqiruvlar ishlamaydi"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Hududingizda mobil tarmoq tomonidan vaqtinchalik taklif etilmayapti"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Tarmoq bilan bog‘lanib bo‘lmadi"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Qabul qilish sifatini yaxshilash uchun Sozlamalar > Tarmoq va Internet > Mobil tarmoqlar > Asosiy tarmoq turi orqali o‘zgartirib ko‘ring."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Ogohlantirishlar"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Chaqiruvlarni uzatish"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Favqulodda qaytarib chaqirish rejimi"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Xizmatlar qidirilmoqda"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi qo‘ng‘iroq"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Wi-Fi orqali qo‘ng‘iroqlarni amalga oshirish va xabarlar bilan almashinish uchun uyali aloqa operatoringizdan ushbu xizmatni yoqib qo‘yishni so‘rashingiz lozim. Keyin sozlamalarda Wi-Fi qo‘ng‘irog‘i imkoniyatini yoqib olishingiz mumkin."</item> + <item msgid="3910386316304772394">"Wi-Fi orqali qo‘ng‘iroqlarni amalga oshirish va xabarlar bilan almashinish uchun uyali aloqa operatoringizdan ushbu xizmatni yoqib qo‘yishni so‘rashingiz lozim. Keyin sozlamalarda Wi-Fi qo‘ng‘irog‘i imkoniyatini yoqib olishingiz mumkin. (Xato kodi: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Mobil operatoringiz yordamida ro‘yxatdan o‘ting"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Ochiq Wi-Fi tarmoqlari aniqlandi</item> <item quantity="one">Ochiq Wi-Fi tarmog‘i aniqlandi</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Ochiq Wi‑Fi tarmoqqa ulaning"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ochiq Wi‑Fi tarmoqqa ulanilmoqda"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi tarmoqqa ulanildi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi tarmoqqa ulanib bo‘lmadi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Barcha tarmoqlarni ko‘rish uchun bosing"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Ulanish"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Barcha tarmoqlar"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Wi-Fi tarmoqqa kirish"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Tarmoqqa kirish"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> @@ -1441,7 +1435,7 @@ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", xavfsiz"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Grafik kalit esimdan chiqdi"</string> - <string name="kg_wrong_pattern" msgid="1850806070801358830">"Grafik kalit noto‘g‘ri"</string> + <string name="kg_wrong_pattern" msgid="1850806070801358830">"Grafik kalit xato"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Parol noto‘g‘ri"</string> <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN-kod noto‘g‘ri"</string> <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index fc36ab6cf8c1..689c31f00cbe 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> ngày"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> ngày <xliff:g id="HOURS">%2$d</xliff:g> giờ"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> giờ"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> giờ <xliff:g id="MINUTES">%2$d</xliff:g> phút"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> phút"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> phút"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> phút <xliff:g id="SECONDS">%2$d</xliff:g> giây"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> giây"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> giây"</string> <string name="untitled" msgid="4638956954852782576">"<Không có tiêu đề>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Không có số điện thoại nào)"</string> <string name="unknownName" msgid="6867811765370350269">"Không xác định"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Không có dịch vụ thoại/khẩn cấp"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Tạm thời không được cung cấp bởi mạng di động tại vị trí của bạn"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Không thể kết nối mạng"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Để cải thiện khả năng thu tín hiệu, hãy thử thay đổi loại mạng được chọn trong Cài đặt > Mạng và Internet > Mạng di động > Loại mạng ưa thích."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Thông báo"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Chuyển tiếp cuộc gọi"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Chế độ gọi lại khẩn cấp"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Đang tìm kiếm Dịch vụ"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Gọi qua Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Để gọi điện và gửi tin nhắn qua Wi-Fi, trước tiên hãy yêu cầu nhà cung cấp dịch vụ của bạn thiết lập dịch vụ này. Sau đó, bật lại gọi qua Wi-Fi từ Cài đặt."</item> + <item msgid="3910386316304772394">"Để gọi điện và gửi tin nhắn qua Wi-Fi, trước tiên hãy yêu cầu nhà cung cấp dịch vụ của bạn thiết lập dịch vụ này. Sau đó, bật lại gọi qua Wi-Fi từ Cài đặt. (Mã lỗi: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Đăng ký với nhà cung cấp dịch vụ của bạn"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">Mở các mạng Wi-Fi khả dụng</item> <item quantity="one">Mở mạng Wi-Fi khả dụng</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Kết nối với mạng Wi-Fi đang mở"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Đang kết nối với mạng Wi‑Fi đang mở"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Đã kết nối với mạng Wi-Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Không thể kết nối với mạng Wi‑Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Nhấn để xem tất cả các mạng"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Kết nối"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Tất cả các mạng"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Đăng nhập vào mạng Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Đăng nhập vào mạng"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 77e594d87269..d22c09cc9537 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g>天"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g>天<xliff:g id="HOURS">%2$d</xliff:g>小时"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g>小时"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g>小时<xliff:g id="MINUTES">%2$d</xliff:g>分钟"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> 分钟"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g>分钟<xliff:g id="SECONDS">%2$d</xliff:g>秒"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g>秒"</string> <string name="untitled" msgid="4638956954852782576">"<未命名>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(无电话号码)"</string> <string name="unknownName" msgid="6867811765370350269">"未知"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"无法使用语音通话/紧急呼救服务"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的移动网络暂时不提供这项服务"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"无法连接网络"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"要改善信号情况,请尝试更改在“设置”>“网络和互联网”>“移动网络”>“首选网络类型”中选择的类型。"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"提醒"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"来电转接"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"紧急回拨模式"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"正在搜索服务"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"WLAN 通话"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"要通过 WLAN 打电话和发信息,请先让您的运营商开通此服务,然后再到“设置”中重新开启 WLAN 通话功能。"</item> + <item msgid="3910386316304772394">"要通过 WLAN 打电话和发信息,请先让您的运营商开通此服务,然后再到“设置”中重新开启 WLAN 通话功能(错误代码:<xliff:g id="CODE">%1$s</xliff:g>)。"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"向您的运营商注册"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">有可用的开放 WLAN 网络</item> <item quantity="one">有可用的开放 WLAN 网络</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"连接到开放的 WLAN 网络"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在连接到开放的 WLAN 网络"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"已连接到 WLAN 网络"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"无法连接到 WLAN 网络"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"点按即可查看所有网络"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"连接"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"所有网络"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"登录到WLAN网络"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"登录到网络"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 3bd4e812ea2f..76187d8fe647 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> 小時"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> <string name="untitled" msgid="4638956954852782576">"<未命名>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(沒有電話號碼)"</string> <string name="unknownName" msgid="6867811765370350269">"不明"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"沒有語音/緊急服務"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"您所在位置的流動網絡暫不提供這項服務"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連接網絡"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"如要改善接收品質,請前往 [設定] > [網絡與互聯網] > [流動網絡] > [偏好的網絡類型],然後選取其他網路類型。"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"通知"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉駁"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 通話"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"如要透過 Wi-Fi 撥打電話及傳送訊息,請先向您的流動網絡供應商要求設定此服務。然後再次在「設定」中開啟 Wi-Fi 通話。"</item> + <item msgid="3910386316304772394">"如要透過 Wi-Fi 撥打電話和傳送訊息,請先向流動網絡供應商要求設定此服務,然後再次在「設定」中開啟「Wi-Fi 通話」。(錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"向您的流動網絡供應商註冊"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">有可用的公開 Wi-Fi 網絡</item> <item quantity="one">有可用的公開 Wi-Fi 網絡</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi-Fi 網絡"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在連線至開放的 Wi-Fi 網絡"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網絡"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi-Fi 網絡"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕按即可查看所有網絡"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"所有網絡"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"登入 Wi-Fi 網絡"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"登入網絡"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 07fdd0d12a5a..3af73739bd95 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> 天"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> 天 <xliff:g id="HOURS">%2$d</xliff:g> 小時"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> 小時"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> 小時 <xliff:g id="MINUTES">%2$d</xliff:g> 分鐘"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> 分鐘 <xliff:g id="SECONDS">%2$d</xliff:g> 秒"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> 秒"</string> <string name="untitled" msgid="4638956954852782576">"<未命名>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(沒有電話號碼)"</string> <string name="unknownName" msgid="6867811765370350269">"不明"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"無法使用語音/緊急通話服務"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"你所在位置的行動網路暫時不提供這項服務"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"無法連上網路"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"如要改善收訊狀況,請依序開啟 [設定] > [網路與網際網路] > [行動網路] > [偏好的網路類型],然後選取其他網路類型。"</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"快訊"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"來電轉接"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"緊急回撥模式"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"正在搜尋服務"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Wi-Fi 通話"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"如要透過 Wi-FI 撥打電話及傳送訊息,請先要求你的電信業者開通這項服務,然後再到「設定」啟用 Wi-Fi 通話功能。"</item> + <item msgid="3910386316304772394">"如要透過 Wi-Fi 網路撥打電話及傳送訊息,請先要求電信業者為你設定這項服務,然後再次前往「設定」頁面啟用 Wi-Fi 通話功能。(錯誤代碼:<xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"向你的電信業者註冊"</item> @@ -1107,6 +1094,13 @@ <item quantity="other">有多個可用的開放 Wi-Fi 網路</item> <item quantity="one">有多個可用的開放 Wi-Fi 網路</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi‑Fi 網路"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在連線至開放的 Wi‑Fi 網路"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網路"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi‑Fi 網路"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"輕觸即可查看所有網路"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"連線"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"所有網路"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"登入 Wi-Fi 網路"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"登入網路"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> @@ -1189,7 +1183,7 @@ <string name="usb_unsupported_audio_accessory_title" msgid="2256529893240208458">"不支援的音訊配件"</string> <string name="usb_unsupported_audio_accessory_message" msgid="7811865061127547035">"輕觸即可瞭解詳情"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string> - <string name="adb_active_notification_message" msgid="4948470599328424059">"輕觸即可停用 USB 偵錯。"</string> + <string name="adb_active_notification_message" msgid="4948470599328424059">"輕觸即可停用 USB 偵錯功能。"</string> <string name="adb_active_notification_message" product="tv" msgid="8470296818270110396">"選取以停用 USB 偵錯。"</string> <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"正在接收錯誤報告…"</string> <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"要分享錯誤報告嗎?"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index e96cf2444c83..77bcd8402b3f 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -27,18 +27,6 @@ <string name="terabyteShort" msgid="231613018159186962">"TB"</string> <string name="petabyteShort" msgid="5637816680144990219">"PB"</string> <string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string> - <string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> izinsuku"</string> - <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> amahora"</string> - <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> usuku <xliff:g id="HOURS">%2$d</xliff:g> ihora"</string> - <string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> amahora"</string> - <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> amaminithi"</string> - <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> ihora <xliff:g id="MINUTES">%2$d</xliff:g> iminithi"</string> - <string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> amaminithi"</string> - <string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi"</string> - <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> amasekhondi"</string> - <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> iminithi <xliff:g id="SECONDS">%2$d</xliff:g> isekhondi"</string> - <string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> amasekhondi"</string> - <string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> isekhondi"</string> <string name="untitled" msgid="4638956954852782576">"<Akunasihloko>"</string> <string name="emptyPhoneNumber" msgid="7694063042079676517">"(Ayikho inombolo yefoni)"</string> <string name="unknownName" msgid="6867811765370350269">"Akwaziwa"</string> @@ -95,8 +83,7 @@ <string name="RestrictedOnAllVoiceTitle" msgid="158800171499150681">"Ayikho isevisi yezwi/yesimo esiphuthumayo"</string> <string name="RestrictedStateContent" msgid="4278821484643362350">"Okwesikhashana akunikezwa inethiwekhi yeselula endaweni yakho"</string> <string name="NetworkPreferenceSwitchTitle" msgid="4008877505368566980">"Ayikwazi ukufinyelela inethiwekhi"</string> - <!-- no translation found for NetworkPreferenceSwitchSummary (1203771446683319957) --> - <skip /> + <string name="NetworkPreferenceSwitchSummary" msgid="1203771446683319957">"Ukuze uthuthukise ukwamukelwa, zama ukushintsha uhlobo olukhethiwe kuzilungiselelo > Inethiwekhi ne-inthanethi > amanethiwekhi eselula > Uhlobo oluncanyelwayo lwenethiwekhi."</string> <string name="notification_channel_network_alert" msgid="4427736684338074967">"Izexwayiso"</string> <string name="notification_channel_call_forward" msgid="2419697808481833249">"Ukudlulisa ikholi"</string> <string name="notification_channel_emergency_callback" msgid="6686166232265733921">"Imodi yokushayela yesimo esiphuthumayo"</string> @@ -132,7 +119,7 @@ <string name="roamingTextSearching" msgid="8360141885972279963">"Iseshela Isevisi"</string> <string name="wfcRegErrorTitle" msgid="2301376280632110664">"Ukushaya kwe-Wi-Fi"</string> <string-array name="wfcOperatorErrorAlertMessages"> - <item msgid="2254967670088539682">"Ukuze wenze amakholi uphinde uthumele imilayezo nge-Wi-FI, qala ucele inkampani yakho yenethiwekhi ukuthi isethe le divayisi. Bese uvula ukushaya kwe-Wi-FI futhi kusukela kuzilungiselelo."</item> + <item msgid="3910386316304772394">"Ukuze wenze amakholi uphinde uthumele imilayezo nge-Wi-Fi, qala ucele inkampani yakho yenethiwekhi ukuthi isethe le sevisi. Bese uvula ukushaya kwe-Wi-Fi futhi kusukela kuzilungiselelo (Ikhodi yephutha: <xliff:g id="CODE">%1$s</xliff:g>)"</item> </string-array> <string-array name="wfcOperatorErrorNotificationMessages"> <item msgid="6177300162212449033">"Bhalisa ngenkampani yakho yenethiwekhi"</item> @@ -1107,6 +1094,13 @@ <item quantity="one">Vula amanethiwekhi we-Wi-Fi atholakalayo</item> <item quantity="other">Vula amanethiwekhi we-Wi-Fi atholakalayo</item> </plurals> + <string name="wifi_available_title" msgid="3817100557900599505">"Xhuma kunethiwekhi evulekile ye-Wi‑Fi"</string> + <string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ixhuma kunethiwekhi evulekile ye-Wi‑Fi"</string> + <string name="wifi_available_title_connected" msgid="7542672851522241548">"Kuxhumeke kunethiwekhi ye-Wi‑Fi"</string> + <string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ayikwazanga ukuxhumeka kunethiwekhi ye-Wi-Fi"</string> + <string name="wifi_available_content_failed_to_connect" msgid="3377406637062802645">"Thepha ukuze ubone onke amanethiwekhi"</string> + <string name="wifi_available_action_connect" msgid="2635699628459488788">"Xhuma"</string> + <string name="wifi_available_action_all_networks" msgid="1100098935861622985">"Onke amanethiwekhi"</string> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Ngena ngemvume kunethiwekhi ye-Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Ngena ngemvume kunethiwekhi"</string> <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) --> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 5e2334d20da1..fa33d567983e 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -67,6 +67,9 @@ <!-- The amount to leave on-screen when the PIP is minimized. --> <dimen name="pip_minimized_visible_size">48dp</dimen> + <!-- The the PIP decelerates at while moving from a fling. --> + <dimen name="pip_fling_deceleration">-3000dp</dimen> + <!-- Min width for a tablet device --> <dimen name="min_xlarge_screen_width">800dp</dimen> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 4868774723f4..48e667a06aa0 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2825,6 +2825,23 @@ <public type="string" name="paste_as_plain_text" id="0x01040019" /> + <!-- =============================================================== + Resources added in version O MR1 of the platform + + NOTE: add <public> elements within a <public-group> like so: + + <public-group type="attr" first-id="0x01010531"> + <public name="exampleAttr1" /> + <public name="exampleAttr2" /> + </public-group> + + To add a new public-group block, choose an id value that is 1 greater + than the last of that item above. For example, the last "attr" id + value above is 0x01010530, so the public-group of attrs below has + the id value of 0x01010531. + =============================================================== --> + <eat-comment /> + <public-group type="attr" first-id="0x01010569"> </public-group> @@ -2835,6 +2852,7 @@ </public-group> <public-group type="string" first-id="0x0104001a"> + <public name="autofill"/> </public-group> <!-- =============================================================== diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 2e9bd0897b69..18e8af7836d2 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -4671,6 +4671,9 @@ <!-- Primary ETWS (Earthquake and Tsunami Warning System) default message for test --> <string name="etws_primary_default_message_test">Emergency messages test</string> + <!-- Content description for the reply button in the notification area [CHAR LIMIT=NONE]--> + <string name="notification_reply_button_accessibility">Reply</string> + <!-- Primary ETWS (Earthquake and Tsunami Warning System) default message for others --> <string name="etws_primary_default_message_others"></string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d5d35c9f6f6a..2599b2a84d07 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1570,6 +1570,7 @@ <java-symbol type="dimen" name="docked_stack_divider_insets" /> <java-symbol type="dimen" name="docked_stack_minimize_thickness" /> <java-symbol type="dimen" name="pip_minimized_visible_size" /> + <java-symbol type="dimen" name="pip_fling_deceleration" /> <java-symbol type="integer" name="config_dockedStackDividerSnapMode" /> <java-symbol type="integer" name="config_pictureInPictureSnapMode" /> <java-symbol type="fraction" name="docked_stack_divider_fixed_ratio" /> @@ -3042,6 +3043,8 @@ <java-symbol type="drawable" name="stat_sys_vitals" /> + <java-symbol type="color" name="text_color_primary" /> + <java-symbol type="array" name="config_batteryPackageTypeSystem" /> <java-symbol type="array" name="config_batteryPackageTypeService" /> diff --git a/core/tests/coretests/res/layout/activity_editor_cursor_test.xml b/core/tests/coretests/res/layout/activity_editor_cursor_test.xml new file mode 100644 index 000000000000..45a9318cb4ec --- /dev/null +++ b/core/tests/coretests/res/layout/activity_editor_cursor_test.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ Copyright (C) 2017 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 + --> + +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <EditText + android:id="@+id/edittext" + android:layout_width="200px" + android:layout_height="wrap_content" + android:padding="15px" + android:lines="1" + android:singleLine="true" + android:textSize="30px"/> + +</FrameLayout> diff --git a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java index 423d45ea520a..0a89b7409250 100644 --- a/core/tests/coretests/src/android/content/pm/PackageManagerTests.java +++ b/core/tests/coretests/src/android/content/pm/PackageManagerTests.java @@ -25,11 +25,14 @@ import static android.system.OsConstants.S_ISDIR; import static android.system.OsConstants.S_IXGRP; import static android.system.OsConstants.S_IXOTH; -import android.app.PackageInstallObserver; import android.content.BroadcastReceiver; import android.content.Context; +import android.content.IIntentReceiver; +import android.content.IIntentSender; import android.content.Intent; import android.content.IntentFilter; +import android.content.IntentSender; +import android.content.pm.PackageInstaller.SessionParams; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageParser.PackageParserException; import android.content.res.Resources; @@ -46,7 +49,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.StatFs; import android.os.SystemClock; -import android.os.UserManager; import android.os.storage.IStorageManager; import android.os.storage.StorageListener; import android.os.storage.StorageManager; @@ -67,9 +69,13 @@ import com.android.internal.content.PackageHelper; import dalvik.system.VMRuntime; +import libcore.io.IoUtils; + import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; @@ -77,6 +83,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.SynchronousQueue; import java.util.concurrent.TimeUnit; public class PackageManagerTests extends AndroidTestCase { @@ -130,29 +137,7 @@ public class PackageManagerTests extends AndroidTestCase { super.tearDown(); } - private class TestInstallObserver extends PackageInstallObserver { - public int returnCode; - - private boolean doneFlag = false; - - @Override - public void onPackageInstalled(String basePackageName, int returnCode, String msg, - Bundle extras) { - Log.d(TAG, "onPackageInstalled: code=" + returnCode + ", msg=" + msg + ", extras=" - + extras); - synchronized (this) { - this.returnCode = returnCode; - doneFlag = true; - notifyAll(); - } - } - - public boolean isDone() { - return doneFlag; - } - } - - abstract class GenericReceiver extends BroadcastReceiver { + private abstract static class GenericReceiver extends BroadcastReceiver { private boolean doneFlag = false; boolean received = false; @@ -184,7 +169,7 @@ public class PackageManagerTests extends AndroidTestCase { } } - class InstallReceiver extends GenericReceiver { + private static class InstallReceiver extends GenericReceiver { String pkgName; InstallReceiver(String pkgName) { @@ -208,100 +193,152 @@ public class PackageManagerTests extends AndroidTestCase { } } + private static class LocalIntentReceiver { + private final SynchronousQueue<Intent> mResult = new SynchronousQueue<>(); + + private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() { + @Override + public void send(int code, Intent intent, String resolvedType, IBinder whitelistToken, + IIntentReceiver finishedReceiver, String requiredPermission, Bundle options) { + try { + mResult.offer(intent, 5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + }; + + public IntentSender getIntentSender() { + return new IntentSender((IIntentSender) mLocalSender); + } + + public Intent getResult() { + try { + return mResult.take(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + private PackageManager getPm() { return mContext.getPackageManager(); } - private IPackageManager getIPm() { - IPackageManager ipm = IPackageManager.Stub.asInterface( - ServiceManager.getService("package")); - return ipm; + private PackageInstaller getPi() { + return getPm().getPackageInstaller(); } - public void invokeInstallPackage(Uri packageURI, int flags, GenericReceiver receiver, - boolean shouldSucceed) { - TestInstallObserver observer = new TestInstallObserver(); - mContext.registerReceiver(receiver, receiver.filter); - try { - // Wait on observer - synchronized (observer) { - synchronized (receiver) { - getPm().installPackage(packageURI, observer, flags, null); - long waitTime = 0; - while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { - try { - observer.wait(WAIT_TIME_INCR); - waitTime += WAIT_TIME_INCR; - } catch (InterruptedException e) { - Log.i(TAG, "Interrupted during sleep", e); - } - } - if (!observer.isDone()) { - fail("Timed out waiting for packageInstalled callback"); - } - - if (shouldSucceed) { - if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) { - fail("Package installation should have succeeded, but got code " - + observer.returnCode); - } - } else { - if (observer.returnCode == PackageManager.INSTALL_SUCCEEDED) { - fail("Package installation should fail"); - } - - /* - * We'll never expect get a notification since we - * shouldn't succeed. - */ - return; - } + private void writeSplitToInstallSession(PackageInstaller.Session session, String inPath, + String splitName) throws RemoteException { + long sizeBytes = 0; + final File file = new File(inPath); + if (file.isFile()) { + sizeBytes = file.length(); + } else { + return; + } - // Verify we received the broadcast - waitTime = 0; - while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) { - try { - receiver.wait(WAIT_TIME_INCR); - waitTime += WAIT_TIME_INCR; - } catch (InterruptedException e) { - Log.i(TAG, "Interrupted during sleep", e); - } - } - if (!receiver.isDone()) { - fail("Timed out waiting for PACKAGE_ADDED notification"); - } - } - } + InputStream in = null; + OutputStream out = null; + try { + in = new FileInputStream(inPath); + out = session.openWrite(splitName, 0, sizeBytes); + + int total = 0; + byte[] buffer = new byte[65536]; + int c; + while ((c = in.read(buffer)) != -1) { + total += c; + out.write(buffer, 0, c); + } + session.fsync(out); + } catch (IOException e) { + fail("Error: failed to write; " + e.getMessage()); } finally { - mContext.unregisterReceiver(receiver); + IoUtils.closeQuietly(out); + IoUtils.closeQuietly(in); + IoUtils.closeQuietly(session); } } - public void invokeInstallPackageFail(Uri packageURI, int flags, int expectedResult) { - TestInstallObserver observer = new TestInstallObserver(); - try { - // Wait on observer - synchronized (observer) { - getPm().installPackage(packageURI, observer, flags, null); + private void invokeInstallPackage(Uri packageUri, int flags, GenericReceiver receiver, + boolean shouldSucceed) { + mContext.registerReceiver(receiver, receiver.filter); + synchronized (receiver) { + final String inPath = packageUri.getPath(); + PackageInstaller.Session session = null; + try { + final SessionParams sessionParams = + new SessionParams(SessionParams.MODE_FULL_INSTALL); + sessionParams.installFlags = flags; + final int sessionId = getPi().createSession(sessionParams); + session = getPi().openSession(sessionId); + writeSplitToInstallSession(session, inPath, "base.apk"); + final LocalIntentReceiver localReceiver = new LocalIntentReceiver(); + session.commit(localReceiver.getIntentSender()); + final Intent result = localReceiver.getResult(); + final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, + PackageInstaller.STATUS_FAILURE); + if (shouldSucceed) { + if (status != PackageInstaller.STATUS_SUCCESS) { + fail("Installation should have succeeded, but got code " + status); + } + } else { + if (status == PackageInstaller.STATUS_SUCCESS) { + fail("Installation should have failed"); + } + // We'll never get a broadcast since the package failed to install + return; + } + // Verify we received the broadcast long waitTime = 0; - while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { + while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) { try { - observer.wait(WAIT_TIME_INCR); + receiver.wait(WAIT_TIME_INCR); waitTime += WAIT_TIME_INCR; } catch (InterruptedException e) { Log.i(TAG, "Interrupted during sleep", e); } } - if (!observer.isDone()) { - fail("Timed out waiting for packageInstalled callback"); + if (!receiver.isDone()) { + fail("Timed out waiting for PACKAGE_ADDED notification"); } - assertEquals(expectedResult, observer.returnCode); + } catch (IllegalArgumentException | IOException | RemoteException e) { + Log.w(TAG, "Failed to install package; path=" + inPath, e); + fail("Failed to install package; path=" + inPath + ", e=" + e); + } finally { + IoUtils.closeQuietly(session); + mContext.unregisterReceiver(receiver); } + } + } + + private void invokeInstallPackageFail(Uri packageUri, int flags, int expectedResult) { + final String inPath = packageUri.getPath(); + PackageInstaller.Session session = null; + try { + final SessionParams sessionParams = + new SessionParams(SessionParams.MODE_FULL_INSTALL); + sessionParams.installFlags = flags; + final int sessionId = getPi().createSession(sessionParams); + session = getPi().openSession(sessionId); + writeSplitToInstallSession(session, inPath, "base.apk"); + final LocalIntentReceiver localReceiver = new LocalIntentReceiver(); + session.commit(localReceiver.getIntentSender()); + final Intent result = localReceiver.getResult(); + final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS, + PackageInstaller.STATUS_SUCCESS); + assertEquals(expectedResult, status); + } catch (IllegalArgumentException | IOException | RemoteException e) { + Log.w(TAG, "Failed to install package; path=" + inPath, e); + fail("Failed to install package; path=" + inPath + ", e=" + e); } finally { + IoUtils.closeQuietly(session); } } - Uri getInstallablePackage(int fileResId, File outFile) { + private Uri getInstallablePackage(int fileResId, File outFile) { Resources res = mContext.getResources(); InputStream is = null; try { @@ -430,28 +467,17 @@ public class PackageManagerTests extends AndroidTestCase { int rLoc = getInstallLoc(flags, expInstallLocation, pkgLen); if (rLoc == INSTALL_LOC_INT) { - if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) { - assertTrue("The application should be installed forward locked", - (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0); - assertStartsWith("The APK path should point to the ASEC", - SECURE_CONTAINERS_PREFIX, srcPath); - assertStartsWith("The public APK path should point to the ASEC", - SECURE_CONTAINERS_PREFIX, publicSrcPath); - assertStartsWith("The native library path should point to the ASEC", - SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir); - } else { - assertFalse( - (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0); - assertEquals(appInstallPath, srcPath); - assertEquals(appInstallPath, publicSrcPath); - assertStartsWith("Native library should point to shared lib directory", - expectedLibPath, info.nativeLibraryDir); - assertDirOwnerGroupPermsIfExists( - "Native library directory should be owned by system:system and 0755", - Process.SYSTEM_UID, Process.SYSTEM_UID, - S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH, - info.nativeLibraryDir); - } + assertFalse( + (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0); + assertEquals(appInstallPath, srcPath); + assertEquals(appInstallPath, publicSrcPath); + assertStartsWith("Native library should point to shared lib directory", + expectedLibPath, info.nativeLibraryDir); + assertDirOwnerGroupPermsIfExists( + "Native library directory should be owned by system:system and 0755", + Process.SYSTEM_UID, Process.SYSTEM_UID, + S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH, + info.nativeLibraryDir); assertFalse((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); // Make sure the native library dir is not a symlink @@ -465,13 +491,8 @@ public class PackageManagerTests extends AndroidTestCase { } } } else if (rLoc == INSTALL_LOC_SD) { - if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) { - assertTrue("The application should be installed forward locked", - (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0); - } else { - assertFalse("The application should not be installed forward locked", - (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0); - } + assertFalse("The application should not be installed forward locked", + (info.privateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0); assertTrue("Application flags (" + info.flags + ") should contain FLAG_EXTERNAL_STORAGE", (info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); @@ -598,7 +619,8 @@ public class PackageManagerTests extends AndroidTestCase { } } - private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) throws Exception { + private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) + throws Exception { return installFromRawResource("install.apk", R.raw.install, flags, cleanUp, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); } @@ -721,7 +743,7 @@ public class PackageManagerTests extends AndroidTestCase { PackageManager.MATCH_UNINSTALLED_PACKAGES); GenericReceiver receiver = new DeleteReceiver(pkg.packageName); invokeDeletePackage(pkg.packageName, 0, receiver); - } catch (NameNotFoundException e) { + } catch (IllegalArgumentException | NameNotFoundException e) { } } try { @@ -761,11 +783,6 @@ public class PackageManagerTests extends AndroidTestCase { } @LargeTest - public void testInstallFwdLockedInternal() throws Exception { - sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true); - } - - @LargeTest public void testInstallSdcard() throws Exception { // Do not run on devices with emulated external storage. if (Environment.isExternalStorageEmulated()) { @@ -869,11 +886,6 @@ public class PackageManagerTests extends AndroidTestCase { } @LargeTest - public void testReplaceFailFwdLockedInternal() throws Exception { - sampleReplaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK); - } - - @LargeTest public void testReplaceFailSdcard() throws Exception { // Do not run on devices with emulated external storage. if (Environment.isExternalStorageEmulated()) { @@ -889,12 +901,6 @@ public class PackageManagerTests extends AndroidTestCase { } @LargeTest - public void testReplaceFwdLockedInternal() throws Exception { - sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING - | PackageManager.INSTALL_FORWARD_LOCK); - } - - @LargeTest public void testReplaceSdcard() throws Exception { // Do not run on devices with emulated external storage. if (Environment.isExternalStorageEmulated()) { @@ -984,10 +990,11 @@ public class PackageManagerTests extends AndroidTestCase { mContext.registerReceiver(receiver, receiver.filter); try { - DeleteObserver observer = new DeleteObserver(pkgName); - - getPm().deletePackage(pkgName, observer, flags | PackageManager.DELETE_ALL_USERS); - observer.waitForCompletion(MAX_WAIT_TIME); + final LocalIntentReceiver localReceiver = new LocalIntentReceiver(); + getPi().uninstall(pkgName, + flags | PackageManager.DELETE_ALL_USERS, + localReceiver.getIntentSender()); + localReceiver.getResult(); assertUninstalled(info); @@ -1050,11 +1057,6 @@ public class PackageManagerTests extends AndroidTestCase { } @LargeTest - public void testDeleteFwdLockedInternal() throws Exception { - deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0); - } - - @LargeTest public void testDeleteSdcard() throws Exception { // Do not run on devices with emulated external storage. if (Environment.isExternalStorageEmulated()) { @@ -1070,11 +1072,6 @@ public class PackageManagerTests extends AndroidTestCase { } @LargeTest - public void testDeleteFwdLockedInternalRetainData() throws Exception { - deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DELETE_KEEP_DATA); - } - - @LargeTest public void testDeleteSdcardRetainData() throws Exception { // Do not run on devices with emulated external storage. if (Environment.isExternalStorageEmulated()) { @@ -1342,9 +1339,11 @@ public class PackageManagerTests extends AndroidTestCase { final ApplicationInfo info = getPm().getApplicationInfo(pkgName, PackageManager.MATCH_UNINSTALLED_PACKAGES); if (info != null) { - DeleteObserver observer = new DeleteObserver(pkgName); - getPm().deletePackage(pkgName, observer, PackageManager.DELETE_ALL_USERS); - observer.waitForCompletion(MAX_WAIT_TIME); + final LocalIntentReceiver localReceiver = new LocalIntentReceiver(); + getPi().uninstall(pkgName, + PackageManager.DELETE_ALL_USERS, + localReceiver.getIntentSender()); + localReceiver.getResult(); assertUninstalled(info); } } catch (IllegalArgumentException | NameNotFoundException e) { @@ -1380,31 +1379,6 @@ public class PackageManagerTests extends AndroidTestCase { 0, true, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); } - @LargeTest - public void testManifestInstallLocationFwdLockedFlagSdcard() throws Exception { - // Do not run on devices with emulated external storage. - if (Environment.isExternalStorageEmulated()) { - return; - } - - installFromRawResource("install.apk", R.raw.install_loc_unspecified, - PackageManager.INSTALL_FORWARD_LOCK | - PackageManager.INSTALL_EXTERNAL, true, false, -1, - PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); - } - - @LargeTest - public void testManifestInstallLocationFwdLockedSdcard() throws Exception { - // Do not run on devices with emulated external storage. - if (Environment.isExternalStorageEmulated()) { - return; - } - - installFromRawResource("install.apk", R.raw.install_loc_sdcard, - PackageManager.INSTALL_FORWARD_LOCK, true, false, -1, - PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); - } - /* * Install a package on internal flash via PackageManager install flag. Replace * the package via flag to install on sdcard. Make sure the new flag overrides @@ -1704,20 +1678,6 @@ public class PackageManagerTests extends AndroidTestCase { } @LargeTest - public void testMoveAppForwardLocked() throws Exception { - // Do not run on devices with emulated external storage. - if (Environment.isExternalStorageEmulated()) { - return; - } - - int installFlags = PackageManager.INSTALL_FORWARD_LOCK; - int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; - boolean fail = false; - int result = PackageManager.MOVE_SUCCEEDED; - sampleMoveFromRawResource(installFlags, moveFlags, fail, result); - } - - @LargeTest public void testMoveAppFailInternalToExternalDelete() throws Exception { // Do not run on devices with emulated external storage. if (Environment.isExternalStorageEmulated()) { @@ -1771,7 +1731,7 @@ public class PackageManagerTests extends AndroidTestCase { // Try to install and make sure an error code is returned. installFromRawResource("install.apk", R.raw.install, PackageManager.INSTALL_EXTERNAL, false, - true, PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE, + true, PackageInstaller.STATUS_FAILURE_STORAGE, PackageInfo.INSTALL_LOCATION_AUTO); } finally { // Restore original media state @@ -1844,63 +1804,6 @@ public class PackageManagerTests extends AndroidTestCase { } /* - * Install an app forward-locked. - */ - @LargeTest - public void testFlagF() throws Exception { - sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true); - } - - /* - * Install an app with both internal and external flags set. should fail - */ - @LargeTest - public void testFlagIE() throws Exception { - installFromRawResource("install.apk", R.raw.install, - PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_INTERNAL, - false, - true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, - PackageInfo.INSTALL_LOCATION_AUTO); - } - - /* - * Install an app with both internal and forward-lock flags set. - */ - @LargeTest - public void testFlagIF() throws Exception { - sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK - | PackageManager.INSTALL_INTERNAL, true); - } - - /* - * Install an app with both external and forward-lock flags set. - */ - @LargeTest - public void testFlagEF() throws Exception { - // Do not run on devices with emulated external storage. - if (Environment.isExternalStorageEmulated()) { - return; - } - - sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK - | PackageManager.INSTALL_EXTERNAL, true); - } - - /* - * Install an app with both internal and external flags set with forward - * lock. Should fail. - */ - @LargeTest - public void testFlagIEF() throws Exception { - installFromRawResource("install.apk", R.raw.install, - PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_INTERNAL | - PackageManager.INSTALL_EXTERNAL, - false, - true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, - PackageInfo.INSTALL_LOCATION_AUTO); - } - - /* * Install an app with both internal and manifest option set. * should install on internal. */ @@ -1991,55 +1894,6 @@ public class PackageManagerTests extends AndroidTestCase { } /* - * Install an app with fwd locked flag set and install location set to - * internal. should install internally. - */ - @LargeTest - public void testFlagFManifestI() throws Exception { - installFromRawResource("install.apk", R.raw.install_loc_internal, - PackageManager.INSTALL_FORWARD_LOCK, - true, - false, -1, - PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); - } - - /* - * Install an app with fwd locked flag set and install location set to - * preferExternal. Should install externally. - */ - @LargeTest - public void testFlagFManifestE() throws Exception { - // Do not run on devices with emulated external storage. - if (Environment.isExternalStorageEmulated()) { - return; - } - - installFromRawResource("install.apk", R.raw.install_loc_sdcard, - PackageManager.INSTALL_FORWARD_LOCK, - true, - false, -1, - PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); - } - - /* - * Install an app with fwd locked flag set and install location set to auto. - * should install externally. - */ - @LargeTest - public void testFlagFManifestA() throws Exception { - // Do not run on devices with emulated external storage. - if (Environment.isExternalStorageEmulated()) { - return; - } - - installFromRawResource("install.apk", R.raw.install_loc_auto, - PackageManager.INSTALL_FORWARD_LOCK, - true, - false, -1, - PackageInfo.INSTALL_LOCATION_AUTO); - } - - /* * The following test functions verify install location for existing apps. * ie existing app can be installed internally or externally. If install * flag is explicitly set it should override current location. If manifest location @@ -2134,48 +1988,6 @@ public class PackageManagerTests extends AndroidTestCase { -1); } - @Suppress - @LargeTest - public void testFlagFExistingI() throws Exception { - int iFlags = PackageManager.INSTALL_INTERNAL; - int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING; - // First install. - installFromRawResource("install.apk", R.raw.install, - iFlags, - false, - false, -1, - -1); - // Replace now - installFromRawResource("install.apk", R.raw.install, - rFlags, - true, - false, -1, - -1); - } - - @LargeTest - public void testFlagFExistingE() throws Exception { - // Do not run on devices with emulated external storage. - if (Environment.isExternalStorageEmulated()) { - return; - } - - int iFlags = PackageManager.INSTALL_EXTERNAL; - int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING; - // First install. - installFromRawResource("install.apk", R.raw.install, - iFlags, - false, - false, -1, - -1); - // Replace now - installFromRawResource("install.apk", R.raw.install, - rFlags, - true, - false, -1, - -1); - } - /* * The following set of tests verify the installation of apps with * install location attribute set to internalOnly, preferExternal and auto. @@ -2905,7 +2717,7 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest public void testReplaceMatchNoCerts1() throws Exception { replaceCerts(APP1_CERT1_CERT2, APP1_CERT3, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -2915,7 +2727,7 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest public void testReplaceMatchNoCerts2() throws Exception { replaceCerts(APP1_CERT1_CERT2, APP1_CERT3_CERT4, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -2925,7 +2737,7 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest public void testReplaceMatchSomeCerts1() throws Exception { replaceCerts(APP1_CERT1_CERT2, APP1_CERT1, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -2935,7 +2747,7 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest public void testReplaceMatchSomeCerts2() throws Exception { replaceCerts(APP1_CERT1_CERT2, APP1_CERT2, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -2945,7 +2757,7 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest public void testReplaceMatchMoreCerts() throws Exception { replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -2956,7 +2768,7 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest public void testReplaceMatchMoreCertsReplaceSomeCerts() throws Exception { InstallParams ip = replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, false, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); try { int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; installFromRawResource("install.apk", APP1_CERT1, rFlags, false, @@ -2996,7 +2808,7 @@ public class PackageManagerTests extends AndroidTestCase { */ public void testUpgradeKSWithWrongKey() throws Exception { replaceCerts(R.raw.keyset_sa_ua, R.raw.keyset_sb_ua, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -3005,7 +2817,7 @@ public class PackageManagerTests extends AndroidTestCase { */ public void testUpgradeKSWithWrongSigningKey() throws Exception { replaceCerts(R.raw.keyset_sa_ub, R.raw.keyset_sa_ub, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -3037,7 +2849,7 @@ public class PackageManagerTests extends AndroidTestCase { */ public void testMultipleUpgradeKSWithSigningKey() throws Exception { replaceCerts(R.raw.keyset_sau_ub, R.raw.keyset_sa_ua, true, true, - PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); + PackageInstaller.STATUS_FAILURE_CONFLICT); } /* @@ -3471,7 +3283,12 @@ public class PackageManagerTests extends AndroidTestCase { int rawResId = apk2; Uri packageURI = getInstallablePackage(rawResId, outFile); PackageParser.Package pkg = parsePackage(packageURI); - getPm().deletePackage(pkg.packageName, null, PackageManager.DELETE_ALL_USERS); + try { + getPi().uninstall(pkg.packageName, + PackageManager.DELETE_ALL_USERS, + null /*statusReceiver*/); + } catch (IllegalArgumentException ignore) { + } // Check signatures now int match = mContext.getPackageManager().checkSignatures( ip.pkg.packageName, pkg.packageName); @@ -3487,7 +3304,7 @@ public class PackageManagerTests extends AndroidTestCase { String apk1Name = "install1.apk"; installFromRawResource(apk1Name, apk1, 0, false, - true, PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES, + true, PackageInstaller.STATUS_FAILURE_INVALID, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); } @@ -3557,7 +3374,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk1 = SHARED1_CERT1; int apk2 = SHARED2_CERT2; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; int expMatchResult = -1; checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); } @@ -3571,7 +3388,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk1 = SHARED1_CERT1_CERT2; int apk2 = SHARED2_CERT1; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; int expMatchResult = -1; checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); } @@ -3585,7 +3402,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk1 = SHARED1_CERT1_CERT2; int apk2 = SHARED2_CERT2; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; int expMatchResult = -1; checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); } @@ -3604,7 +3421,11 @@ public class PackageManagerTests extends AndroidTestCase { PackageManager pm = mContext.getPackageManager(); // Delete app2 PackageParser.Package pkg = getParsedPackage(apk2Name, apk2); - getPm().deletePackage(pkg.packageName, null, PackageManager.DELETE_ALL_USERS); + try { + getPi().uninstall( + pkg.packageName, PackageManager.DELETE_ALL_USERS, null /*statusReceiver*/); + } catch (IllegalArgumentException ignore) { + } // Check signatures now int match = mContext.getPackageManager().checkSignatures( ip1.pkg.packageName, pkg.packageName); @@ -3640,7 +3461,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk2 = SHARED2_CERT1_CERT2; int rapk1 = SHARED1_CERT1; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); @@ -3652,7 +3473,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk2 = SHARED2_CERT1_CERT2; int rapk2 = SHARED2_CERT1; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); @@ -3664,7 +3485,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk2 = SHARED2_CERT1; int rapk1 = SHARED1_CERT2; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); @@ -3676,7 +3497,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk2 = SHARED2_CERT1; int rapk2 = SHARED2_CERT2; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); @@ -3688,7 +3509,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk2 = SHARED2_CERT1; int rapk1 = SHARED1_CERT1_CERT2; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); @@ -3700,7 +3521,7 @@ public class PackageManagerTests extends AndroidTestCase { int apk2 = SHARED2_CERT1; int rapk2 = SHARED2_CERT1_CERT2; boolean fail = true; - int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; + int retCode = PackageInstaller.STATUS_FAILURE_CONFLICT; checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); @@ -3724,7 +3545,7 @@ public class PackageManagerTests extends AndroidTestCase { @LargeTest public void testInstallNonexistentFile() throws Exception { - int retCode = PackageManager.INSTALL_FAILED_INVALID_URI; + int retCode = PackageInstaller.STATUS_FAILURE_INVALID; File invalidFile = new File("/nonexistent-file.apk"); invokeInstallPackageFail(Uri.fromFile(invalidFile), 0, retCode); } @@ -3845,7 +3666,7 @@ public class PackageManagerTests extends AndroidTestCase { @Suppress public void testInstall_BadDex_CleanUp() throws Exception { - int retCode = PackageManager.INSTALL_FAILED_DEXOPT; + int retCode = PackageInstaller.STATUS_FAILURE_INVALID; installFromRawResource("install.apk", R.raw.install_bad_dex, 0, true, true, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); } diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 53ba9f7bcf66..1ebd42925b98 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -448,6 +448,8 @@ public class SettingsBackupTest { Settings.Secure.MANAGED_PROFILE_CONTACT_REMOTE_SEARCH, Settings.Secure.MULTI_PRESS_TIMEOUT, Settings.Secure.NFC_PAYMENT_FOREGROUND, + Settings.Secure.NIGHT_DISPLAY_ACTIVATED, + Settings.Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME, Settings.Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, Settings.Secure.PACKAGE_VERIFIER_STATE, Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT, diff --git a/core/tests/coretests/src/android/widget/EditorCursorTest.java b/core/tests/coretests/src/android/widget/EditorCursorTest.java index 6d650ffaa66a..9186827b38f3 100644 --- a/core/tests/coretests/src/android/widget/EditorCursorTest.java +++ b/core/tests/coretests/src/android/widget/EditorCursorTest.java @@ -16,71 +16,68 @@ package android.widget; -import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; -import android.view.Choreographer; -import android.view.ViewGroup; - -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; - import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; import static android.widget.espresso.TextViewAssertions.hasInsertionPointerOnLeft; import static android.widget.espresso.TextViewAssertions.hasInsertionPointerOnRight; + +import static junit.framework.Assert.fail; + import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isEmptyString; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.sameInstance; -public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewActivity> { +import android.app.Activity; +import android.app.Instrumentation; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.MediumTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import com.android.frameworks.coretests.R; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +@RunWith(AndroidJUnit4.class) +@MediumTest +public class EditorCursorTest { private final static String LTR_STRING = "aaaaaaaaaaaaaaaaaaaaaa"; private final static String LTR_HINT = "hint"; private final static String RTL_STRING = "مرحبا الروبوت مرحبا الروبوت مرحبا الروبوت"; private final static String RTL_HINT = "الروبوت"; private final static int CURSOR_BLINK_MS = 500; + @Rule + public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>( + TextViewActivity.class); + + private Instrumentation mInstrumentation; + private Activity mActivity; private EditText mEditText; - public EditorCursorTest() { - super(TextViewActivity.class); - } + @Before + public void setUp() throws Throwable { + mActivity = mActivityRule.getActivity(); + mInstrumentation = InstrumentationRegistry.getInstrumentation(); - @Override - protected void setUp() throws Exception { - super.setUp(); - mEditText = new EditText(getActivity()); - mEditText.setTextSize(30); - mEditText.setSingleLine(true); - mEditText.setLines(1); - mEditText.setPadding(15, 15, 15, 15); - ViewGroup.LayoutParams editTextLayoutParams = new ViewGroup.LayoutParams(200, - ViewGroup.LayoutParams.WRAP_CONTENT); - - mEditText.setLayoutParams(editTextLayoutParams); - - final FrameLayout layout = new FrameLayout(getActivity()); - ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT); - layout.setLayoutParams(layoutParams); - layout.addView(mEditText); - - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - getActivity().setContentView(layout); - } + mActivityRule.runOnUiThread(() -> { + mActivity.setContentView(R.layout.activity_editor_cursor_test); + mEditText = mActivity.findViewById(R.id.edittext); }); - getInstrumentation().waitForIdleSync(); + mInstrumentation.waitForIdleSync(); onView(sameInstance(mEditText)).perform(click()); } - @SmallTest - public void testCursorIsInViewBoundariesWhenOnRightForLtr() { + @Test + public void testCursorIsInViewBoundariesWhenOnRightForLtr() throws Throwable { // Asserts that when an EditText has LTR text, and cursor is at the end (right), // cursor is drawn to the right edge of the view setEditTextText(LTR_STRING, LTR_STRING.length()); @@ -88,8 +85,8 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA onView(sameInstance(mEditText)).check(hasInsertionPointerOnRight()); } - @SmallTest - public void testCursorIsInViewBoundariesWhenOnLeftForLtr() { + @Test + public void testCursorIsInViewBoundariesWhenOnLeftForLtr() throws Throwable { // Asserts that when an EditText has LTR text, and cursor is at the beginning, // cursor is drawn to the left edge of the view setEditTextText(LTR_STRING, 0); @@ -97,8 +94,8 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA onView(sameInstance(mEditText)).check(hasInsertionPointerOnLeft()); } - @SmallTest - public void testCursorIsInViewBoundariesWhenOnRightForRtl() { + @Test + public void testCursorIsInViewBoundariesWhenOnRightForRtl() throws Throwable { // Asserts that when an EditText has RTL text, and cursor is at the end, // cursor is drawn to the left edge of the view setEditTextText(RTL_STRING, 0); @@ -106,8 +103,8 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA onView(sameInstance(mEditText)).check(hasInsertionPointerOnRight()); } - @SmallTest - public void testCursorIsInViewBoundariesWhenOnLeftForRtl() { + @Test + public void testCursorIsInViewBoundariesWhenOnLeftForRtl() throws Throwable { // Asserts that when an EditText has RTL text, and cursor is at the beginning, // cursor is drawn to the right edge of the view setEditTextText(RTL_STRING, RTL_STRING.length()); @@ -116,8 +113,8 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA } /* Tests for cursor positioning with hint */ - @SmallTest - public void testCursorIsOnLeft_withFirstStrongLtrAlgorithm() { + @Test + public void testCursorIsOnLeft_withFirstStrongLtrAlgorithm() throws Throwable { setEditTextHint(null, TextView.TEXT_DIRECTION_FIRST_STRONG_LTR, 0); assertThat(mEditText.getText().toString(), isEmptyString()); assertThat(mEditText.getHint(), nullValue()); @@ -135,8 +132,8 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA onView(sameInstance(mEditText)).check(hasInsertionPointerOnLeft()); } - @SmallTest - public void testCursorIsOnRight_withFirstStrongRtlAlgorithm() { + @Test + public void testCursorIsOnRight_withFirstStrongRtlAlgorithm() throws Throwable { setEditTextHint(null, TextView.TEXT_DIRECTION_FIRST_STRONG_RTL, 0); assertThat(mEditText.getText().toString(), isEmptyString()); assertThat(mEditText.getHint(), nullValue()); @@ -154,8 +151,8 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA onView(sameInstance(mEditText)).check(hasInsertionPointerOnRight()); } - @SmallTest - public void testCursorIsOnLeft_withLtrAlgorithm() { + @Test + public void testCursorIsOnLeft_withLtrAlgorithm() throws Throwable { setEditTextHint(null, TextView.TEXT_DIRECTION_LTR, 0); assertThat(mEditText.getText().toString(), isEmptyString()); assertThat(mEditText.getHint(), nullValue()); @@ -173,8 +170,8 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA onView(sameInstance(mEditText)).check(hasInsertionPointerOnLeft()); } - @SmallTest - public void testCursorIsOnRight_withRtlAlgorithm() { + @Test + public void testCursorIsOnRight_withRtlAlgorithm() throws Throwable { setEditTextHint(null, TextView.TEXT_DIRECTION_RTL, 0); assertThat(mEditText.getText().toString(), isEmptyString()); assertThat(mEditText.getHint(), nullValue()); @@ -193,27 +190,19 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA } private void setEditTextProperties(final String text, final String hint, - final Integer textDirection, final Integer selection) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - if (textDirection != null) mEditText.setTextDirection(textDirection); - if (text != null) mEditText.setText(text); - if (hint != null) mEditText.setHint(hint); - if (selection != null) mEditText.setSelection(selection); - } + final Integer textDirection, final Integer selection) throws Throwable { + mActivityRule.runOnUiThread(() -> { + if (textDirection != null) mEditText.setTextDirection(textDirection); + if (text != null) mEditText.setText(text); + if (hint != null) mEditText.setHint(hint); + if (selection != null) mEditText.setSelection(selection); }); - getInstrumentation().waitForIdleSync(); + mInstrumentation.waitForIdleSync(); // wait for cursor to be drawn. updateCursorPositions function is called during draw() and // only when cursor is visible during blink. final CountDownLatch latch = new CountDownLatch(1); - mEditText.postOnAnimationDelayed(new Runnable() { - @Override - public void run() { - latch.countDown(); - } - }, CURSOR_BLINK_MS); + mEditText.postOnAnimationDelayed(latch::countDown, CURSOR_BLINK_MS); try { assertThat("Problem while waiting for the cursor to blink", latch.await(10, TimeUnit.SECONDS), equalTo(true)); @@ -222,11 +211,12 @@ public class EditorCursorTest extends ActivityInstrumentationTestCase2<TextViewA } } - private void setEditTextHint(final String hint, final int textDirection, final int selection) { + private void setEditTextHint(final String hint, final int textDirection, final int selection) + throws Throwable { setEditTextProperties(null, hint, textDirection, selection); } - private void setEditTextText(final String text, final Integer selection) { + private void setEditTextText(final String text, final Integer selection) throws Throwable { setEditTextProperties(text, null, null, selection); } } diff --git a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java index 04837895d545..9124c94785d0 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java @@ -42,32 +42,43 @@ import static android.widget.espresso.TextViewActions.mouseTripleClickOnTextAtIn import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIndex; import static android.widget.espresso.TextViewAssertions.hasSelection; -import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; +import android.app.Activity; +import android.support.test.filters.MediumTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; import android.view.MotionEvent; import android.view.textclassifier.TextClassificationManager; import android.view.textclassifier.TextClassifier; import com.android.frameworks.coretests.R; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + /** * Tests mouse interaction of the TextView widget from an Activity */ -public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2<TextViewActivity>{ +@RunWith(AndroidJUnit4.class) +@MediumTest +public class TextViewActivityMouseTest { - public TextViewActivityMouseTest() { - super(TextViewActivity.class); - } + @Rule + public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>( + TextViewActivity.class); + + private Activity mActivity; - @Override - public void setUp() throws Exception { - super.setUp(); - getActivity().getSystemService(TextClassificationManager.class) + @Before + public void setUp() { + mActivity = mActivityRule.getActivity(); + mActivity.getSystemService(TextClassificationManager.class) .setTextClassifier(TextClassifier.NO_OP); } - @SmallTest - public void testSelectTextByDrag() throws Exception { + @Test + public void testSelectTextByDrag() { final String helloWorld = "Hello world!"; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(helloWorld)); @@ -90,8 +101,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< assertNoSelectionHandles(); } - @SmallTest - public void testSelectTextByDrag_reverse() throws Exception { + @Test + public void testSelectTextByDrag_reverse() { final String helloWorld = "Hello world!"; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(helloWorld)); @@ -101,8 +112,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection("llo wor")); } - @SmallTest - public void testContextMenu() throws Exception { + @Test + public void testContextMenu() { final String text = "abc def ghi."; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -113,9 +124,9 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY)); assertContextMenuContainsItemDisabled( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); assertContextMenuContainsItemDisabled( - getActivity().getString(com.android.internal.R.string.undo)); + mActivity.getString(com.android.internal.R.string.undo)); // Hide context menu. pressBack(); @@ -130,9 +141,9 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY)); assertContextMenuContainsItemDisabled( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); assertContextMenuContainsItemEnabled( - getActivity().getString(com.android.internal.R.string.undo)); + mActivity.getString(com.android.internal.R.string.undo)); // Hide context menu. pressBack(); @@ -144,9 +155,9 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< mouseClickOnTextAtIndex(text.indexOf("d"), MotionEvent.BUTTON_SECONDARY)); assertContextMenuContainsItemEnabled( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); assertContextMenuContainsItemEnabled( - getActivity().getString(com.android.internal.R.string.undo)); + mActivity.getString(com.android.internal.R.string.undo)); // Hide context menu. pressBack(); @@ -156,9 +167,9 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).perform( mouseClickOnTextAtIndex(text.indexOf("i"), MotionEvent.BUTTON_SECONDARY)); assertContextMenuContainsItemDisabled( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); assertContextMenuContainsItemEnabled( - getActivity().getString(com.android.internal.R.string.undo)); + mActivity.getString(com.android.internal.R.string.undo)); // Hide context menu. pressBack(); @@ -169,8 +180,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< // TODO: Add tests for suggestions } - @SmallTest - public void testDragAndDrop() throws Exception { + @Test + public void testDragAndDrop() { final String text = "abc def ghi."; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -186,8 +197,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex("abc ghi.def".length())); } - @SmallTest - public void testDragAndDrop_longClick() throws Exception { + @Test + public void testDragAndDrop_longClick() { final String text = "abc def ghi."; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -203,8 +214,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex("abc ghi.def".length())); } - @SmallTest - public void testSelectTextByLongClick() throws Exception { + @Test + public void testSelectTextByLongClick() { final String helloWorld = "Hello world!"; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(helloWorld)); @@ -228,8 +239,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection("!")); } - @SmallTest - public void testSelectTextByDoubleClick() throws Exception { + @Test + public void testSelectTextByDoubleClick() { final String helloWorld = "hello world!"; onView(withId(R.id.textview)).perform(mouseClick()); @@ -254,8 +265,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection("!")); } - @SmallTest - public void testSelectTextByDoubleClickAndDrag() throws Exception { + @Test + public void testSelectTextByDoubleClickAndDrag() { final String text = "abcd efg hijk lmn"; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -265,8 +276,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection("efg hijk")); } - @SmallTest - public void testSelectTextByDoubleClickAndDrag_reverse() throws Exception { + @Test + public void testSelectTextByDoubleClickAndDrag_reverse() { final String text = "abcd efg hijk lmn"; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -276,8 +287,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection("efg hijk")); } - @SmallTest - public void testSelectTextByLongPressAndDrag() throws Exception { + @Test + public void testSelectTextByLongPressAndDrag() { final String text = "abcd efg hijk lmn"; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -287,8 +298,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection("efg hijk")); } - @SmallTest - public void testSelectTextByLongPressAndDrag_reverse() throws Exception { + @Test + public void testSelectTextByLongPressAndDrag_reverse() { final String text = "abcd efg hijk lmn"; onView(withId(R.id.textview)).perform(mouseClick()); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -298,8 +309,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection("efg hijk")); } - @SmallTest - public void testSelectTextByTripleClick() throws Exception { + @Test + public void testSelectTextByTripleClick() { final StringBuilder builder = new StringBuilder(); builder.append("First paragraph.\n"); builder.append("Second paragraph."); @@ -332,8 +343,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< text.substring(text.indexOf("Second"), text.indexOf("Third")))); } - @SmallTest - public void testSelectTextByTripleClickAndDrag() throws Exception { + @Test + public void testSelectTextByTripleClickAndDrag() { final StringBuilder builder = new StringBuilder(); builder.append("First paragraph.\n"); builder.append("Second paragraph."); @@ -361,8 +372,8 @@ public class TextViewActivityMouseTest extends ActivityInstrumentationTestCase2< onView(withId(R.id.textview)).check(hasSelection(text)); } - @SmallTest - public void testSelectTextByTripleClickAndDrag_reverse() throws Exception { + @Test + public void testSelectTextByTripleClickAndDrag_reverse() { final StringBuilder builder = new StringBuilder(); builder.append("First paragraph.\n"); builder.append("Second paragraph."); diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index 5a7bca4d44f5..d69b1e4e4922 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -16,77 +16,93 @@ package android.widget; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.longClick; +import static android.support.test.espresso.action.ViewActions.pressKey; +import static android.support.test.espresso.action.ViewActions.replaceText; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static android.widget.espresso.CustomViewActions.longPressAtRelativeCoordinates; import static android.widget.espresso.DragHandleUtils.assertNoSelectionHandles; import static android.widget.espresso.DragHandleUtils.onHandleView; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsNotDisplayed; +import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex; +import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem; +import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup; +import static android.widget.espresso.TextViewActions.Handle; import static android.widget.espresso.TextViewActions.clickOnTextAtIndex; -import static android.widget.espresso.TextViewActions.doubleTapAndDragOnText; import static android.widget.espresso.TextViewActions.doubleClickOnTextAtIndex; +import static android.widget.espresso.TextViewActions.doubleTapAndDragOnText; import static android.widget.espresso.TextViewActions.dragHandle; -import static android.widget.espresso.TextViewActions.Handle; import static android.widget.espresso.TextViewActions.longPressAndDragOnText; import static android.widget.espresso.TextViewActions.longPressOnTextAtIndex; +import static android.widget.espresso.TextViewAssertions.doesNotHaveStyledText; import static android.widget.espresso.TextViewAssertions.hasInsertionPointerAtIndex; import static android.widget.espresso.TextViewAssertions.hasSelection; -import static android.widget.espresso.TextViewAssertions.doesNotHaveStyledText; -import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarItemIndex; -import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsDisplayed; -import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarIsNotDisplayed; -import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarContainsItem; -import static android.widget.espresso.FloatingToolbarEspressoUtils.assertFloatingToolbarDoesNotContainItem; -import static android.widget.espresso.FloatingToolbarEspressoUtils.clickFloatingToolbarItem; -import static android.widget.espresso.FloatingToolbarEspressoUtils.sleepForFloatingToolbarPopup; -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.longClick; -import static android.support.test.espresso.action.ViewActions.pressKey; -import static android.support.test.espresso.action.ViewActions.replaceText; -import static android.support.test.espresso.assertion.ViewAssertions.matches; -import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; -import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withText; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; + import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.is; +import android.app.Activity; +import android.app.Instrumentation; import android.content.ClipData; import android.content.ClipboardManager; -import android.support.test.espresso.NoMatchingViewException; -import android.support.test.espresso.ViewAssertion; +import android.support.test.InstrumentationRegistry; +import android.support.test.espresso.action.EspressoKey; +import android.support.test.filters.MediumTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.text.InputType; +import android.text.Selection; +import android.text.Spannable; import android.view.ActionMode; +import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.textclassifier.TextClassificationManager; import android.view.textclassifier.TextClassifier; import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider; -import android.support.test.espresso.action.EspressoKey; -import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.MediumTest; -import android.text.Selection; -import android.text.Spannable; -import android.text.InputType; -import android.view.KeyEvent; - import com.android.frameworks.coretests.R; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + /** * Tests the TextView widget from an Activity */ +@RunWith(AndroidJUnit4.class) @MediumTest -public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextViewActivity>{ +public class TextViewActivityTest { - public TextViewActivityTest() { - super(TextViewActivity.class); - } + @Rule + public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>( + TextViewActivity.class); + + private Activity mActivity; + private Instrumentation mInstrumentation; - @Override - public void setUp() throws Exception { - super.setUp(); - getActivity().getSystemService(TextClassificationManager.class) + @Before + public void setUp() { + mActivity = mActivityRule.getActivity(); + mInstrumentation = InstrumentationRegistry.getInstrumentation(); + mActivity.getSystemService(TextClassificationManager.class) .setTextClassifier(TextClassifier.NO_OP); } - public void testTypedTextIsOnScreen() throws Exception { + @Test + public void testTypedTextIsOnScreen() { final String helloWorld = "Hello world!"; // We use replaceText instead of typeTextIntoFocusedView to input text to avoid // unintentional interactions with software keyboard. @@ -94,8 +110,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(matches(withText(helloWorld))); } - - public void testPositionCursorAtTextAtIndex() throws Exception { + @Test + public void testPositionCursorAtTextAtIndex() { final String helloWorld = "Hello world!"; onView(withId(R.id.textview)).perform(replaceText(helloWorld)); onView(withId(R.id.textview)).perform(clickOnTextAtIndex(helloWorld.indexOf("world"))); @@ -105,7 +121,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(matches(withText("Hello orld!"))); } - public void testPositionCursorAtTextAtIndex_arabic() throws Exception { + @Test + public void testPositionCursorAtTextAtIndex_arabic() { // Arabic text. The expected cursorable boundary is // | \u0623 \u064F | \u067A | \u0633 \u0652 | final String text = "\u0623\u064F\u067A\u0633\u0652"; @@ -125,7 +142,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(5)); } - public void testPositionCursorAtTextAtIndex_devanagari() throws Exception { + @Test + public void testPositionCursorAtTextAtIndex_devanagari() { // Devanagari text. The expected cursorable boundary is | \u0915 \u093E | final String text = "\u0915\u093E"; onView(withId(R.id.textview)).perform(replaceText(text)); @@ -138,7 +156,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(2)); } - public void testLongPressToSelect() throws Exception { + @Test + public void testLongPressToSelect() { final String helloWorld = "Hello Kirk!"; onView(withId(R.id.textview)).perform(click()); onView(withId(R.id.textview)).perform(replaceText(helloWorld)); @@ -148,7 +167,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("Kirk")); } - public void testLongPressEmptySpace() throws Exception { + @Test + public void testLongPressEmptySpace() { final String helloWorld = "Hello big round sun!"; onView(withId(R.id.textview)).perform(replaceText(helloWorld)); // Move cursor somewhere else @@ -161,7 +181,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(helloWorld.length())); } - public void testLongPressAndDragToSelect() throws Exception { + @Test + public void testLongPressAndDragToSelect() { final String helloWorld = "Hello little handsome boy!"; onView(withId(R.id.textview)).perform(replaceText(helloWorld)); onView(withId(R.id.textview)).perform( @@ -170,7 +191,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("little handsome")); } - public void testLongPressAndDragToSelect_emoji() throws Exception { + @Test + public void testLongPressAndDragToSelect_emoji() { final String text = "\uD83D\uDE00\uD83D\uDE01\uD83D\uDE02\uD83D\uDE03"; onView(withId(R.id.textview)).perform(replaceText(text)); @@ -183,7 +205,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("\uD83D\uDE01")); } - public void testDragAndDrop() throws Exception { + @Test + public void testDragAndDrop() { final String text = "abc def ghi."; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("e"))); @@ -203,7 +226,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(matches(withText(text))); } - public void testDoubleTapToSelect() throws Exception { + @Test + public void testDoubleTapToSelect() { final String helloWorld = "Hello SuetYi!"; onView(withId(R.id.textview)).perform(replaceText(helloWorld)); @@ -213,16 +237,18 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("SuetYi")); } - public void testDoubleTapAndDragToSelect() throws Exception { - final String helloWorld = "Hello young beautiful girl!"; + @Test + public void testDoubleTapAndDragToSelect() { + final String helloWorld = "Hello young beautiful person!"; onView(withId(R.id.textview)).perform(replaceText(helloWorld)); - onView(withId(R.id.textview)).perform( - doubleTapAndDragOnText(helloWorld.indexOf("young"), helloWorld.indexOf(" girl!"))); + onView(withId(R.id.textview)).perform(doubleTapAndDragOnText(helloWorld.indexOf("young"), + helloWorld.indexOf(" person!"))); onView(withId(R.id.textview)).check(hasSelection("young beautiful")); } - public void testDoubleTapAndDragToSelect_multiLine() throws Exception { + @Test + public void testDoubleTapAndDragToSelect_multiLine() { final String helloWorld = "abcd\n" + "efg\n" + "hijklm\n" + "nop"; onView(withId(R.id.textview)).perform(replaceText(helloWorld)); onView(withId(R.id.textview)).perform( @@ -230,7 +256,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("abcd\nefg\nhijklm")); } - public void testSelectBackwordsByTouch() throws Exception { + @Test + public void testSelectBackwordsByTouch() { final String helloWorld = "Hello king of the Jungle!"; onView(withId(R.id.textview)).perform(replaceText(helloWorld)); onView(withId(R.id.textview)).perform( @@ -239,7 +266,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("king of the")); } - public void testToolbarAppearsAfterSelection() throws Exception { + @Test + public void testToolbarAppearsAfterSelection() { final String text = "Toolbar appears after selection."; assertFloatingToolbarIsNotDisplayed(); onView(withId(R.id.textview)).perform(replaceText(text)); @@ -255,34 +283,32 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarIsNotDisplayed(); } + @Test public void testToolbarAppearsAfterSelection_withFirstStringLtrAlgorithmAndRtlHint() - throws Exception { + throws Throwable { // after the hint layout change, the floating toolbar was not visible in the case below // this test tests that the floating toolbar is displayed on the screen and is visible to // user. - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); - textView.post(new Runnable() { - @Override - public void run() { - textView.setTextDirection(TextView.TEXT_DIRECTION_FIRST_STRONG_LTR); - textView.setInputType(InputType.TYPE_CLASS_TEXT); - textView.setSingleLine(true); - textView.setHint("الروبوت"); - } + mActivityRule.runOnUiThread(() -> { + final TextView textView = mActivity.findViewById(R.id.textview); + textView.setTextDirection(TextView.TEXT_DIRECTION_FIRST_STRONG_LTR); + textView.setInputType(InputType.TYPE_CLASS_TEXT); + textView.setSingleLine(true); + textView.setHint("الروبوت"); }); - getInstrumentation().waitForIdleSync(); + mInstrumentation.waitForIdleSync(); onView(withId(R.id.textview)).perform(replaceText("test")); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(1)); - clickFloatingToolbarItem( - getActivity().getString(com.android.internal.R.string.cut)); + clickFloatingToolbarItem(mActivity.getString(com.android.internal.R.string.cut)); onView(withId(R.id.textview)).perform(longClick()); sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); } - public void testToolbarAndInsertionHandle() throws Exception { + @Test + public void testToolbarAndInsertionHandle() { final String text = "text"; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length())); @@ -293,14 +319,15 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarIsDisplayed(); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.selectAll)); + mActivity.getString(com.android.internal.R.string.selectAll)); assertFloatingToolbarDoesNotContainItem( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); assertFloatingToolbarDoesNotContainItem( - getActivity().getString(com.android.internal.R.string.cut)); + mActivity.getString(com.android.internal.R.string.cut)); } - public void testToolbarAndSelectionHandle() throws Exception { + @Test + public void testToolbarAndSelectionHandle() { final String text = "abcd efg hijk"; onView(withId(R.id.textview)).perform(replaceText(text)); @@ -309,13 +336,13 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarIsDisplayed(); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.selectAll)); + mActivity.getString(com.android.internal.R.string.selectAll)); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.cut)); + mActivity.getString(com.android.internal.R.string.cut)); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('a'))); sleepForFloatingToolbarPopup(); @@ -327,21 +354,22 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarIsDisplayed(); assertFloatingToolbarDoesNotContainItem( - getActivity().getString(com.android.internal.R.string.selectAll)); + mActivity.getString(com.android.internal.R.string.selectAll)); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.cut)); + mActivity.getString(com.android.internal.R.string.cut)); } - public void testInsertionHandle() throws Exception { + @Test + public void testInsertionHandle() { final String text = "abcd efg hijk "; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length())); onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length())); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.insertion_handle) .perform(dragHandle(textView, Handle.INSERTION, text.indexOf('a'))); @@ -352,14 +380,15 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.indexOf("f"))); } - public void testInsertionHandle_multiLine() throws Exception { + @Test + public void testInsertionHandle_multiLine() { final String text = "abcd\n" + "efg\n" + "hijk\n"; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.length())); onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.length())); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.insertion_handle) .perform(dragHandle(textView, Handle.INSERTION, text.indexOf('a'))); @@ -370,7 +399,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex(text.indexOf("f"))); } - public void testSelectionHandles() throws Exception { + @Test + public void testSelectionHandles() { final String text = "abcd efg hijk lmn"; onView(withId(R.id.textview)).perform(replaceText(text)); @@ -383,7 +413,7 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onHandleView(com.android.internal.R.id.selection_end_handle) .check(matches(isDisplayed())); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('a'))); onView(withId(R.id.textview)).check(hasSelection("abcd efg")); @@ -393,7 +423,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("abcd efg hijk")); } - public void testSelectionHandles_bidi() throws Exception { + @Test + public void testSelectionHandles_bidi() { final String text = "abc \u0621\u0622\u0623 def"; onView(withId(R.id.textview)).perform(replaceText(text)); @@ -408,7 +439,7 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("\u0621\u0622\u0623")); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('f'))); onView(withId(R.id.textview)).check(hasSelection("\u0621\u0622\u0623")); @@ -436,12 +467,13 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("abc \u0621\u0622\u0623 def")); } - public void testSelectionHandles_multiLine() throws Exception { + @Test + public void testSelectionHandles_multiLine() { final String text = "abcd\n" + "efg\n" + "hijk\n" + "lmn\n" + "opqr"; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i'))); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('e'))); onView(withId(R.id.textview)).check(hasSelection("efg\nhijk")); @@ -459,7 +491,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("abcd\nefg\nhijk\nlmn\nopqr")); } - public void testSelectionHandles_multiLine_rtl() throws Exception { + @Test + public void testSelectionHandles_multiLine_rtl() { // Arabic text. final String text = "\u062A\u062B\u062C\n" + "\u062D\u062E\u062F\n" + "\u0630\u0631\u0632\n" + "\u0633\u0634\u0635\n" + "\u0636\u0637\u0638\n" @@ -467,7 +500,7 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('\u0634'))); - final TextView textView = (TextView)getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('\u062E'))); onView(withId(R.id.textview)).check(hasSelection( @@ -488,13 +521,13 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection(text)); } - - public void testSelectionHandles_doesNotPassAnotherHandle() throws Exception { + @Test + public void testSelectionHandles_doesNotPassAnotherHandle() { final String text = "abcd efg hijk lmn"; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('f'))); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('l'))); onView(withId(R.id.textview)).check(hasSelection("g")); @@ -505,12 +538,13 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("e")); } - public void testSelectionHandles_doesNotPassAnotherHandle_multiLine() throws Exception { + @Test + public void testSelectionHandles_doesNotPassAnotherHandle_multiLine() { final String text = "abcd\n" + "efg\n" + "hijk\n" + "lmn\n" + "opqr"; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i'))); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('r') + 1)); onView(withId(R.id.textview)).check(hasSelection("k")); @@ -521,12 +555,13 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("h")); } - public void testSelectionHandles_snapToWordBoundary() throws Exception { + @Test + public void testSelectionHandles_snapToWordBoundary() { final String text = "abcd efg hijk lmn opqr"; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('i'))); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('f'))); @@ -573,12 +608,13 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("hijk lmn opq")); } - public void testSelectionHandles_snapToWordBoundary_multiLine() throws Exception { + @Test + public void testSelectionHandles_snapToWordBoundary_multiLine() { final String text = "abcd efg\n" + "hijk lmn\n" + "opqr stu"; onView(withId(R.id.textview)).perform(replaceText(text)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('m'))); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); onHandleView(com.android.internal.R.id.selection_start_handle) .perform(dragHandle(textView, Handle.SELECTION_START, text.indexOf('c'))); @@ -607,14 +643,16 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).check(hasSelection("hijk")); } - public void testSetSelectionAndActionMode() throws Exception { + @Test + public void testSetSelectionAndActionMode() throws Throwable { final String text = "abc def"; onView(withId(R.id.textview)).perform(replaceText(text)); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); assertFloatingToolbarIsNotDisplayed(); - textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0, 3)); - getInstrumentation().waitForIdleSync(); + mActivityRule.runOnUiThread( + () -> Selection.setSelection((Spannable) textView.getText(), 0, 3)); + mInstrumentation.waitForIdleSync(); sleepForFloatingToolbarPopup(); // Don't automatically start action mode. assertFloatingToolbarIsNotDisplayed(); @@ -624,25 +662,29 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); // Changing the selection range by API should not interrupt the selection action mode. - textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0, 3)); - getInstrumentation().waitForIdleSync(); + mActivityRule.runOnUiThread( + () -> Selection.setSelection((Spannable) textView.getText(), 0, 3)); + mInstrumentation.waitForIdleSync(); sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.selectAll)); + mActivity.getString(com.android.internal.R.string.selectAll)); // Make sure that "Select All" is no longer included when the entire text is selected by // API. - textView.post( + mActivityRule.runOnUiThread( () -> Selection.setSelection((Spannable) textView.getText(), 0, text.length())); - getInstrumentation().waitForIdleSync(); + mInstrumentation.waitForIdleSync(); + sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); assertFloatingToolbarDoesNotContainItem( - getActivity().getString(com.android.internal.R.string.selectAll)); + mActivity.getString(com.android.internal.R.string.selectAll)); // Make sure that shrinking the selection range to cursor (an empty range) by API // terminates selection action mode and does not trigger the insertion action mode. - textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0)); - getInstrumentation().waitForIdleSync(); + mActivityRule.runOnUiThread( + () -> Selection.setSelection((Spannable) textView.getText(), 0)); + mInstrumentation.waitForIdleSync(); + sleepForFloatingToolbarPopup(); assertFloatingToolbarIsNotDisplayed(); // Make sure that user click can trigger the insertion action mode. @@ -652,28 +694,32 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarIsDisplayed(); // Make sure that an existing insertion action mode keeps alive after the insertion point is // moved by API. - textView.post(() -> Selection.setSelection((Spannable) textView.getText(), 0)); - getInstrumentation().waitForIdleSync(); + mActivityRule.runOnUiThread( + () -> Selection.setSelection((Spannable) textView.getText(), 0)); + mInstrumentation.waitForIdleSync(); + sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); assertFloatingToolbarDoesNotContainItem( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); // Make sure that selection action mode is started after selection is created by API when // insertion action mode is active. - textView.post( + mActivityRule.runOnUiThread( () -> Selection.setSelection((Spannable) textView.getText(), 1, text.length())); - getInstrumentation().waitForIdleSync(); + mInstrumentation.waitForIdleSync(); + sleepForFloatingToolbarPopup(); assertFloatingToolbarIsDisplayed(); assertFloatingToolbarContainsItem( - getActivity().getString(com.android.internal.R.string.copy)); + mActivity.getString(com.android.internal.R.string.copy)); } - public void testTransientState() throws Exception { + @Test + public void testTransientState() throws Throwable { final String text = "abc def"; onView(withId(R.id.textview)).perform(replaceText(text)); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final TextView textView = mActivity.findViewById(R.id.textview); assertFalse(textView.hasTransientState()); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf('b'))); @@ -682,22 +728,24 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV onView(withId(R.id.textview)).perform(clickOnTextAtIndex(text.indexOf('d'))); // hasTransientState should return false as the selection has been cleared. assertFalse(textView.hasTransientState()); - textView.post( + mActivityRule.runOnUiThread( () -> Selection.setSelection((Spannable) textView.getText(), 0, text.length())); - getInstrumentation().waitForIdleSync(); + mInstrumentation.waitForIdleSync(); + // hasTransientState should return false when selection is created by API. assertFalse(textView.hasTransientState()); } - public void testResetMenuItemTitle() throws Exception { - getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + @Test + public void testResetMenuItemTitle() throws Throwable { + mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null); + final TextView textView = mActivity.findViewById(R.id.textview); final int itemId = 1; final String title1 = " AFIGBO"; final int index = title1.indexOf('I'); final String title2 = title1.substring(index); final String[] title = new String[]{title1}; - textView.post(() -> textView.setCustomSelectionActionModeCallback( + mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback( new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { @@ -720,6 +768,8 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV public void onDestroyActionMode(ActionMode actionMode) { } })); + mInstrumentation.waitForIdleSync(); + onView(withId(R.id.textview)).perform(replaceText(title1)); onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(index)); sleepForFloatingToolbarPopup(); @@ -734,10 +784,11 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarContainsItem(title2); } - public void testAssistItemIsAtIndexZero() throws Exception { - getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null); - final TextView textView = (TextView) getActivity().findViewById(R.id.textview); - textView.post(() -> textView.setCustomSelectionActionModeCallback( + @Test + public void testAssistItemIsAtIndexZero() throws Throwable { + mActivity.getSystemService(TextClassificationManager.class).setTextClassifier(null); + final TextView textView = mActivity.findViewById(R.id.textview); + mActivityRule.runOnUiThread(() -> textView.setCustomSelectionActionModeCallback( new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { @@ -761,6 +812,7 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV public void onDestroyActionMode(ActionMode actionMode) { } })); + mInstrumentation.waitForIdleSync(); final String text = "droid@android.com"; onView(withId(R.id.textview)).perform(replaceText(text)); @@ -769,20 +821,22 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFloatingToolbarItemIndex(android.R.id.textAssist, 0); } - public void testPastePlainText_menuAction() throws Exception { + @Test + public void testPastePlainText_menuAction() { initializeClipboardWithText(TextStyle.STYLED); onView(withId(R.id.textview)).perform(replaceText("")); onView(withId(R.id.textview)).perform(longClick()); sleepForFloatingToolbarPopup(); clickFloatingToolbarItem( - getActivity().getString(com.android.internal.R.string.paste_as_plain_text)); - getInstrumentation().waitForIdleSync(); + mActivity.getString(com.android.internal.R.string.paste_as_plain_text)); + mInstrumentation.waitForIdleSync(); onView(withId(R.id.textview)).check(matches(withText("styledtext"))); onView(withId(R.id.textview)).check(doesNotHaveStyledText()); } + @Test public void testPastePlainText_noMenuItemForPlainText() { initializeClipboardWithText(TextStyle.PLAIN); @@ -791,7 +845,7 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV sleepForFloatingToolbarPopup(); assertFloatingToolbarDoesNotContainItem( - getActivity().getString(com.android.internal.R.string.paste_as_plain_text)); + mActivity.getString(com.android.internal.R.string.paste_as_plain_text)); } private void initializeClipboardWithText(TextStyle textStyle) { @@ -806,9 +860,9 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV default: throw new IllegalArgumentException("Invalid text style"); } - getActivity().getWindow().getDecorView().post(() -> - getActivity().getSystemService(ClipboardManager.class).setPrimaryClip( clip)); - getInstrumentation().waitForIdleSync(); + mActivity.getWindow().getDecorView().post(() -> + mActivity.getSystemService(ClipboardManager.class).setPrimaryClip(clip)); + mInstrumentation.waitForIdleSync(); } private enum TextStyle { diff --git a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java index c25df7c1b44e..cf173fb78a32 100644 --- a/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java +++ b/core/tests/coretests/src/android/widget/TextViewPerformanceTest.java @@ -20,15 +20,20 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.SmallTest; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.MediumTest; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; import android.text.SpannedString; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; -public class TextViewPerformanceTest extends AndroidTestCase { +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class TextViewPerformanceTest { private String mString = "The quick brown fox"; private Canvas mCanvas; @@ -36,16 +41,16 @@ public class TextViewPerformanceTest extends AndroidTestCase { private Paint mPaint; private PerformanceLabelView mLabelView; - @Override - protected void setUp() throws Exception { - super.setUp(); - + @Before + public void setUp() { Bitmap mBitmap = Bitmap.createBitmap(320, 240, Bitmap.Config.RGB_565); mCanvas = new Canvas(mBitmap); ViewGroup.LayoutParams p = new ViewGroup.LayoutParams(320, 240); - mLabelView = new PerformanceLabelView(mContext); + final Context context = InstrumentationRegistry.getContext(); + + mLabelView = new PerformanceLabelView(context); mLabelView.setText(mString); mLabelView.measure(View.MeasureSpec.AT_MOST | 320, View.MeasureSpec.AT_MOST | 240); mLabelView.mySetFrame(320, 240); @@ -54,7 +59,7 @@ public class TextViewPerformanceTest extends AndroidTestCase { mPaint = new Paint(); mCanvas.save(); - mTextView = new PerformanceTextView(mContext); + mTextView = new PerformanceTextView(context); mTextView.setLayoutParams(p); mTextView.setText(mString); mTextView.mySetFrame(320, 240); @@ -62,7 +67,8 @@ public class TextViewPerformanceTest extends AndroidTestCase { } @MediumTest - public void testDrawTextViewLine() throws Exception { + @Test + public void testDrawTextViewLine() { mTextView.myDraw(mCanvas); mTextView.myDraw(mCanvas); mTextView.myDraw(mCanvas); @@ -76,7 +82,8 @@ public class TextViewPerformanceTest extends AndroidTestCase { } @SmallTest - public void testSpan() throws Exception { + @Test + public void testSpan() { CharSequence charSeq = new SpannedString(mString); mTextView.setText(charSeq); @@ -93,12 +100,14 @@ public class TextViewPerformanceTest extends AndroidTestCase { } @SmallTest - public void testCanvasDrawText() throws Exception { + @Test + public void testCanvasDrawText() { mCanvas.drawText(mString, 30, 30, mPaint); } @SmallTest - public void testLabelViewDraw() throws Exception { + @Test + public void testLabelViewDraw() { mLabelView.myDraw(mCanvas); } diff --git a/core/tests/coretests/src/android/widget/TextViewTest.java b/core/tests/coretests/src/android/widget/TextViewTest.java index 8989462a916d..1a1244f0a7d1 100644 --- a/core/tests/coretests/src/android/widget/TextViewTest.java +++ b/core/tests/coretests/src/android/widget/TextViewTest.java @@ -16,41 +16,57 @@ package android.widget; +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertTrue; + import android.app.Activity; +import android.app.Instrumentation; import android.content.Intent; import android.graphics.Paint; import android.platform.test.annotations.Presubmit; -import android.test.ActivityInstrumentationTestCase2; -import android.test.suitebuilder.annotation.SmallTest; +import android.support.test.InstrumentationRegistry; +import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.MediumTest; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; import android.text.GetChars; import android.text.Layout; import android.text.Selection; import android.text.Spannable; -import android.util.Log; import android.view.View; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + import java.util.Locale; /** * TextViewTest tests {@link TextView}. */ -public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActivity> { - private static final String TAG = "TextViewTest"; +@RunWith(AndroidJUnit4.class) +@MediumTest +public class TextViewTest { + @Rule + public ActivityTestRule<TextViewActivity> mActivityRule = new ActivityTestRule<>( + TextViewActivity.class); + private Instrumentation mInstrumentation; + private Activity mActivity; private TextView mTextView; - public TextViewTest() { - super(TextViewActivity.class); + @Before + public void setup() { + mActivity = mActivityRule.getActivity(); + mInstrumentation = InstrumentationRegistry.getInstrumentation(); } - @SmallTest @Presubmit - public void testArray() throws Exception { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - mTextView = new TextView(getActivity()); - } - }); - getInstrumentation().waitForIdleSync(); + @UiThreadTest + @Test + public void testArray() { + mTextView = new TextView(mActivity); char[] c = new char[] { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' }; @@ -78,15 +94,10 @@ public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActiv assertEquals('\0', c2[5]); } - @SmallTest - public void testProcessTextActivityResultNonEditable() { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - mTextView = new TextView(getActivity()); - } - }); - getInstrumentation().waitForIdleSync(); + @Test + public void testProcessTextActivityResultNonEditable() throws Throwable { + mActivityRule.runOnUiThread(() -> mTextView = new TextView(mActivity)); + mInstrumentation.waitForIdleSync(); CharSequence originalText = "This is some text."; mTextView.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, mTextView.getText().toString()); @@ -94,30 +105,23 @@ public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActiv Selection.setSelection((Spannable) mTextView.getText(), 0, mTextView.getText().length()); // We need to run this in the UI thread, as it will create a Toast. - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - CharSequence newText = "Text is replaced."; - Intent data = new Intent(); - data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); - mTextView.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, data); - } + mActivityRule.runOnUiThread(() -> { + CharSequence newText = "Text is replaced."; + Intent data = new Intent(); + data.putExtra(Intent.EXTRA_PROCESS_TEXT, newText); + mTextView.onActivityResult(TextView.PROCESS_TEXT_REQUEST_CODE, Activity.RESULT_OK, + data); }); - getInstrumentation().waitForIdleSync(); + mInstrumentation.waitForIdleSync(); // This is a TextView, which can't be modified. Hence no change should have been made. assertEquals(originalText, mTextView.getText().toString()); } - @SmallTest - public void testProcessTextActivityResultEditable() { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - mTextView = new EditText(getActivity()); - } - }); - getInstrumentation().waitForIdleSync(); + @Test + public void testProcessTextActivityResultEditable() throws Throwable { + mActivityRule.runOnUiThread(() -> mTextView = new EditText(mActivity)); + mInstrumentation.waitForIdleSync(); CharSequence originalText = "This is some text."; mTextView.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, mTextView.getText().toString()); @@ -132,15 +136,10 @@ public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActiv assertEquals(newText, mTextView.getText().toString()); } - @SmallTest - public void testProcessTextActivityResultCancel() { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - mTextView = new EditText(getActivity()); - } - }); - getInstrumentation().waitForIdleSync(); + @Test + public void testProcessTextActivityResultCancel() throws Throwable { + mActivityRule.runOnUiThread(() -> mTextView = new EditText(mActivity)); + mInstrumentation.waitForIdleSync(); CharSequence originalText = "This is some text."; mTextView.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, mTextView.getText().toString()); @@ -156,15 +155,10 @@ public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActiv assertEquals(originalText, mTextView.getText().toString()); } - @SmallTest - public void testProcessTextActivityNoData() { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - mTextView = new EditText(getActivity()); - } - }); - getInstrumentation().waitForIdleSync(); + @Test + public void testProcessTextActivityNoData() throws Throwable { + mActivityRule.runOnUiThread(() -> mTextView = new EditText(mActivity)); + mInstrumentation.waitForIdleSync(); CharSequence originalText = "This is some text."; mTextView.setText(originalText, TextView.BufferType.SPANNABLE); assertEquals(originalText, mTextView.getText().toString()); @@ -176,13 +170,14 @@ public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActiv assertEquals(originalText, mTextView.getText().toString()); } - @SmallTest + @Test + @UiThreadTest public void testHyphenationWidth() { - TextView textView = new TextView(getActivity()); - textView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); - textView.setTextLocale(Locale.US); + mTextView = new TextView(mActivity); + mTextView.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_FULL); + mTextView.setTextLocale(Locale.US); - Paint paint = textView.getPaint(); + Paint paint = mTextView.getPaint(); String word = "thisissuperlonglongword"; float wordWidth = paint.measureText(word, 0, word.length()); @@ -192,17 +187,17 @@ public class TextViewTest extends ActivityInstrumentationTestCase2<TextViewActiv sb.append(word); sb.append(" "); } - textView.setText(sb.toString()); + mTextView.setText(sb.toString()); int width = (int)(wordWidth * 0.7); int height = 4096; // enough for all text. - textView.measure( + mTextView.measure( View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY)); - textView.layout(0, 0, width, height); + mTextView.layout(0, 0, width, height); - Layout layout = textView.getLayout(); + Layout layout = mTextView.getLayout(); assertNotNull(layout); int lineCount = layout.getLineCount(); diff --git a/core/tests/utiltests/src/android/util/RemoteIntArray.java b/core/tests/utiltests/src/android/util/RemoteIntArray.java index 7dc3400779b0..11d0888179d1 100644 --- a/core/tests/utiltests/src/android/util/RemoteIntArray.java +++ b/core/tests/utiltests/src/android/util/RemoteIntArray.java @@ -32,7 +32,7 @@ import java.util.concurrent.TimeoutException; final class RemoteIntArray implements ServiceConnection, Closeable { private static final long BIND_REMOTE_SERVICE_TIMEOUT = - ("eng".equals(Build.TYPE)) ? 120000 : 10000; + Build.IS_ENG ? 120000 : 10000; private final Object mLock = new Object(); diff --git a/graphics/java/android/graphics/ColorFilter.java b/graphics/java/android/graphics/ColorFilter.java index 0ca3729dcc0e..b24b9885d1b0 100644 --- a/graphics/java/android/graphics/ColorFilter.java +++ b/graphics/java/android/graphics/ColorFilter.java @@ -14,19 +14,22 @@ * limitations under the License. */ -// This file was generated from the C++ include file: SkColorFilter.h -// Any changes made to this file will be discarded by the build. -// To change this file, either edit the include, or device/tools/gluemaker/main.cpp, -// or one of the auxilary file specifications in device/tools/gluemaker. - package android.graphics; +import libcore.util.NativeAllocationRegistry; + /** * A color filter can be used with a {@link Paint} to modify the color of * each pixel drawn with that paint. This is an abstract class that should * never be used directly. */ public class ColorFilter { + + private static class NoImagePreloadHolder { + public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( + ColorFilter.class.getClassLoader(), nativeGetFinalizer(), 50); + } + /** * @deprecated Use subclass constructors directly instead. */ @@ -34,9 +37,11 @@ public class ColorFilter { public ColorFilter() {} /** - * Holds the pointer to the native SkColorFilter instance. + * Current native SkColorFilter instance. */ private long mNativeInstance; + // Runnable to do immediate destruction + private Runnable mCleaner; long createNativeInstance() { return 0; @@ -44,35 +49,28 @@ public class ColorFilter { void discardNativeInstance() { if (mNativeInstance != 0) { - nSafeUnref(mNativeInstance); + mCleaner.run(); + mCleaner = null; mNativeInstance = 0; } } - @Override - protected void finalize() throws Throwable { - try { - if (mNativeInstance != 0) { - nSafeUnref(mNativeInstance); - } - mNativeInstance = -1; - } finally { - super.finalize(); - } - } - /** @hide */ public long getNativeInstance() { - if (mNativeInstance == -1) { - throw new IllegalStateException("attempting to use a finalized ColorFilter"); - } - if (mNativeInstance == 0) { mNativeInstance = createNativeInstance(); + + if (mNativeInstance != 0) { + // Note: we must check for null here, since it's possible for createNativeInstance() + // to return nullptr if the native SkColorFilter would be a no-op at draw time. + // See native implementations of subclass create methods for more info. + mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation( + this, mNativeInstance); + } } return mNativeInstance; } - static native void nSafeUnref(long native_instance); + private static native long nativeGetFinalizer(); } diff --git a/libs/hwui/GlopBuilder.cpp b/libs/hwui/GlopBuilder.cpp index 2e9a6e895d8a..c19c1a11e3e2 100644 --- a/libs/hwui/GlopBuilder.cpp +++ b/libs/hwui/GlopBuilder.cpp @@ -457,11 +457,13 @@ GlopBuilder& GlopBuilder::setFillTextureLayer(GlLayer& layer, float alpha) { return *this; } -GlopBuilder& GlopBuilder::setFillExternalTexture(Texture& texture, Matrix4& textureTransform) { +GlopBuilder& GlopBuilder::setFillExternalTexture(Texture& texture, Matrix4& textureTransform, + bool requiresFilter) { TRIGGER_STAGE(kFillStage); REQUIRE_STAGES(kMeshStage | kRoundRectClipStage); - mOutGlop->fill.texture = { &texture, GL_LINEAR, GL_CLAMP_TO_EDGE, &textureTransform }; + GLenum filter = requiresFilter ? GL_LINEAR : GL_NEAREST; + mOutGlop->fill.texture = { &texture, filter, GL_CLAMP_TO_EDGE, &textureTransform }; setFill(SK_ColorWHITE, 1.0f, SkBlendMode::kSrc, Blend::ModeOrderSwap::NoSwap, nullptr, nullptr); diff --git a/libs/hwui/GlopBuilder.h b/libs/hwui/GlopBuilder.h index 87b1568ed72b..6d11da19e138 100644 --- a/libs/hwui/GlopBuilder.h +++ b/libs/hwui/GlopBuilder.h @@ -75,7 +75,8 @@ public: GlopBuilder& setFillTextureLayer(GlLayer& layer, float alpha); // TODO: setFillLayer normally forces its own wrap & filter mode, // which isn't always correct. - GlopBuilder& setFillExternalTexture(Texture& texture, Matrix4& textureTransform); + GlopBuilder& setFillExternalTexture(Texture& texture, Matrix4& textureTransform, + bool requiresFilter); GlopBuilder& setTransform(const Matrix4& canvas, const int transformFlags); diff --git a/libs/hwui/OpenGLReadback.cpp b/libs/hwui/OpenGLReadback.cpp index b073070b58b6..19d5d9d2250e 100644 --- a/libs/hwui/OpenGLReadback.cpp +++ b/libs/hwui/OpenGLReadback.cpp @@ -199,6 +199,7 @@ inline CopyResult copyTextureInto(Caches& caches, RenderState& renderState, GL_TEXTURE_2D, texture, 0); { + bool requiresFilter; // Draw & readback renderState.setViewport(destWidth, destHeight); renderState.scissor().setEnabled(false); @@ -216,12 +217,17 @@ inline CopyResult copyTextureInto(Caches& caches, RenderState& renderState, croppedTexTransform.scale(srcRect.getWidth() / sourceTexture.width(), srcRect.getHeight() / sourceTexture.height(), 1); croppedTexTransform.multiply(sFlipV); + requiresFilter = srcRect.getWidth() != (float) destWidth + || srcRect.getHeight() != (float) destHeight; + } else { + requiresFilter = sourceTexture.width() != (uint32_t) destWidth + || sourceTexture.height() != (uint32_t) destHeight; } Glop glop; GlopBuilder(renderState, caches, &glop) .setRoundRectClipState(nullptr) .setMeshTexturedUnitQuad(nullptr) - .setFillExternalTexture(sourceTexture, croppedTexTransform) + .setFillExternalTexture(sourceTexture, croppedTexTransform, requiresFilter) .setTransform(Matrix4::identity(), TransformFlags::None) .setModelViewMapUnitToRect(Rect(destWidth, destHeight)) .build(); diff --git a/media/java/android/media/AudioManagerInternal.java b/media/java/android/media/AudioManagerInternal.java index 0a1de33b845b..2b5ac5e6ec20 100644 --- a/media/java/android/media/AudioManagerInternal.java +++ b/media/java/android/media/AudioManagerInternal.java @@ -59,4 +59,15 @@ public abstract class AudioManagerInternal { int getRingerModeAffectedStreams(int streams); } + + /** + * Disable or restore the ability to play audio for a given UID. + * When a UID isn't meant to be tracked anymore (e.g. client died), re-enable audio for this UID + * to prevent disabling audio for future UIDs that would reuse the same value. + * This operation is asynchronous. + * @param disable when true, prevents playback of audio streams from the given uid. If false, + * restores the ability to play, or no-op if playback hadn't been disabled before. + * @param uid the client UID whose ability to play will be affected. + */ + public abstract void disableAudioForUid(boolean disable, int uid); } diff --git a/media/java/android/media/MediaCas.java b/media/java/android/media/MediaCas.java index ce50cc801daf..12352e7f8b24 100644 --- a/media/java/android/media/MediaCas.java +++ b/media/java/android/media/MediaCas.java @@ -18,21 +18,20 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; +import android.hardware.cas.V1_0.*; import android.media.MediaCasException.*; import android.os.Handler; import android.os.HandlerThread; -import android.os.IBinder; +import android.os.IHwBinder; import android.os.Looper; import android.os.Message; -import android.os.Parcel; -import android.os.Parcelable; import android.os.Process; import android.os.RemoteException; -import android.os.ServiceManager; -import android.os.ServiceSpecificException; import android.util.Log; import android.util.Singleton; +import java.util.ArrayList; + /** * MediaCas can be used to obtain keys for descrambling protected media streams, in * conjunction with {@link android.media.MediaDescrambler}. The MediaCas APIs are @@ -95,7 +94,6 @@ import android.util.Singleton; */ public final class MediaCas implements AutoCloseable { private static final String TAG = "MediaCas"; - private final ParcelableCasData mCasData = new ParcelableCasData(); private ICas mICas; private EventListener mListener; private HandlerThread mHandlerThread; @@ -105,8 +103,10 @@ public final class MediaCas implements AutoCloseable { new Singleton<IMediaCasService>() { @Override protected IMediaCasService create() { - return IMediaCasService.Stub.asInterface( - ServiceManager.getService("media.cas")); + try { + return IMediaCasService.getService(); + } catch (RemoteException e) {} + return null; } }; @@ -136,14 +136,15 @@ public final class MediaCas implements AutoCloseable { @Override public void handleMessage(Message msg) { if (msg.what == MSG_CAS_EVENT) { - mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, (byte[]) msg.obj); + mListener.onEvent(MediaCas.this, msg.arg1, msg.arg2, + toBytes((ArrayList<Byte>) msg.obj)); } } } private final ICasListener.Stub mBinder = new ICasListener.Stub() { @Override - public void onEvent(int event, int arg, @Nullable byte[] data) + public void onEvent(int event, int arg, @Nullable ArrayList<Byte> data) throws RemoteException { mEventHandler.sendMessage(mEventHandler.obtainMessage( EventHandler.MSG_CAS_EVENT, event, arg, data)); @@ -151,51 +152,6 @@ public final class MediaCas implements AutoCloseable { }; /** - * Class for parceling byte array data over ICas binder. - */ - static class ParcelableCasData implements Parcelable { - private byte[] mData; - private int mOffset; - private int mLength; - - ParcelableCasData() { - mData = null; - mOffset = mLength = 0; - } - - private ParcelableCasData(Parcel in) { - this(); - } - - void set(@NonNull byte[] data, int offset, int length) { - mData = data; - mOffset = offset; - mLength = length; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeByteArray(mData, mOffset, mLength); - } - - public static final Parcelable.Creator<ParcelableCasData> CREATOR - = new Parcelable.Creator<ParcelableCasData>() { - public ParcelableCasData createFromParcel(Parcel in) { - return new ParcelableCasData(in); - } - - public ParcelableCasData[] newArray(int size) { - return new ParcelableCasData[size]; - } - }; - } - - /** * Describe a CAS plugin with its CA_system_ID and string name. * * Returned as results of {@link #enumeratePlugins}. @@ -210,9 +166,9 @@ public final class MediaCas implements AutoCloseable { mName = null; } - PluginDescriptor(int CA_system_id, String name) { - mCASystemId = CA_system_id; - mName = name; + PluginDescriptor(@NonNull HidlCasPluginDescriptor descriptor) { + mCASystemId = descriptor.caSystemId; + mName = descriptor.name; } public int getSystemId() { @@ -230,13 +186,38 @@ public final class MediaCas implements AutoCloseable { } } + private ArrayList<Byte> toByteArray(@NonNull byte[] data, int offset, int length) { + ArrayList<Byte> byteArray = new ArrayList<Byte>(length); + for (int i = 0; i < length; i++) { + byteArray.add(Byte.valueOf(data[offset + i])); + } + return byteArray; + } + + private ArrayList<Byte> toByteArray(@Nullable byte[] data) { + if (data == null) { + return new ArrayList<Byte>(); + } + return toByteArray(data, 0, data.length); + } + + private byte[] toBytes(@NonNull ArrayList<Byte> byteArray) { + byte[] data = null; + if (byteArray != null) { + data = new byte[byteArray.size()]; + for (int i = 0; i < data.length; i++) { + data[i] = byteArray.get(i); + } + } + return data; + } /** * Class for an open session with the CA system. */ public final class Session implements AutoCloseable { - final byte[] mSessionId; + final ArrayList<Byte> mSessionId; - Session(@NonNull byte[] sessionId) { + Session(@NonNull ArrayList<Byte> sessionId) { mSessionId = sessionId; } @@ -254,9 +235,8 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mICas.setSessionPrivateData(mSessionId, data); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + MediaCasException.throwExceptionIfNeeded( + mICas.setSessionPrivateData(mSessionId, toByteArray(data, 0, data.length))); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } @@ -279,10 +259,8 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mCasData.set(data, offset, length); - mICas.processEcm(mSessionId, mCasData); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + MediaCasException.throwExceptionIfNeeded( + mICas.processEcm(mSessionId, toByteArray(data, offset, length))); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } @@ -314,57 +292,22 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mICas.closeSession(mSessionId); - } catch (ServiceSpecificException e) { - MediaCasStateException.throwExceptions(e); + MediaCasStateException.throwExceptionIfNeeded( + mICas.closeSession(mSessionId)); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } } } - Session createFromSessionId(byte[] sessionId) { - if (sessionId == null || sessionId.length == 0) { + Session createFromSessionId(@NonNull ArrayList<Byte> sessionId) { + if (sessionId == null || sessionId.size() == 0) { return null; } return new Session(sessionId); } /** - * Class for parceling CAS plugin descriptors over IMediaCasService binder. - */ - static class ParcelableCasPluginDescriptor - extends PluginDescriptor implements Parcelable { - - private ParcelableCasPluginDescriptor(int CA_system_id, String name) { - super(CA_system_id, name); - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - Log.w(TAG, "ParcelableCasPluginDescriptor.writeToParcel shouldn't be called!"); - } - - public static final Parcelable.Creator<ParcelableCasPluginDescriptor> CREATOR - = new Parcelable.Creator<ParcelableCasPluginDescriptor>() { - public ParcelableCasPluginDescriptor createFromParcel(Parcel in) { - int CA_system_id = in.readInt(); - String name = in.readString(); - return new ParcelableCasPluginDescriptor(CA_system_id, name); - } - - public ParcelableCasPluginDescriptor[] newArray(int size) { - return new ParcelableCasPluginDescriptor[size]; - } - }; - } - - /** * Query if a certain CA system is supported on this device. * * @param CA_system_id the id of the CA system. @@ -393,13 +336,14 @@ public final class MediaCas implements AutoCloseable { if (service != null) { try { - ParcelableCasPluginDescriptor[] descriptors = service.enumeratePlugins(); - if (descriptors.length == 0) { + ArrayList<HidlCasPluginDescriptor> descriptors = + service.enumeratePlugins(); + if (descriptors.size() == 0) { return null; } - PluginDescriptor[] results = new PluginDescriptor[descriptors.length]; + PluginDescriptor[] results = new PluginDescriptor[descriptors.size()]; for (int i = 0; i < results.length; i++) { - results[i] = descriptors[i]; + results[i] = new PluginDescriptor(descriptors.get(i)); } return results; } catch (RemoteException e) { @@ -430,7 +374,7 @@ public final class MediaCas implements AutoCloseable { } } - IBinder getBinder() { + IHwBinder getBinder() { validateInternalStates(); return mICas.asBinder(); @@ -497,14 +441,22 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mICas.setPrivateData(data); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + MediaCasException.throwExceptionIfNeeded( + mICas.setPrivateData(toByteArray(data, 0, data.length))); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } } + private class OpenSessionCallback implements ICas.openSessionCallback { + public Session mSession; + public int mStatus; + @Override + public void onValues(int status, ArrayList<Byte> sessionId) { + mStatus = status; + mSession = createFromSessionId(sessionId); + } + } /** * Open a session to descramble one or more streams scrambled by the * conditional access system. @@ -519,9 +471,10 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - return createFromSessionId(mICas.openSession()); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + OpenSessionCallback cb = new OpenSessionCallback(); + mICas.openSession(cb); + MediaCasException.throwExceptionIfNeeded(cb.mStatus); + return cb.mSession; } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } @@ -544,10 +497,8 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mCasData.set(data, offset, length); - mICas.processEmm(mCasData); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + MediaCasException.throwExceptionIfNeeded( + mICas.processEmm(toByteArray(data, offset, length))); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } @@ -585,9 +536,8 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mICas.sendEvent(event, arg, data); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + MediaCasException.throwExceptionIfNeeded( + mICas.sendEvent(event, arg, toByteArray(data))); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } @@ -608,9 +558,8 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mICas.provision(provisionString); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + MediaCasException.throwExceptionIfNeeded( + mICas.provision(provisionString)); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } @@ -631,9 +580,8 @@ public final class MediaCas implements AutoCloseable { validateInternalStates(); try { - mICas.refreshEntitlements(refreshType, refreshData); - } catch (ServiceSpecificException e) { - MediaCasException.throwExceptions(e); + MediaCasException.throwExceptionIfNeeded( + mICas.refreshEntitlements(refreshType, toByteArray(refreshData))); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } diff --git a/media/java/android/media/MediaCasException.java b/media/java/android/media/MediaCasException.java index 485f6eebf88e..35fb104b7f0b 100644 --- a/media/java/android/media/MediaCasException.java +++ b/media/java/android/media/MediaCasException.java @@ -16,60 +16,29 @@ package android.media; -import android.os.ServiceSpecificException; +import android.hardware.cas.V1_0.Status; /** * Base class for MediaCas exceptions */ public class MediaCasException extends Exception { - - /** @hide */ - public static final int DRM_ERROR_BASE = -2000; - /** @hide */ - public static final int ERROR_DRM_UNKNOWN = DRM_ERROR_BASE; - /** @hide */ - public static final int ERROR_DRM_NO_LICENSE = DRM_ERROR_BASE - 1; - /** @hide */ - public static final int ERROR_DRM_LICENSE_EXPIRED = DRM_ERROR_BASE - 2; - /** @hide */ - public static final int ERROR_DRM_SESSION_NOT_OPENED = DRM_ERROR_BASE - 3; - /** @hide */ - public static final int ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED = DRM_ERROR_BASE - 4; - /** @hide */ - public static final int ERROR_DRM_DECRYPT = DRM_ERROR_BASE - 5; - /** @hide */ - public static final int ERROR_DRM_CANNOT_HANDLE = DRM_ERROR_BASE - 6; - /** @hide */ - public static final int ERROR_DRM_TAMPER_DETECTED = DRM_ERROR_BASE - 7; - /** @hide */ - public static final int ERROR_DRM_NOT_PROVISIONED = DRM_ERROR_BASE - 8; - /** @hide */ - public static final int ERROR_DRM_DEVICE_REVOKED = DRM_ERROR_BASE - 9; - /** @hide */ - public static final int ERROR_DRM_RESOURCE_BUSY = DRM_ERROR_BASE - 10; - /** @hide */ - public static final int ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION = DRM_ERROR_BASE - 11; - /** @hide */ - public static final int ERROR_DRM_LAST_USED_ERRORCODE = DRM_ERROR_BASE - 11; - /** @hide */ - public static final int ERROR_DRM_VENDOR_MAX = DRM_ERROR_BASE - 500; - /** @hide */ - public static final int ERROR_DRM_VENDOR_MIN = DRM_ERROR_BASE - 999; - - /** @hide */ - public MediaCasException(String detailMessage) { + private MediaCasException(String detailMessage) { super(detailMessage); } - static void throwExceptions(ServiceSpecificException e) throws MediaCasException { - if (e.errorCode == ERROR_DRM_NOT_PROVISIONED) { - throw new NotProvisionedException(e.getMessage()); - } else if (e.errorCode == ERROR_DRM_RESOURCE_BUSY) { - throw new ResourceBusyException(e.getMessage()); - } else if (e.errorCode == ERROR_DRM_DEVICE_REVOKED) { - throw new DeniedByServerException(e.getMessage()); + static void throwExceptionIfNeeded(int error) throws MediaCasException { + if (error == Status.OK) { + return; + } + + if (error == Status.ERROR_CAS_NOT_PROVISIONED) { + throw new NotProvisionedException(null); + } else if (error == Status.ERROR_CAS_RESOURCE_BUSY) { + throw new ResourceBusyException(null); + } else if (error == Status.ERROR_CAS_DEVICE_REVOKED) { + throw new DeniedByServerException(null); } else { - MediaCasStateException.throwExceptions(e); + MediaCasStateException.throwExceptionIfNeeded(error); } } diff --git a/media/java/android/media/MediaCasStateException.java b/media/java/android/media/MediaCasStateException.java index cf05c2975272..26c57923912d 100644 --- a/media/java/android/media/MediaCasStateException.java +++ b/media/java/android/media/MediaCasStateException.java @@ -18,9 +18,8 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; -import android.os.ServiceSpecificException; -import static android.media.MediaCasException.*; +import android.hardware.cas.V1_0.Status; /** * Base class for MediaCas runtime exceptions @@ -29,46 +28,62 @@ public class MediaCasStateException extends IllegalStateException { private final int mErrorCode; private final String mDiagnosticInfo; - /** @hide */ - public MediaCasStateException(int err, @Nullable String msg, @Nullable String diagnosticInfo) { + private MediaCasStateException(int err, @Nullable String msg, @Nullable String diagnosticInfo) { super(msg); mErrorCode = err; mDiagnosticInfo = diagnosticInfo; } - static void throwExceptions(ServiceSpecificException e) { + static void throwExceptionIfNeeded(int err) { + throwExceptionIfNeeded(err, null /* msg */); + } + + static void throwExceptionIfNeeded(int err, @Nullable String msg) { + if (err == Status.OK) { + return; + } + if (err == Status.BAD_VALUE) { + throw new IllegalArgumentException(); + } + String diagnosticInfo = ""; - switch (e.errorCode) { - case ERROR_DRM_UNKNOWN: + switch (err) { + case Status.ERROR_CAS_UNKNOWN: diagnosticInfo = "General CAS error"; break; - case ERROR_DRM_NO_LICENSE: + case Status.ERROR_CAS_NO_LICENSE: diagnosticInfo = "No license"; break; - case ERROR_DRM_LICENSE_EXPIRED: + case Status.ERROR_CAS_LICENSE_EXPIRED: diagnosticInfo = "License expired"; break; - case ERROR_DRM_SESSION_NOT_OPENED: + case Status.ERROR_CAS_SESSION_NOT_OPENED: diagnosticInfo = "Session not opened"; break; - case ERROR_DRM_DECRYPT_UNIT_NOT_INITIALIZED: - diagnosticInfo = "Not initialized"; + case Status.ERROR_CAS_CANNOT_HANDLE: + diagnosticInfo = "Unsupported scheme or data format"; break; - case ERROR_DRM_DECRYPT: - diagnosticInfo = "Decrypt error"; + case Status.ERROR_CAS_INVALID_STATE: + diagnosticInfo = "Invalid CAS state"; break; - case ERROR_DRM_CANNOT_HANDLE: - diagnosticInfo = "Unsupported scheme or data format"; + case Status.ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION: + diagnosticInfo = "Insufficient output protection"; break; - case ERROR_DRM_TAMPER_DETECTED: + case Status.ERROR_CAS_TAMPER_DETECTED: diagnosticInfo = "Tamper detected"; break; + case Status.ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED: + diagnosticInfo = "Not initialized"; + break; + case Status.ERROR_CAS_DECRYPT: + diagnosticInfo = "Decrypt error"; + break; default: diagnosticInfo = "Unknown CAS state exception"; break; } - throw new MediaCasStateException(e.errorCode, e.getMessage(), - String.format("%s (err=%d)", diagnosticInfo, e.errorCode)); + throw new MediaCasStateException(err, msg, + String.format("%s (err=%d)", diagnosticInfo, err)); } /** diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index e667554dab64..3d5f6bc9ac71 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -26,6 +26,7 @@ import android.media.MediaCodecInfo.CodecCapabilities; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.IHwBinder; import android.os.Looper; import android.os.Message; import android.os.PersistableBundle; @@ -1903,7 +1904,7 @@ final public class MediaCodec { private void configure( @Nullable MediaFormat format, @Nullable Surface surface, - @Nullable MediaCrypto crypto, @Nullable IBinder descramblerBinder, + @Nullable MediaCrypto crypto, @Nullable IHwBinder descramblerBinder, @ConfigureFlag int flags) { if (crypto != null && descramblerBinder != null) { throw new IllegalArgumentException("Can't use crypto and descrambler together!"); @@ -2018,7 +2019,7 @@ final public class MediaCodec { private native final void native_configure( @Nullable String[] keys, @Nullable Object[] values, @Nullable Surface surface, @Nullable MediaCrypto crypto, - @Nullable IBinder descramblerBinder, @ConfigureFlag int flags); + @Nullable IHwBinder descramblerBinder, @ConfigureFlag int flags); /** * Requests a Surface to use as the input to an encoder, in place of input buffers. This diff --git a/media/java/android/media/MediaDescrambler.java b/media/java/android/media/MediaDescrambler.java index b75b7dd8b742..40c837b13cc8 100644 --- a/media/java/android/media/MediaDescrambler.java +++ b/media/java/android/media/MediaDescrambler.java @@ -17,10 +17,9 @@ package android.media; import android.annotation.NonNull; +import android.hardware.cas.V1_0.*; import android.media.MediaCasException.UnsupportedCasException; -import android.os.IBinder; -import android.os.Parcel; -import android.os.Parcelable; +import android.os.IHwBinder; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.util.Log; @@ -40,7 +39,7 @@ import java.nio.ByteBuffer; */ public final class MediaDescrambler implements AutoCloseable { private static final String TAG = "MediaDescrambler"; - private IDescrambler mIDescrambler; + private IDescramblerBase mIDescrambler; private final void validateInternalStates() { if (mIDescrambler == null) { @@ -54,39 +53,6 @@ public final class MediaDescrambler implements AutoCloseable { } /** - * Class for parceling descrambling parameters over IDescrambler binder. - */ - // This class currently is not used by Java binder. descramble() goes through - // jni to use shared memory. However, the parcelable is still required for AIDL. - static class DescrambleInfo implements Parcelable { - private DescrambleInfo() { - } - - private DescrambleInfo(Parcel in) { - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - } - - public static final Parcelable.Creator<DescrambleInfo> CREATOR - = new Parcelable.Creator<DescrambleInfo>() { - public DescrambleInfo createFromParcel(Parcel in) { - return new DescrambleInfo(in); - } - - public DescrambleInfo[] newArray(int size) { - return new DescrambleInfo[size]; - } - }; - } - - /** * Instantiate a MediaDescrambler. * * @param CA_system_id The system id of the scrambling scheme. @@ -107,7 +73,7 @@ public final class MediaDescrambler implements AutoCloseable { native_setup(mIDescrambler.asBinder()); } - IBinder getBinder() { + IHwBinder getBinder() { validateInternalStates(); return mIDescrambler.asBinder(); @@ -151,9 +117,8 @@ public final class MediaDescrambler implements AutoCloseable { validateInternalStates(); try { - mIDescrambler.setMediaCasSession(session.mSessionId); - } catch (ServiceSpecificException e) { - MediaCasStateException.throwExceptions(e); + MediaCasStateException.throwExceptionIfNeeded( + mIDescrambler.setMediaCasSession(session.mSessionId)); } catch (RemoteException e) { cleanupAndRethrowIllegalState(); } @@ -210,7 +175,9 @@ public final class MediaDescrambler implements AutoCloseable { srcBuf, srcBuf.position(), srcBuf.limit(), dstBuf, dstBuf.position(), dstBuf.limit()); } catch (ServiceSpecificException e) { - MediaCasStateException.throwExceptions(e); + MediaCasStateException.throwExceptionIfNeeded(e.errorCode, e.getMessage()); + } catch (RemoteException e) { + cleanupAndRethrowIllegalState(); } return -1; } @@ -234,12 +201,12 @@ public final class MediaDescrambler implements AutoCloseable { } private static native final void native_init(); - private native final void native_setup(@NonNull IBinder decramblerBinder); + private native final void native_setup(@NonNull IHwBinder decramblerBinder); private native final void native_release(); private native final int native_descramble( byte key, int numSubSamples, int[] numBytesOfClearData, int[] numBytesOfEncryptedData, @NonNull ByteBuffer srcBuf, int srcOffset, int srcLimit, - ByteBuffer dstBuf, int dstOffset, int dstLimit); + ByteBuffer dstBuf, int dstOffset, int dstLimit) throws RemoteException; static { System.loadLibrary("media_jni"); diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java index fe461be6dea5..2c1b4b3526e0 100644 --- a/media/java/android/media/MediaExtractor.java +++ b/media/java/android/media/MediaExtractor.java @@ -26,8 +26,8 @@ import android.media.MediaCodec; import android.media.MediaFormat; import android.media.MediaHTTPService; import android.net.Uri; -import android.os.Bundle; import android.os.IBinder; +import android.os.IHwBinder; import android.os.PersistableBundle; import com.android.internal.util.Preconditions; @@ -38,9 +38,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.Collections; +import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.UUID; @@ -263,7 +262,7 @@ final public class MediaExtractor { nativeSetMediaCas(mediaCas.getBinder()); } - private native final void nativeSetMediaCas(@NonNull IBinder casBinder); + private native final void nativeSetMediaCas(@NonNull IHwBinder casBinder); /** * Describes the conditional access system used to scramble a track. @@ -300,6 +299,14 @@ final public class MediaExtractor { } } + private ArrayList<Byte> toByteArray(@NonNull byte[] data) { + ArrayList<Byte> byteArray = new ArrayList<Byte>(data.length); + for (int i = 0; i < data.length; i++) { + byteArray.add(i, Byte.valueOf(data[i])); + } + return byteArray; + } + /** * Retrieves the information about the conditional access system used to scramble * a track. @@ -317,7 +324,7 @@ final public class MediaExtractor { buf.rewind(); final byte[] sessionId = new byte[buf.remaining()]; buf.get(sessionId); - session = mMediaCas.createFromSessionId(sessionId); + session = mMediaCas.createFromSessionId(toByteArray(sessionId)); } return new CasInfo(systemId, session); } diff --git a/media/jni/Android.bp b/media/jni/Android.bp index 9686ab5cafb1..02667ca070a4 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -50,6 +50,12 @@ cc_library_shared { "libexif", "libpiex", "libandroidfw", + "libhidlbase", + "libhidltransport", + "android.hardware.cas@1.0", + "android.hardware.cas.native@1.0", + "android.hidl.memory@1.0", + "android.hidl.token@1.0-utils", ], header_libs: ["libhardware_headers"], diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index 04230a0ab6bd..a27d15782905 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -21,6 +21,7 @@ #include "android_media_MediaCodec.h" #include "android_media_MediaCrypto.h" +#include "android_media_MediaDescrambler.h" #include "android_media_MediaMetricsJNI.h" #include "android_media_Utils.h" #include "android_runtime/AndroidRuntime.h" @@ -29,7 +30,7 @@ #include "jni.h" #include "JNIHelp.h" -#include <android/media/IDescrambler.h> +#include <android/hardware/cas/native/1.0/IDescrambler.h> #include <cutils/compiler.h> @@ -1010,8 +1011,7 @@ static void android_media_MediaCodec_native_configure( sp<IDescrambler> descrambler; if (descramblerBinderObj != NULL) { - sp<IBinder> binder = ibinderForJavaObject(env, descramblerBinderObj); - descrambler = interface_cast<IDescrambler>(binder); + descrambler = JDescrambler::GetDescrambler(env, descramblerBinderObj); } err = codec->configure(format, bufferProducer, crypto, descrambler, flags); @@ -1952,7 +1952,7 @@ static const JNINativeMethod gMethods[] = { { "native_configure", "([Ljava/lang/String;[Ljava/lang/Object;Landroid/view/Surface;" - "Landroid/media/MediaCrypto;Landroid/os/IBinder;I)V", + "Landroid/media/MediaCrypto;Landroid/os/IHwBinder;I)V", (void *)android_media_MediaCodec_native_configure }, { "native_setSurface", diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h index c9a1700215a4..2ec8703adc83 100644 --- a/media/jni/android_media_MediaCodec.h +++ b/media/jni/android_media_MediaCodec.h @@ -36,10 +36,13 @@ class IGraphicBufferProducer; struct MediaCodec; struct PersistentSurface; class Surface; -namespace media { -class IDescrambler; -}; -using namespace media; +namespace hardware { +namespace cas { +namespace native { +namespace V1_0 { +struct IDescrambler; +}}}} +using hardware::cas::native::V1_0::IDescrambler; struct JMediaCodec : public AHandler { JMediaCodec( diff --git a/media/jni/android_media_MediaDescrambler.cpp b/media/jni/android_media_MediaDescrambler.cpp index 85d33b773007..bee52188e798 100644 --- a/media/jni/android_media_MediaDescrambler.cpp +++ b/media/jni/android_media_MediaDescrambler.cpp @@ -20,16 +20,19 @@ #include "android_media_MediaDescrambler.h" #include "android_runtime/AndroidRuntime.h" -#include "android_util_Binder.h" +#include "android_os_HwRemoteBinder.h" #include "JNIHelp.h" -#include <android/media/IDescrambler.h> +#include <android/hardware/cas/native/1.0/BpHwDescrambler.h> +#include <android/hardware/cas/native/1.0/BnHwDescrambler.h> #include <binder/MemoryDealer.h> +#include <hidl/HidlSupport.h> #include <media/stagefright/foundation/ADebug.h> #include <nativehelper/ScopedLocalRef.h> namespace android { -using media::MediaDescrambler::DescrambleInfo; + +using hardware::hidl_handle; struct fields_t { jfieldID context; @@ -94,10 +97,9 @@ static status_t getBufferAndSize( } JDescrambler::JDescrambler(JNIEnv *env, jobject descramblerBinderObj) { - sp<IDescrambler> cas; - if (descramblerBinderObj != NULL) { - sp<IBinder> binder = ibinderForJavaObject(env, descramblerBinderObj); - mDescrambler = interface_cast<IDescrambler>(binder); + mDescrambler = GetDescrambler(env, descramblerBinderObj); + if (mDescrambler == NULL) { + jniThrowException(env, "java/lang/NullPointerException", NULL); } } @@ -108,9 +110,23 @@ JDescrambler::~JDescrambler() { mDealer.clear(); } -void JDescrambler::ensureBufferCapacity(size_t neededSize) { +// static +sp<IDescrambler> JDescrambler::GetDescrambler(JNIEnv *env, jobject obj) { + if (obj != NULL) { + sp<hardware::IBinder> hwBinder = + JHwRemoteBinder::GetNativeContext(env, obj)->getBinder(); + + if (hwBinder != NULL) { + return hardware::fromBinder< + IDescrambler, BpHwDescrambler, BnHwDescrambler>(hwBinder); + } + } + return NULL; +} + +bool JDescrambler::ensureBufferCapacity(size_t neededSize) { if (mMem != NULL && mMem->size() >= neededSize) { - return; + return true; } ALOGV("ensureBufferCapacity: current size %zu, new size %zu", @@ -122,49 +138,84 @@ void JDescrambler::ensureBufferCapacity(size_t neededSize) { neededSize = (neededSize + 65535) & ~65535; mDealer = new MemoryDealer(neededSize, "JDescrambler"); mMem = mDealer->allocate(neededSize); + + ssize_t offset; + size_t size; + sp<IMemoryHeap> heap = mMem->getMemory(&offset, &size); + if (heap == NULL) { + return false; + } + + native_handle_t* nativeHandle = native_handle_create(1, 0); + if (!nativeHandle) { + ALOGE("ensureBufferCapacity: failed to create native handle"); + return false; + } + nativeHandle->data[0] = heap->getHeapID(); + mDescramblerSrcBuffer.heapBase = hidl_memory("ashmem", + hidl_handle(nativeHandle), heap->getSize()); + mDescramblerSrcBuffer.offset = (uint64_t) offset; + mDescramblerSrcBuffer.size = (uint64_t) size; + return true; } -Status JDescrambler::descramble( +status_t JDescrambler::descramble( jbyte key, - size_t numSubSamples, ssize_t totalLength, - DescramblerPlugin::SubSample *subSamples, + const hidl_vec<SubSample>& subSamples, const void *srcPtr, jint srcOffset, void *dstPtr, jint dstOffset, - ssize_t *result) { + Status *status, + uint32_t *bytesWritten, + hidl_string *detailedError) { // TODO: IDescrambler::descramble() is re-entrant, however because we // only have 1 shared mem buffer, we can only do 1 descramble at a time. // Concurrency might be improved by allowing on-demand allocation of up // to 2 shared mem buffers. Mutex::Autolock autolock(mSharedMemLock); - ensureBufferCapacity(totalLength); + if (!ensureBufferCapacity(totalLength)) { + return NO_MEMORY; + } memcpy(mMem->pointer(), (const void*)((const uint8_t*)srcPtr + srcOffset), totalLength); - DescrambleInfo info; - info.dstType = DescrambleInfo::kDestinationTypeVmPointer; - info.numSubSamples = numSubSamples; - info.scramblingControl = (DescramblerPlugin::ScramblingControl) key; - info.subSamples = subSamples; - info.srcMem = mMem; - info.srcOffset = 0; - info.dstPtr = NULL; - info.dstOffset = 0; - - int32_t descrambleResult; - Status status = mDescrambler->descramble(info, &descrambleResult); - - if (status.isOk()) { - *result = (descrambleResult <= totalLength) ? descrambleResult : -1; - if (*result > 0) { - memcpy((void*)((uint8_t*)dstPtr + dstOffset), mMem->pointer(), *result); + DestinationBuffer dstBuffer; + dstBuffer.type = BufferType::SHARED_MEMORY; + dstBuffer.nonsecureMemory = mDescramblerSrcBuffer; + + auto err = mDescrambler->descramble( + (ScramblingControl) key, + subSamples, + mDescramblerSrcBuffer, + 0, + dstBuffer, + 0, + [&status, &bytesWritten, &detailedError] ( + Status _status, uint32_t _bytesWritten, + const hidl_string& _detailedError) { + *status = _status; + *bytesWritten = _bytesWritten; + *detailedError = _detailedError; + }); + + if (!err.isOk()) { + return FAILED_TRANSACTION; + } + + if (*status == Status::OK) { + if (*bytesWritten > 0 && (ssize_t) *bytesWritten <= totalLength) { + memcpy((void*)((uint8_t*)dstPtr + dstOffset), mMem->pointer(), *bytesWritten); + } else { + // status seems OK but bytesWritten is invalid, we really + // have no idea what is wrong. + *status = Status::ERROR_CAS_UNKNOWN; } } - return status; + return OK; } } // namespace android @@ -191,10 +242,10 @@ static void android_media_MediaDescrambler_native_setup( static ssize_t getSubSampleInfo(JNIEnv *env, jint numSubSamples, jintArray numBytesOfClearDataObj, jintArray numBytesOfEncryptedDataObj, - DescramblerPlugin::SubSample **outSubSamples) { + hidl_vec<SubSample> *outSubSamples) { - if (numSubSamples <= 0 || numSubSamples >= - (signed)(INT32_MAX / sizeof(DescramblerPlugin::SubSample)) ) { + if (numSubSamples <= 0 || + numSubSamples >= (signed)(INT32_MAX / sizeof(SubSample))) { // subSamples array may silently overflow if number of samples are // too large. Use INT32_MAX as maximum allocation size may be less // than SIZE_MAX on some platforms. @@ -215,24 +266,23 @@ static ssize_t getSubSampleInfo(JNIEnv *env, jint numSubSamples, ? NULL : env->GetIntArrayElements(numBytesOfEncryptedDataObj, &isCopy); - DescramblerPlugin::SubSample *subSamples = - new(std::nothrow) DescramblerPlugin::SubSample[numSubSamples]; - + outSubSamples->resize(numSubSamples); + SubSample *subSamples = outSubSamples->data(); if (subSamples == NULL) { ALOGE("Failed to allocate SubSample array!"); return -1; } for (jint i = 0; i < numSubSamples; ++i) { - subSamples[i].mNumBytesOfClearData = + subSamples[i].numBytesOfClearData = (numBytesOfClearData == NULL) ? 0 : numBytesOfClearData[i]; - subSamples[i].mNumBytesOfEncryptedData = + subSamples[i].numBytesOfEncryptedData = (numBytesOfEncryptedData == NULL) ? 0 : numBytesOfEncryptedData[i]; - totalSize += subSamples[i].mNumBytesOfClearData + - subSamples[i].mNumBytesOfEncryptedData; + totalSize += subSamples[i].numBytesOfClearData + + subSamples[i].numBytesOfEncryptedData; } if (numBytesOfEncryptedData != NULL) { @@ -248,12 +298,9 @@ static ssize_t getSubSampleInfo(JNIEnv *env, jint numSubSamples, } if (totalSize < 0) { - delete[] subSamples; return -1; } - *outSubSamples = subSamples; - return totalSize; } @@ -280,12 +327,6 @@ static jthrowable createServiceSpecificException( clazz.get(), ctor, serviceSpecificError, msgObj.get()); } -static void throwServiceSpecificException( - JNIEnv *env, int serviceSpecificError, const char *msg) { - jthrowable exception = createServiceSpecificException(env, serviceSpecificError, msg); - env->Throw(exception); -} - static jint android_media_MediaDescrambler_native_descramble( JNIEnv *env, jobject thiz, jbyte key, jint numSubSamples, jintArray numBytesOfClearDataObj, jintArray numBytesOfEncryptedDataObj, @@ -293,11 +334,12 @@ static jint android_media_MediaDescrambler_native_descramble( jobject dstBuf, jint dstOffset, jint dstLimit) { sp<JDescrambler> descrambler = getDescrambler(env, thiz); if (descrambler == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", NULL); + jniThrowException(env, "java/lang/IllegalStateException", + "Invalid descrambler object!"); return -1; } - DescramblerPlugin::SubSample *subSamples = NULL; + hidl_vec<SubSample> subSamples; ssize_t totalLength = getSubSampleInfo( env, numSubSamples, numBytesOfClearDataObj, numBytesOfEncryptedDataObj, &subSamples); @@ -307,7 +349,6 @@ static jint android_media_MediaDescrambler_native_descramble( return -1; } - ssize_t result = -1; void *srcPtr = NULL, *dstPtr = NULL; jbyteArray srcArray = NULL, dstArray = NULL; status_t err = getBufferAndSize( @@ -329,13 +370,15 @@ static jint android_media_MediaDescrambler_native_descramble( } Status status; - if (err == OK) { - status = descrambler->descramble( - key, numSubSamples, totalLength, subSamples, - srcPtr, srcOffset, dstPtr, dstOffset, &result); - } + uint32_t bytesWritten; + hidl_string detailedError; + + err = descrambler->descramble( + key, totalLength, subSamples, + srcPtr, srcOffset, dstPtr, dstOffset, + &status, &bytesWritten, &detailedError); - delete[] subSamples; + // Release byte array before throwing if (srcArray != NULL) { env->ReleaseByteArrayElements(srcArray, (jbyte *)srcPtr, 0); } @@ -343,51 +386,17 @@ static jint android_media_MediaDescrambler_native_descramble( env->ReleaseByteArrayElements(dstArray, (jbyte *)dstPtr, 0); } - if (!status.isOk()) { - switch (status.exceptionCode()) { - case Status::EX_SECURITY: - jniThrowException(env, "java/lang/SecurityException", - status.exceptionMessage()); - break; - case Status::EX_BAD_PARCELABLE: - jniThrowException(env, "java/lang/BadParcelableException", - status.exceptionMessage()); - break; - case Status::EX_ILLEGAL_ARGUMENT: - jniThrowException(env, "java/lang/IllegalArgumentException", - status.exceptionMessage()); - break; - case Status::EX_NULL_POINTER: - jniThrowException(env, "java/lang/NullPointerException", - status.exceptionMessage()); - break; - case Status::EX_ILLEGAL_STATE: - jniThrowException(env, "java/lang/IllegalStateException", - status.exceptionMessage()); - break; - case Status::EX_NETWORK_MAIN_THREAD: - jniThrowException(env, "java/lang/NetworkOnMainThreadException", - status.exceptionMessage()); - break; - case Status::EX_UNSUPPORTED_OPERATION: - jniThrowException(env, "java/lang/UnsupportedOperationException", - status.exceptionMessage()); - break; - case Status::EX_SERVICE_SPECIFIC: - throwServiceSpecificException(env, status.serviceSpecificErrorCode(), - status.exceptionMessage()); - break; - default: - { - String8 msg; - msg.appendFormat("Unknown exception code: %d, msg: %s", - status.exceptionCode(), status.exceptionMessage().string()); - jniThrowException(env, "java/lang/RuntimeException", msg.string()); - break; - } - } + if (err == NO_MEMORY) { + jniThrowException(env, "java/lang/OutOfMemoryError", NULL); + } else if (err == FAILED_TRANSACTION) { + jniThrowException(env, "android/os/RemoteException", NULL); + } else if (status != Status::OK) { + // Throw ServiceSpecific with cas error code and detailed msg, + // which will be re-thrown as MediaCasStateException. + env->Throw(createServiceSpecificException( + env, (int) status, detailedError.c_str())); } - return result; + return bytesWritten; } static const JNINativeMethod gMethods[] = { @@ -395,7 +404,7 @@ static const JNINativeMethod gMethods[] = { (void *)android_media_MediaDescrambler_native_release }, { "native_init", "()V", (void *)android_media_MediaDescrambler_native_init }, - { "native_setup", "(Landroid/os/IBinder;)V", + { "native_setup", "(Landroid/os/IHwBinder;)V", (void *)android_media_MediaDescrambler_native_setup }, { "native_descramble", "(BI[I[ILjava/nio/ByteBuffer;IILjava/nio/ByteBuffer;II)I", (void *)android_media_MediaDescrambler_native_descramble }, diff --git a/media/jni/android_media_MediaDescrambler.h b/media/jni/android_media_MediaDescrambler.h index aeef05e7968d..015fad22e13b 100644 --- a/media/jni/android_media_MediaDescrambler.h +++ b/media/jni/android_media_MediaDescrambler.h @@ -19,34 +19,37 @@ #include "jni.h" -#include <binder/Status.h> -#include <media/cas/DescramblerAPI.h> +#include <android/hardware/cas/native/1.0/IDescrambler.h> + #include <media/stagefright/foundation/ABase.h> #include <utils/Mutex.h> -#include <utils/RefBase.h> namespace android { class IMemory; class MemoryDealer; -namespace media { -class IDescrambler; -}; -using namespace media; -using binder::Status; + +using hardware::hidl_memory; +using hardware::hidl_string; +using hardware::hidl_vec; +using namespace hardware::cas::V1_0; +using namespace hardware::cas::native::V1_0; struct JDescrambler : public RefBase { JDescrambler(JNIEnv *env, jobject descramberBinderObj); - Status descramble( + status_t descramble( jbyte key, - size_t numSubSamples, ssize_t totalLength, - DescramblerPlugin::SubSample *subSamples, + const hidl_vec<SubSample>& subSamples, const void *srcPtr, jint srcOffset, void *dstPtr, jint dstOffset, - ssize_t *result); + Status *status, + uint32_t *bytesWritten, + hidl_string *detailedError); + + static sp<IDescrambler> GetDescrambler(JNIEnv *env, jobject obj); protected: virtual ~JDescrambler(); @@ -55,9 +58,11 @@ private: sp<IDescrambler> mDescrambler; sp<IMemory> mMem; sp<MemoryDealer> mDealer; + SharedBuffer mDescramblerSrcBuffer; + Mutex mSharedMemLock; - void ensureBufferCapacity(size_t neededSize); + bool ensureBufferCapacity(size_t neededSize); DISALLOW_EVIL_CONSTRUCTORS(JDescrambler); }; diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp index 9e5d3d12f0bd..c9657b119bdb 100644 --- a/media/jni/android_media_MediaExtractor.cpp +++ b/media/jni/android_media_MediaExtractor.cpp @@ -18,16 +18,20 @@ #define LOG_TAG "MediaExtractor-JNI" #include <utils/Log.h> +#include "android_media_MediaDataSource.h" #include "android_media_MediaExtractor.h" #include "android_media_MediaMetricsJNI.h" - #include "android_media_Utils.h" +#include "android_os_HwRemoteBinder.h" #include "android_runtime/AndroidRuntime.h" #include "android_runtime/Log.h" +#include "android_util_Binder.h" #include "jni.h" #include "JNIHelp.h" -#include "android_media_MediaDataSource.h" +#include <android/hardware/cas/1.0/BpHwCas.h> +#include <android/hardware/cas/1.0/BnHwCas.h> +#include <hidl/HybridInterface.h> #include <media/IMediaHTTPService.h> #include <media/hardware/CryptoAPI.h> #include <media/stagefright/foundation/ABuffer.h> @@ -37,14 +41,12 @@ #include <media/stagefright/MediaErrors.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/NuMediaExtractor.h> -#include <android/media/ICas.h> - #include <nativehelper/ScopedLocalRef.h> -#include "android_util_Binder.h" - namespace android { +using namespace hardware::cas::V1_0; + struct fields_t { jfieldID context; @@ -89,8 +91,28 @@ status_t JMediaExtractor::setDataSource(const sp<DataSource> &datasource) { return mImpl->setDataSource(datasource); } -status_t JMediaExtractor::setMediaCas(const sp<ICas> &cas) { - return mImpl->setMediaCas(cas); +status_t JMediaExtractor::setMediaCas(JNIEnv *env, jobject casBinderObj) { + if (casBinderObj == NULL) { + return BAD_VALUE; + } + + sp<hardware::IBinder> hwBinder = + JHwRemoteBinder::GetNativeContext(env, casBinderObj)->getBinder(); + if (hwBinder == NULL) { + return BAD_VALUE; + } + + sp<ICas> cas = hardware::fromBinder<ICas, BpHwCas, BnHwCas>(hwBinder); + if (cas == NULL) { + return BAD_VALUE; + } + + HalToken halToken; + if (!createHalToken(cas, &halToken)) { + return BAD_VALUE; + } + + return mImpl->setMediaCas(halToken); } size_t JMediaExtractor::countTracks() const { @@ -748,23 +770,13 @@ static void android_media_MediaExtractor_setMediaCas( return; } - if (casBinderObj == NULL) { - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return; - } - - sp<ICas> cas; - if (casBinderObj != NULL) { - sp<IBinder> binder = ibinderForJavaObject(env, casBinderObj); - cas = interface_cast<ICas>(binder); - } - status_t err = extractor->setMediaCas(cas); + status_t err = extractor->setMediaCas(env, casBinderObj); if (err != OK) { - cas.clear(); + extractor.clear(); jniThrowException( env, - "java/io/IllegalArgumentException", + "java/lang/IllegalArgumentException", "Failed to set MediaCas on extractor."); } } @@ -896,7 +908,7 @@ static const JNINativeMethod gMethods[] = { { "setDataSource", "(Landroid/media/MediaDataSource;)V", (void *)android_media_MediaExtractor_setDataSourceCallback }, - { "nativeSetMediaCas", "(Landroid/os/IBinder;)V", + { "nativeSetMediaCas", "(Landroid/os/IHwBinder;)V", (void *)android_media_MediaExtractor_setMediaCas }, { "getCachedDuration", "()J", diff --git a/media/jni/android_media_MediaExtractor.h b/media/jni/android_media_MediaExtractor.h index 3d8c50b809ac..94d36f25ae1c 100644 --- a/media/jni/android_media_MediaExtractor.h +++ b/media/jni/android_media_MediaExtractor.h @@ -28,10 +28,6 @@ #include "jni.h" namespace android { -namespace media { -class ICas; -}; -using namespace media; struct IMediaHTTPService; class MetaData; @@ -48,7 +44,7 @@ struct JMediaExtractor : public RefBase { status_t setDataSource(int fd, off64_t offset, off64_t size); status_t setDataSource(const sp<DataSource> &source); - status_t setMediaCas(const sp<ICas> &cas); + status_t setMediaCas(JNIEnv *env, jobject casBinderObj); size_t countTracks() const; status_t getTrackFormat(size_t index, jobject *format) const; diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java index 3b29a6cd7b6c..1e262314284d 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceDiscoveryService.java @@ -77,7 +77,7 @@ public class DeviceDiscoveryService extends Service { private BluetoothAdapter mBluetoothAdapter; private WifiManager mWifiManager; - private BluetoothLeScanner mBLEScanner; + @Nullable private BluetoothLeScanner mBLEScanner; private ScanSettings mDefaultScanSettings = new ScanSettings.Builder().build(); private List<DeviceFilter<?>> mFilters; @@ -185,7 +185,7 @@ public class DeviceDiscoveryService extends Service { mBluetoothAdapter.startDiscovery(); } - if (shouldScan(mBLEFilters)) { + if (shouldScan(mBLEFilters) && mBLEScanner != null) { mBLEScanCallback = new BLEScanCallback(); mBLEScanner.startScan(mBLEScanFilters, mDefaultScanSettings, mBLEScanCallback); } @@ -224,7 +224,7 @@ public class DeviceDiscoveryService extends Service { unregisterReceiver(mBluetoothBroadcastReceiver); mBluetoothBroadcastReceiver = null; } - mBLEScanner.stopScan(mBLEScanCallback); + if (mBLEScanner != null) mBLEScanner.stopScan(mBLEScanCallback); if (mWifiBroadcastReceiver != null) { unregisterReceiver(mWifiBroadcastReceiver); mWifiBroadcastReceiver = null; diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 0484645cbcb4..7f2d85ac6384 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -110,7 +110,7 @@ <string name="unknown" msgid="1592123443519355854">"Sconosciuta"</string> <string name="running_process_item_user_label" msgid="3129887865552025943">"Utente: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> <string name="launch_defaults_some" msgid="313159469856372621">"Alcune opzioni predefinite impostate"</string> - <string name="launch_defaults_none" msgid="4241129108140034876">"Nessuna app predefinita impostata"</string> + <string name="launch_defaults_none" msgid="4241129108140034876">"Nessuna impostazione predefinita"</string> <string name="tts_settings" msgid="8186971894801348327">"Impostazioni di sintesi vocale"</string> <string name="tts_settings_title" msgid="1237820681016639683">"Output sintesi vocale"</string> <string name="tts_default_rate_title" msgid="6030550998379310088">"Velocità voce"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java index 924a82f0b1f4..426dc7c20a96 100755 --- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java @@ -281,6 +281,7 @@ public class BatteryMeterDrawableBase extends Drawable { mIconTint = fillColor; mFramePaint.setColor(backgroundColor); mBoltPaint.setColor(fillColor); + mPlusPaint.setColor(fillColor); mChargeColor = fillColor; invalidateSelf(); } diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java index 167ffe61e42b..fa41c8349540 100644 --- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java +++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionParser.java @@ -91,12 +91,10 @@ public class SuggestionParser { // Shared prefs keys for storing dismissed state. // Index into current dismissed state. + public static final String SETUP_TIME = "_setup_time"; private static final String DISMISS_INDEX = "_dismiss_index"; - private static final String SETUP_TIME = "_setup_time"; private static final String IS_DISMISSED = "_is_dismissed"; - private static final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000; - // Default dismiss control for smart suggestions. private static final String DEFAULT_SMART_DISMISS_CONTROL = "0,10"; @@ -386,7 +384,7 @@ public class SuggestionParser { } private long getEndTime(long startTime, int daysDelay) { - long days = daysDelay * MILLIS_IN_DAY; + long days = daysDelay * DateUtils.DAY_IN_MILLIS; return startTime + days; } diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java index aa92fa40a91b..01df0ecfdb11 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/graph/BatteryMeterDrawableBaseTest.java @@ -13,6 +13,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import static com.google.common.truth.Truth.assertThat; +import static junit.framework.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyFloat; import static org.mockito.Matchers.anyString; @@ -101,4 +102,17 @@ public class BatteryMeterDrawableBaseTest { private boolean isRectZero(Rect r) { return r.left == 0 && r.top == 0 && r.right == 0 && r.bottom == 0; } + + @Test + public void testPlusPaint_isEqualToBoltPaint() { + // Before setting color + assertTrue(mBatteryDrawable.mPlusPaint.hasEqualAttributes(mBatteryDrawable.mBoltPaint)); + + final int fakeFillColor = 123; + final int fakeBackgrundColor = 456; + + // After + mBatteryDrawable.setColors(fakeFillColor, fakeBackgrundColor); + assertTrue(mBatteryDrawable.mPlusPaint.hasEqualAttributes(mBatteryDrawable.mBoltPaint)); + } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 1e171d3f8210..8abdc641d675 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -37,10 +37,12 @@ import android.provider.Settings; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; +import android.util.Slog; import java.util.Locale; public class SettingsHelper { + private static final String TAG = "SettingsHelper"; private static final String SILENT_RINGTONE = "_silent"; private Context mContext; private AudioManager mAudioManager; @@ -324,11 +326,17 @@ public class SettingsHelper { */ void setLocaleData(byte[] data, int size) { // Check if locale was set by the user: - Configuration conf = mContext.getResources().getConfiguration(); - // TODO: The following is not working as intended because the network is forcing a locale - // change after registering. Need to find some other way to detect if the user manually - // changed the locale - if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard + final ContentResolver cr = mContext.getContentResolver(); + final boolean userSetLocale = mContext.getResources().getConfiguration().userSetLocale; + final boolean provisioned = Settings.Global.getInt(cr, + Settings.Global.DEVICE_PROVISIONED, 0) != 0; + if (userSetLocale || provisioned) { + // Don't change if user set it in the SetupWizard, or if this is a post-setup + // deferred restore operation + Slog.i(TAG, "Not applying restored locale; " + + (userSetLocale ? "user already specified" : "device already provisioned")); + return; + } final String[] availableLocales = mContext.getAssets().getLocales(); // Replace "_" with "-" to deal with older backups. diff --git a/packages/Shell/src/com/android/shell/BugreportWarningActivity.java b/packages/Shell/src/com/android/shell/BugreportWarningActivity.java index bdf41714d26c..2191d939e591 100644 --- a/packages/Shell/src/com/android/shell/BugreportWarningActivity.java +++ b/packages/Shell/src/com/android/shell/BugreportWarningActivity.java @@ -64,7 +64,7 @@ public class BugreportWarningActivity extends AlertActivity final int state = getWarningState(this, STATE_UNKNOWN); final boolean checked; - if (Build.TYPE.equals("user")) { + if (Build.IS_USER) { checked = state == STATE_HIDE; // Only checks if specifically set to. } else { checked = state != STATE_SHOW; // Checks by default. diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index 8bfcc74f7b04..e69b0a81b97e 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -577,7 +577,7 @@ public class BugreportReceiverTest { mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm_dont_repeat)); final boolean firstTime = propertyState == null || propertyState == STATE_UNKNOWN; if (firstTime) { - if (Build.TYPE.equals("user")) { + if (Build.IS_USER) { assertFalse("Checkbox should NOT be checked by default on user builds", dontShowAgain.isChecked()); mUiBot.click(dontShowAgain, "dont-show-again"); diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java new file mode 100644 index 000000000000..925214e3ab3a --- /dev/null +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2017 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.systemui.plugins; + +import android.app.Activity; +import android.content.Context; +import android.content.res.Resources; +import android.os.Bundle; + +import com.android.systemui.plugins.annotations.ProvidesInterface; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * A PluginActivity is an activity that replaces another full activity (e.g. RecentsActivity) + * at runtime within the sysui process. + */ +@ProvidesInterface(version = PluginActivity.VERSION) +public abstract class PluginActivity extends Activity implements Plugin { + + public static final int VERSION = 1; + + public static final String ACTION_RECENTS = "com.android.systemui.action.PLUGIN_RECENTS"; + + private Context mSysuiContext; + private boolean mSettingActionBar; + + @Override + public final void onCreate(Context sysuiContext, Context pluginContext) { + mSysuiContext = sysuiContext; + super.attachBaseContext(pluginContext); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Theme theme = getClass().getDeclaredAnnotation(Theme.class); + if (theme != null && theme.value() != 0) { + setTheme(theme.value()); + } + mSettingActionBar = true; + getActionBar(); + mSettingActionBar = false; + } + + @Override + public Resources getResources() { + return mSettingActionBar ? mSysuiContext.getResources() : super.getResources(); + } + + @Override + protected void attachBaseContext(Context newBase) { + mSysuiContext = newBase; + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + + public Context getSysuiContext() { + return mSysuiContext; + } + + public Context getPluginContext() { + return getBaseContext(); + } + + /** + * Since PluginActivities are declared as services instead of activities (since they + * are plugins), they can't have a theme attached to them. Instead a PluginActivity + * can annotate itself with @Theme to specify the resource of the style it wants + * to be themed with. + */ + @Retention(RetentionPolicy.RUNTIME) + public @interface Theme { + int value(); + } +} diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java index 25ce3ddf8169..db2e3765d2d0 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java @@ -21,6 +21,11 @@ public class PluginDependency { public static final int VERSION = 1; static DependencyProvider sProvider; + /** + * Allows a plugin to get a hold of static dependencies if they have declared dependence + * on their interface. For one-shot plugins this will only work during onCreate and will + * not work afterwards. + */ public static <T> T get(Plugin p, Class<T> cls) { return sProvider.get(p, cls); } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java index d57124381c1f..a648345e9c04 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java @@ -31,9 +31,9 @@ import com.android.systemui.plugins.qs.QS.HeightListener; @DependsOn(target = HeightListener.class) public interface QS extends FragmentBase { - public static final String ACTION = "com.android.systemui.action.PLUGIN_QS"; + String ACTION = "com.android.systemui.action.PLUGIN_QS"; - public static final int VERSION = 6; + int VERSION = 6; String TAG = "QS"; @@ -66,8 +66,8 @@ public interface QS extends FragmentBase { } @ProvidesInterface(version = HeightListener.VERSION) - public interface HeightListener { - public static final int VERSION = 1; + interface HeightListener { + int VERSION = 1; void onQsHeightChanged(); } diff --git a/packages/SystemUI/res/drawable/car_qs_background_primary.xml b/packages/SystemUI/res/drawable/car_qs_background_primary.xml new file mode 100644 index 000000000000..0f77987bb7ce --- /dev/null +++ b/packages/SystemUI/res/drawable/car_qs_background_primary.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2017 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. +--> +<inset xmlns:android="http://schemas.android.com/apk/res/android"> + <shape> + <solid android:color="?android:attr/colorPrimaryDark"/> + </shape> +</inset> diff --git a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml index 604e91814491..beedcbbe8c52 100644 --- a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml +++ b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml @@ -1,5 +1,5 @@ <!-- -Copyright (C) 2014 The Android Open Source Project +Copyright (C) 2017 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. @@ -22,6 +22,6 @@ Copyright (C) 2014 The Android Open Source Project android:pathData="m18.250000,12.000000a6.250000,6.250000 0.000000,1.000000 1.000000,-12.500000 0.000000,6.250000 6.250000,0.000000 1.000000,1.000000 12.500000,0.000000z" android:fillColor="?android:attr/colorPrimary" /> <path - android:fillColor="?android:attr/colorControlNormal" - android:pathData="M20.000000,8.700000L20.000000,4.000000L15.300000,4.000000L12.000000,0.700000 8.700000,4.000000L4.000000,4.000000L4.000000,8.700000L0.700000,12.000000 4.000000,15.300000L4.000000,20.000000L8.700000,20.000000L12.000000,23.299999 15.300000,20.000000L20.000000,20.000000L20.000000,15.300000L23.299999,12.000000 20.000000,8.700000zM12.000000,18.000000C8.700000,18.000000 6.000000,15.300000 6.000000,12.000000 6.000000,8.700000 8.700000,6.000000 12.000000,6.000000c3.300000,0.000000 6.000000,2.700000 6.000000,6.000000 0.000000,3.300000 -2.700000,6.000000 -6.000000,6.000000zM12.000000,8.000000c-2.200000,0.000000 -4.000000,1.800000 -4.000000,4.000000 0.000000,2.200000 1.800000,4.000000 4.000000,4.000000 2.200000,0.000000 4.000000,-1.800000 4.000000,-4.000000 0.000000,-2.200000 -1.800000,-4.000000 -4.000000,-4.000000z"/> + android:pathData="M20,8.69L20,5c0,-0.55 -0.45,-1 -1,-1h-3.69l-2.6,-2.6a0.996,0.996 0,0 0,-1.41 0L8.69,4L5,4c-0.55,0 -1,0.45 -1,1v3.69l-2.6,2.6a0.996,0.996 0,0 0,0 1.41L4,15.3L4,19c0,0.55 0.45,1 1,1h3.69l2.6,2.6c0.39,0.39 1.02,0.39 1.41,0l2.6,-2.6L19,20c0.55,0 1,-0.45 1,-1v-3.69l2.6,-2.6a0.996,0.996 0,0 0,0 -1.41L20,8.69zM12,18.08c-3.36,0 -6.08,-2.73 -6.08,-6.08S8.64,5.92 12,5.92s6.08,2.73 6.08,6.08 -2.72,6.08 -6.08,6.08zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z" + android:fillColor="?android:attr/colorControlNormal" /> </vector> diff --git a/packages/SystemUI/res/layout/back.xml b/packages/SystemUI/res/layout/back.xml index 4e8726b3a634..43bec91ad053 100644 --- a/packages/SystemUI/res/layout/back.xml +++ b/packages/SystemUI/res/layout/back.xml @@ -22,8 +22,10 @@ android:layout_height="match_parent" android:layout_weight="0" systemui:keyCode="4" - android:scaleType="center" + android:scaleType="fitCenter" android:contentDescription="@string/accessibility_back" + android:paddingTop="15dp" + android:paddingBottom="15dp" android:paddingStart="@dimen/navigation_key_padding" android:paddingEnd="@dimen/navigation_key_padding" /> diff --git a/packages/SystemUI/res/layout/car_qs_footer.xml b/packages/SystemUI/res/layout/car_qs_footer.xml new file mode 100644 index 000000000000..2ef3b05f0565 --- /dev/null +++ b/packages/SystemUI/res/layout/car_qs_footer.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2017 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. +--> +<!-- extends RelativeLayout --> +<com.android.systemui.qs.car.CarQSFooter + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/qs_footer" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_footer_height" + android:baselineAligned="false" + android:clickable="false" + android:clipChildren="false" + android:clipToPadding="false" + android:paddingBottom="16dp" + android:paddingTop="16dp" + android:paddingEnd="32dp" + android:paddingStart="32dp" + android:gravity="center_vertical" + android:orientation="horizontal"> + + <com.android.systemui.statusbar.phone.MultiUserSwitch + android:id="@+id/multi_user_switch" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" + android:layout_width="48dp" + android:layout_height="48dp" + android:background="@drawable/ripple_drawable" + android:focusable="true"> + + <ImageView + android:id="@+id/multi_user_avatar" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="center" + android:scaleType="centerInside"/> + </com.android.systemui.statusbar.phone.MultiUserSwitch> + + <com.android.systemui.statusbar.phone.SettingsButton + android:id="@+id/settings_button" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:layout_width="48dp" + android:layout_height="48dp" + android:background="@drawable/ripple_drawable" + android:contentDescription="@string/accessibility_quick_settings_settings" + android:scaleType="centerCrop" + android:src="@drawable/ic_settings_16dp" + android:tint="?android:attr/colorForeground" + style="@android:style/Widget.Material.Button.Borderless" /> + +</com.android.systemui.qs.car.CarQSFooter> diff --git a/packages/SystemUI/res/layout/car_qs_panel.xml b/packages/SystemUI/res/layout/car_qs_panel.xml new file mode 100644 index 000000000000..d1f7ff83db93 --- /dev/null +++ b/packages/SystemUI/res/layout/car_qs_panel.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2017 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. +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/quick_settings_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@drawable/car_qs_background_primary" + android:orientation="vertical" + android:elevation="4dp"> + + <include layout="@layout/car_status_bar_header" /> + <include layout="@layout/car_qs_footer" /> +</LinearLayout> diff --git a/packages/SystemUI/res/layout/car_status_bar_header.xml b/packages/SystemUI/res/layout/car_status_bar_header.xml new file mode 100644 index 000000000000..158907e03541 --- /dev/null +++ b/packages/SystemUI/res/layout/car_status_bar_header.xml @@ -0,0 +1,44 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2017 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. +--> +<!-- Extends RelativeLayout --> +<com.android.systemui.qs.car.CarStatusBarHeader + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:systemui="http://schemas.android.com/apk/res-auto" + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="@dimen/car_qs_header_system_icons_area_height" + android:paddingStart="8dp" + android:paddingEnd="8dp" > + + <include + layout="@layout/system_icons" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_alignParentStart="true" + android:layout_centerVertical="true" /> + + <com.android.systemui.statusbar.policy.Clock + android:id="@+id/clock" + android:textAppearance="@style/TextAppearance.StatusBar.Clock" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_alignParentEnd="true" + android:layout_centerVertical="true" + android:singleLine="true" + android:paddingStart="@dimen/status_bar_clock_starting_padding" + android:paddingEnd="@dimen/status_bar_clock_end_padding" + systemui:showDark="false" /> +</com.android.systemui.qs.car.CarStatusBarHeader> diff --git a/packages/SystemUI/res/layout/home.xml b/packages/SystemUI/res/layout/home.xml index 95863272b9bf..53ef2ab247e7 100644 --- a/packages/SystemUI/res/layout/home.xml +++ b/packages/SystemUI/res/layout/home.xml @@ -21,8 +21,10 @@ android:layout_height="match_parent" android:layout_weight="0" systemui:keyCode="3" - android:scaleType="center" + android:scaleType="fitCenter" android:contentDescription="@string/accessibility_home" + android:paddingTop="13dp" + android:paddingBottom="13dp" android:paddingStart="@dimen/navigation_key_padding" android:paddingEnd="@dimen/navigation_key_padding" /> diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml index 2bf4d9cb535f..a621c7c0f836 100644 --- a/packages/SystemUI/res/layout/navigation_layout.xml +++ b/packages/SystemUI/res/layout/navigation_layout.xml @@ -18,7 +18,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_marginStart="@dimen/rounded_corner_content_padding" + android:layout_marginEnd="@dimen/rounded_corner_content_padding" + android:paddingStart="8dp" + android:paddingEnd="8dp"> <FrameLayout android:id="@+id/nav_buttons" diff --git a/packages/SystemUI/res/layout/navigation_layout_rot90.xml b/packages/SystemUI/res/layout/navigation_layout_rot90.xml index 7601efc92a78..bf48c7f337d7 100644 --- a/packages/SystemUI/res/layout/navigation_layout_rot90.xml +++ b/packages/SystemUI/res/layout/navigation_layout_rot90.xml @@ -18,7 +18,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:layout_marginTop="@dimen/rounded_corner_content_padding" + android:layout_marginBottom="@dimen/rounded_corner_content_padding" + android:paddingTop="8dp" + android:paddingBottom="8dp"> <FrameLayout android:id="@+id/nav_buttons" diff --git a/packages/SystemUI/res/layout/qs_footer.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml index db39905cf52a..43e88ba32736 100644 --- a/packages/SystemUI/res/layout/qs_footer.xml +++ b/packages/SystemUI/res/layout/qs_footer_impl.xml @@ -15,10 +15,10 @@ ** limitations under the License. --> -<!-- Extends RelativeLayout --> -<com.android.systemui.qs.QSFooter +<!-- Extends FrameLayout --> +<com.android.systemui.qs.QSFooterImpl xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/header" + android:id="@+id/qs_footer" android:layout_width="match_parent" android:layout_height="48dp" android:baselineAligned="false" @@ -114,4 +114,4 @@ android:padding="14dp" /> </LinearLayout> -</com.android.systemui.qs.QSFooter> +</com.android.systemui.qs.QSFooterImpl> diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml index 87101e4b3d14..5541f3de8e7c 100644 --- a/packages/SystemUI/res/layout/qs_panel.xml +++ b/packages/SystemUI/res/layout/qs_panel.xml @@ -32,8 +32,7 @@ <include layout="@layout/quick_status_bar_expanded_header" /> - <include android:id="@+id/qs_footer" - layout="@layout/qs_footer" /> + <include layout="@layout/qs_footer_impl" /> <include android:id="@+id/qs_detail" layout="@layout/qs_detail" /> diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index 2ff626aa89a9..e8b418cd902b 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -18,7 +18,6 @@ <!-- Extends RelativeLayout --> <com.android.systemui.qs.QuickStatusBarHeader xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:systemui="http://schemas.android.com/apk/res-auto" android:id="@+id/header" android:layout_width="match_parent" android:layout_height="@dimen/status_bar_header_height" @@ -31,46 +30,7 @@ android:paddingEnd="0dp" android:paddingStart="0dp"> - <LinearLayout - android:layout_width="match_parent" - android:layout_height="32dp" - android:layout_alignParentEnd="true" - android:clipChildren="false" - android:clipToPadding="false" - android:gravity="center" - android:paddingStart="16dp" - android:paddingEnd="16dp" - android:orientation="horizontal"> - - - <com.android.keyguard.CarrierText - android:id="@+id/qs_carrier_text" - android:layout_width="0dp" - android:layout_height="match_parent" - android:layout_weight="1" - android:gravity="center_vertical|start" - android:ellipsize="marquee" - android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="?android:attr/textColorPrimary" - android:singleLine="true" /> - - <com.android.systemui.BatteryMeterView android:id="@+id/battery" - android:layout_height="match_parent" - android:layout_width="wrap_content" - /> - - <com.android.systemui.statusbar.policy.Clock - android:id="@+id/clock" - android:textAppearance="@style/TextAppearance.StatusBar.Clock" - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:singleLine="true" - android:paddingStart="@dimen/status_bar_clock_starting_padding" - android:paddingEnd="@dimen/status_bar_clock_end_padding" - android:gravity="center_vertical|start" - systemui:showDark="false" - /> - </LinearLayout> + <include layout="@layout/quick_status_bar_header_system_icons" /> <com.android.systemui.qs.QuickQSPanel android:id="@+id/quick_qs_panel" diff --git a/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml new file mode 100644 index 000000000000..c6dbd18a7d12 --- /dev/null +++ b/packages/SystemUI/res/layout/quick_status_bar_header_system_icons.xml @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** Copyright 2017, 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. +--> +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:systemui="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_header_system_icons_area_height" + android:layout_alignParentEnd="true" + android:clipChildren="false" + android:clipToPadding="false" + android:gravity="center" + android:paddingStart="16dp" + android:paddingEnd="16dp" + android:orientation="horizontal"> + + + <com.android.keyguard.CarrierText + android:id="@+id/qs_carrier_text" + android:layout_width="0dp" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="center_vertical|start" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearanceSmall" + android:textColor="?android:attr/textColorPrimary" + android:singleLine="true" /> + + <com.android.systemui.BatteryMeterView android:id="@+id/battery" + android:layout_height="match_parent" + android:layout_width="wrap_content" + /> + + <com.android.systemui.statusbar.policy.Clock + android:id="@+id/clock" + android:textAppearance="@style/TextAppearance.StatusBar.Clock" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:singleLine="true" + android:paddingStart="@dimen/status_bar_clock_starting_padding" + android:paddingEnd="@dimen/status_bar_clock_end_padding" + android:gravity="center_vertical|start" + systemui:showDark="false" + /> +</LinearLayout> diff --git a/packages/SystemUI/res/layout/recent_apps.xml b/packages/SystemUI/res/layout/recent_apps.xml index 870bcf7547a7..c84d28051286 100644 --- a/packages/SystemUI/res/layout/recent_apps.xml +++ b/packages/SystemUI/res/layout/recent_apps.xml @@ -21,8 +21,10 @@ android:layout_width="@dimen/navigation_key_width" android:layout_height="match_parent" android:layout_weight="0" - android:scaleType="center" + android:scaleType="fitCenter" android:contentDescription="@string/accessibility_recent" + android:paddingTop="15dp" + android:paddingBottom="15dp" android:paddingStart="@dimen/navigation_key_padding" android:paddingEnd="@dimen/navigation_key_padding" /> diff --git a/packages/SystemUI/res/values-car/dimens.xml b/packages/SystemUI/res/values-car/dimens.xml new file mode 100644 index 000000000000..b2e7bd1b881e --- /dev/null +++ b/packages/SystemUI/res/values-car/dimens.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + * Copyright (c) 2017, 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. +*/ +--> +<resources> + <!-- The height of the quick settings footer that holds the user switcher, settings icon, + etc. in the car setting.--> + <dimen name="qs_footer_height">74dp</dimen> +</resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 1e835f83016c..8db9281be413 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -356,10 +356,10 @@ <string name="description_target_search" msgid="3091587249776033139">"Suche"</string> <string name="description_direction_up" msgid="7169032478259485180">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach oben schieben"</string> <string name="description_direction_left" msgid="7207478719805562165">"Zum <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> nach links schieben"</string> - <string name="zen_priority_introduction" msgid="1149025108714420281">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe, Erinnerungen, Termine sowie Anrufe von zuvor von dir festgelegten Personen. Du hörst jedoch weiterhin Sound, wenn du Musik und Videos wiedergibst oder Spiele spielst."</string> - <string name="zen_alarms_introduction" msgid="4934328096749380201">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe. Du hörst jedoch weiterhin Sound, wenn du Musik und Videos wiedergibst oder Spiele spielst."</string> + <string name="zen_priority_introduction" msgid="1149025108714420281">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe, Erinnerungen, Termine sowie Anrufe von zuvor von dir festgelegten Personen. Du hörst jedoch weiterhin Sound, wenn du dir Musik anhörst, Videos ansiehst oder Spiele spielst."</string> + <string name="zen_alarms_introduction" msgid="4934328096749380201">"Klingeltöne und die Vibration werden deaktiviert, außer für Weckrufe. Du hörst jedoch weiterhin Sound, wenn du dir Musik anhörst, Videos ansiehst oder Spiele spielst."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Anpassen"</string> - <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Hierdurch werden ALLE Klingeltöne und die Vibration deaktiviert, auch für Weckrufe, Musik, Videos und Spiele. Anrufe kannst du jedoch weiterhin tätigen."</string> + <string name="zen_silence_introduction_voice" msgid="3948778066295728085">"Hierdurch werden ALLE Klingeltöne und die Vibration deaktiviert, auch für Weckrufe, Musik, Videos und Spiele. Du kannst aber weiterhin selbst anrufen."</string> <string name="zen_silence_introduction" msgid="3137882381093271568">"Hierdurch werden alle Klingeltöne und Vibrationsalarme stummgeschaltet, auch für Weckrufe, Musik, Videos und Spiele."</string> <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> <string name="speed_bump_explanation" msgid="1288875699658819755">"Weniger dringende Benachrichtigungen unten"</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 6a65489e8639..6419922c6ad5 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -459,11 +459,11 @@ <string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string> <string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Άνοιγμα αξιόπιστων διαπιστευτηρίων"</string> <string name="monitoring_description_network_logging" msgid="7223505523384076027">"Ο διαχειριστής σας έχει ενεργοποιήσει την καταγραφή δικτύου, η οποία παρακολουθεί την επισκεψιμότητα στη συσκευή σας.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας."</string> - <string name="monitoring_description_vpn" msgid="4445150119515393526">"Παραχωρήσατε σε μια εφαρμογή άδεια για τη ρύθμιση σύνδεσης VPN.\n\nΑυτή η εφαρμογή μπορεί να παρακολουθεί τη δραστηριότητα της συσκευής και του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων."</string> - <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nΟ διαχειριστής έχει τη δυνατότητα παρακολούθησης της δραστηριότητας του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή.\n\nΕπίσης, είστε συνδεδεμένοι σε VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας."</string> + <string name="monitoring_description_vpn" msgid="4445150119515393526">"Παραχωρήσατε σε μια εφαρμογή άδεια για τη ρύθμιση σύνδεσης VPN.\n\nΑυτή η εφαρμογή μπορεί να παρακολουθεί τη δραστηριότητα της συσκευής και του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string> + <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nΟ διαχειριστής έχει τη δυνατότητα παρακολούθησης της δραστηριότητας του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή.\n\nΕπίσης, είστε συνδεδεμένοι σε VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας."</string> <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> <string name="monitoring_description_app" msgid="1828472472674709532">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string> - <string name="monitoring_description_app_personal" msgid="484599052118316268">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων."</string> + <string name="monitoring_description_app_personal" msgid="484599052118316268">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string> <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων."</string> <string name="monitoring_description_app_work" msgid="4612997849787922906">"Ο οργανισμός <xliff:g id="ORGANIZATION">%1$s</xliff:g> διαχειρίζεται το προφίλ εργασίας σας. Το προφίλ είναι συνδεδεμένο στην εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g>, η οποία μπορεί να παρακολουθήσει τη δραστηριότητα του δικτύου εργασίας σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με τον διαχειριστή σας."</string> <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"Ο οργανισμός <xliff:g id="ORGANIZATION">%1$s</xliff:g> διαχειρίζεται το προφίλ εργασίας σας. Το προφίλ συνδέεται με την εφαρμογή <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου της εργασίας σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστοτόπων.\n\nΕπίσης, είστε συνδεδεμένοι στην εφαρμογή <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, που έχει τη δυνατότητα παρακολούθησης της δραστηριότητας του προσωπικού σας δικτύου."</string> diff --git a/packages/SystemUI/res/values-sw372dp/config.xml b/packages/SystemUI/res/values-sw372dp/config.xml new file mode 100644 index 000000000000..07b797a32428 --- /dev/null +++ b/packages/SystemUI/res/values-sw372dp/config.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2017, 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. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources> + <!-- Nav bar button default ordering/layout --> + <string name="config_navBarLayout" translatable="false">left[.25W],back[.5WC];home;recent[.5WC],right[.25W]</string> +</resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 74b0702ce5f6..c0068d3b2957 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -293,7 +293,7 @@ <string name="config_systemUIFactoryComponent" translatable="false">com.android.systemui.SystemUIFactory</string> <!-- Nav bar button default ordering/layout --> - <string name="config_navBarLayout" translatable="false">left,back;home;recent,right</string> + <string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string> <bool name="quick_settings_show_full_alarm">false</bool> @@ -316,26 +316,6 @@ <!-- Whether or not a background should be drawn behind a notification. --> <bool name="config_drawNotificationBackground">true</bool> - <!-- Whether or not the edit icon on the quick settings header is shown. --> - <bool name="config_showQuickSettingsEditingIcon">true</bool> - - <!-- Whether or not the multi-user switcher should be visible even if the quick settings are - not expanded. If there are not multiple users on the system, the switcher will still - hide itself. --> - <bool name="config_alwaysShowMultiUserSwitcher">false</bool> - - <!-- Whether or not the expand indicator is visible for manually expanding the quick settings - panel. --> - <bool name="config_showQuickSettingsExpandIndicator">true</bool> - - <!-- Whether or not to display the row of quick settings icons separate from the full quick - settings panel. --> - <bool name="config_showQuickSettingsRow">true</bool> - - <!-- Whether or not the quick settings should be revealed on an overscroll of the - notifications panel. --> - <bool name="config_enableQuickSettingsOverscrollExpansion">true</bool> - <!-- Whether or the notifications can be shown and dismissed with a drag. --> <bool name="config_enableNotificationShadeDrag">true</bool> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 93d2072e955c..c37069f4c6c1 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -189,6 +189,23 @@ <!-- Height of the status bar header bar --> <dimen name="status_bar_header_height">124dp</dimen> + <!-- Height of the status bar header bar in the car setting. --> + <dimen name="car_status_bar_header_height">128dp</dimen> + + <!-- The bottom padding of the status bar header. --> + <dimen name="status_bar_header_padding_bottom">48dp</dimen> + + <!-- The height of the container that holds the system icons in the quick settings header. --> + <dimen name="qs_header_system_icons_area_height">32dp</dimen> + + <!-- The height of the container that holds the system icons in the quick settings header in the + car setting. --> + <dimen name="car_qs_header_system_icons_area_height">54dp</dimen> + + <!-- The height of the quick settings footer that holds the user switcher, settings icon, + etc. --> + <dimen name="qs_footer_height">48dp</dimen> + <!-- Height of the status bar header bar when expanded --> <dimen name="status_bar_header_height_expanded">124dp</dimen> @@ -827,7 +844,4 @@ <!-- How far to inset the rounded edges --> <dimen name="stat_sys_mobile_signal_circle_inset">0.9dp</dimen> - <!-- Width of the hollow triangle for empty signal state --> - <dimen name="mobile_signal_empty_strokewidth">2dp</dimen> - </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java index d8bebabf0c5e..12f75bb2d56c 100644 --- a/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java +++ b/packages/SystemUI/src/com/android/keyguard/PasswordTextView.java @@ -29,10 +29,8 @@ import android.graphics.Rect; import android.graphics.Typeface; import android.os.PowerManager; import android.os.SystemClock; -import android.os.UserHandle; import android.provider.Settings; import android.text.InputType; -import android.text.TextUtils; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; @@ -252,9 +250,9 @@ public class PasswordTextView extends View { mText = mText.substring(0, length - 1); CharState charState = mTextChars.get(length - 1); charState.startRemoveAnimation(0, 0); + sendAccessibilityEventTypeViewTextChanged(textbefore, textbefore.length() - 1, 1, 0); } userActivity(); - sendAccessibilityEventTypeViewTextChanged(textbefore, textbefore.length() - 1, 1, 0); } public String getText() { diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index 1b694b372124..bb4412375ff8 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -31,6 +31,7 @@ import com.android.systemui.assist.AssistManager; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.fragments.FragmentService; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.PluginActivityManager; import com.android.systemui.plugins.PluginDependencyProvider; import com.android.systemui.plugins.PluginManager; import com.android.systemui.plugins.PluginManagerImpl; @@ -276,6 +277,9 @@ public class Dependency extends SystemUI { mProviders.put(UiOffloadThread.class, UiOffloadThread::new); + mProviders.put(PluginActivityManager.class, + () -> new PluginActivityManager(mContext, getDependency(PluginManager.class))); + // Put all dependencies above here so the factory can override them if it wants. SystemUIFactory.getInstance().injectDependencies(mProviders, mContext); } diff --git a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java index 14e15ec5716d..73e0d7ff33ac 100644 --- a/packages/SystemUI/src/com/android/systemui/RoundedCorners.java +++ b/packages/SystemUI/src/com/android/systemui/RoundedCorners.java @@ -98,10 +98,6 @@ public class RoundedCorners extends SystemUI implements Tunable { TunablePadding.addTunablePadding(statusBar.findViewById(R.id.keyguard_header), PADDING, padding, FLAG_END); - FragmentHostManager.get(sb.getNavigationBarWindow()).addTagListener( - NavigationBarFragment.TAG, - new TunablePaddingTagListener(padding, 0)); - FragmentHostManager fragmentHostManager = FragmentHostManager.get(statusBar); fragmentHostManager.addTagListener(CollapsedStatusBarFragment.TAG, new TunablePaddingTagListener(padding, R.id.status_bar)); diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index 9034c3fd926e..211f0c75b5dd 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -16,6 +16,7 @@ package com.android.systemui; +import android.app.Activity; import android.app.ActivityThread; import android.app.Application; import android.content.BroadcastReceiver; @@ -41,6 +42,7 @@ import com.android.systemui.pip.PipUI; import com.android.systemui.plugins.GlobalActions; import com.android.systemui.plugins.OverlayPlugin; import com.android.systemui.plugins.Plugin; +import com.android.systemui.plugins.PluginActivityManager; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.PluginManager; import com.android.systemui.power.PowerUI; @@ -281,4 +283,10 @@ public class SystemUIApplication extends Application implements SysUiServiceProv public SystemUI[] getServices() { return mServices; } + + @Override + public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) { + if (!mServicesStarted) return null; + return Dependency.get(PluginActivityManager.class).instantiate(cl, className, intent); + } } diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java index ae936db7b0e2..8d1d6e0ce460 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeTriggers.java @@ -39,6 +39,7 @@ import com.android.systemui.util.Assert; import com.android.systemui.util.wakelock.WakeLock; import java.io.PrintWriter; +import java.util.function.IntConsumer; /** * Handles triggers for ambient state changes. @@ -98,18 +99,44 @@ public class DozeTriggers implements DozeMachine.Part { requestPulse(DozeLog.PULSE_REASON_NOTIFICATION, false /* performedProxCheck */); } + private void proximityCheckThenCall(IntConsumer callback, + boolean alreadyPerformedProxCheck, + int pulseReason) { + if (alreadyPerformedProxCheck) { + callback.accept(ProximityCheck.RESULT_NOT_CHECKED); + } else { + final long start = SystemClock.uptimeMillis(); + new ProximityCheck() { + @Override + public void onProximityResult(int result) { + final long end = SystemClock.uptimeMillis(); + DozeLog.traceProximityResult(mContext, result == RESULT_NEAR, + end - start, pulseReason); + callback.accept(result); + } + }.check(); + } + } + private void onSensor(int pulseReason, boolean sensorPerformedProxCheck, float screenX, float screenY) { boolean isDoubleTap = pulseReason == DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP; boolean isPickup = pulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP; if (mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)) { - if (isDoubleTap) { - mDozeHost.onDoubleTap(screenX, screenY); - mMachine.wakeUp(); - } else { - mDozeHost.extendPulse(); - } + proximityCheckThenCall((result) -> { + if (result == ProximityCheck.RESULT_NEAR) { + // In pocket, drop event. + return; + } + if (isDoubleTap) { + mDozeHost.onDoubleTap(screenX, screenY); + mMachine.wakeUp(); + } else { + mDozeHost.extendPulse(); + } + }, sensorPerformedProxCheck, pulseReason); + return; } else { requestPulse(pulseReason, sensorPerformedProxCheck); } @@ -158,13 +185,16 @@ public class DozeTriggers implements DozeMachine.Part { break; case DOZE: case DOZE_AOD: - case DOZE_AOD_PAUSED: mDozeSensors.setProxListening(newState != DozeMachine.State.DOZE); mDozeSensors.setListening(true); if (oldState != DozeMachine.State.INITIALIZED) { mDozeSensors.reregisterAllSensors(); } break; + case DOZE_AOD_PAUSED: + mDozeSensors.setProxListening(true); + mDozeSensors.setListening(false); + break; case DOZE_PULSING: mDozeSensors.setProxListening(true); break; @@ -199,33 +229,15 @@ public class DozeTriggers implements DozeMachine.Part { } mPulsePending = true; - if (!mDozeParameters.getProxCheckBeforePulse() || performedProxCheck) { - // skip proximity check - continuePulseRequest(reason); - return; - } - - final long start = SystemClock.uptimeMillis(); - new ProximityCheck() { - @Override - public void onProximityResult(int result) { - final long end = SystemClock.uptimeMillis(); - DozeLog.traceProximityResult(mContext, result == RESULT_NEAR, - end - start, reason); - if (performedProxCheck) { - // we already continued - return; - } - // avoid pulsing in pockets - if (result == RESULT_NEAR) { - mPulsePending = false; - return; - } - - // not in-pocket, continue pulsing + proximityCheckThenCall((result) -> { + if (result == ProximityCheck.RESULT_NEAR) { + // in pocket, abort pulse + mPulsePending = false; + } else { + // not in pocket, continue pulsing continuePulseRequest(reason); } - }.check(); + }, !mDozeParameters.getProxCheckBeforePulse() || performedProxCheck, reason); } private boolean canPulse() { @@ -259,6 +271,7 @@ public class DozeTriggers implements DozeMachine.Part { protected static final int RESULT_UNKNOWN = 0; protected static final int RESULT_NEAR = 1; protected static final int RESULT_FAR = 2; + protected static final int RESULT_NOT_CHECKED = 3; private boolean mRegistered; private boolean mFinished; diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java index 80a641870f5b..1a8a474a4187 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java @@ -339,6 +339,7 @@ class GlobalActionsDialog implements DialogInterface.OnDismissListener, DialogIn long id) { final Action action = mAdapter.getItem(position); if (action instanceof LongPressAction) { + mDialog.dismiss(); return ((LongPressAction) action).onLongPress(); } return false; diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java index b8771d7e0fb6..cebb22f07aaf 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java @@ -241,14 +241,14 @@ public class PipMotionHelper implements Handler.Callback { /** * Flings the minimized PiP to the closest minimized snap target. */ - Rect flingToMinimizedState(float velocityY, Rect movementBounds) { + Rect flingToMinimizedState(float velocityY, Rect movementBounds, Point dragStartPosition) { cancelAnimations(); // We currently only allow flinging the minimized stack up and down, so just lock the // movement bounds to the current stack bounds horizontally movementBounds = new Rect(mBounds.left, movementBounds.top, mBounds.left, movementBounds.bottom); Rect toBounds = mSnapAlgorithm.findClosestSnapBounds(movementBounds, mBounds, - 0 /* velocityX */, velocityY); + 0 /* velocityX */, velocityY, dragStartPosition); if (!mBounds.equals(toBounds)) { mBoundsAnimator = createAnimationToBounds(mBounds, toBounds, 0, FAST_OUT_SLOW_IN); mFlingAnimationUtils.apply(mBoundsAnimator, 0, @@ -281,10 +281,11 @@ public class PipMotionHelper implements Handler.Callback { * Flings the PiP to the closest snap target. */ Rect flingToSnapTarget(float velocity, float velocityX, float velocityY, Rect movementBounds, - AnimatorUpdateListener updateListener, AnimatorListener listener) { + AnimatorUpdateListener updateListener, AnimatorListener listener, + Point startPosition) { cancelAnimations(); Rect toBounds = mSnapAlgorithm.findClosestSnapBounds(movementBounds, mBounds, - velocityX, velocityY); + velocityX, velocityY, startPosition); if (!mBounds.equals(toBounds)) { mBoundsAnimator = createAnimationToBounds(mBounds, toBounds, 0, FAST_OUT_SLOW_IN); mFlingAnimationUtils.apply(mBoundsAnimator, 0, diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java index 3682ae655f7c..9588b03b53bd 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java @@ -185,7 +185,7 @@ public class PipTouchHandler { mDismissViewController = new PipDismissViewController(context); mSnapAlgorithm = new PipSnapAlgorithm(mContext); mTouchState = new PipTouchState(mViewConfig); - mFlingAnimationUtils = new FlingAnimationUtils(context, 2f); + mFlingAnimationUtils = new FlingAnimationUtils(context, 2.5f); mGestures = new PipTouchGesture[] { mDefaultMovementGesture }; @@ -534,6 +534,7 @@ public class PipTouchHandler { private PipTouchGesture mDefaultMovementGesture = new PipTouchGesture() { // Whether the PiP was on the left side of the screen at the start of the gesture private boolean mStartedOnLeft; + private Point mStartPosition; @Override public void onDown(PipTouchState touchState) { @@ -541,7 +542,9 @@ public class PipTouchHandler { return; } - mStartedOnLeft = mMotionHelper.getBounds().left < mMovementBounds.centerX(); + Rect bounds = mMotionHelper.getBounds(); + mStartPosition = new Point(bounds.left, bounds.top); + mStartedOnLeft = bounds.left < mMovementBounds.centerX(); mMovementWithinMinimize = true; mMovementWithinDismiss = touchState.getDownTouchPosition().y >= mMovementBounds.bottom; @@ -687,7 +690,8 @@ public class PipTouchHandler { if (isFling) { mMotionHelper.flingToSnapTarget(velocity, vel.x, vel.y, mMovementBounds, - mUpdateScrimListener, postAnimationCallback); + mUpdateScrimListener, postAnimationCallback, + mStartPosition); } else { mMotionHelper.animateToClosestSnapTarget(mMovementBounds, mUpdateScrimListener, postAnimationCallback); diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java new file mode 100644 index 000000000000..9becc38d760e --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2017 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.systemui.plugins; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; +import android.util.ArrayMap; + +public class PluginActivityManager { + + private final Context mContext; + private final PluginManager mPluginManager; + private final ArrayMap<String, String> mActionLookup = new ArrayMap<>(); + + public PluginActivityManager(Context context, PluginManager pluginManager) { + mContext = context; + mPluginManager = pluginManager; + } + + public void addActivityPlugin(String className, String action) { + mActionLookup.put(className, action); + } + + public Activity instantiate(ClassLoader cl, String className, Intent intent) { + String action = mActionLookup.get(className); + if (TextUtils.isEmpty(action)) return null; + return mPluginManager.getOneShotPlugin(action, PluginActivity.class); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java index 493d244f5e99..a96839943cad 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java @@ -42,7 +42,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.Dependency; import com.android.systemui.plugins.PluginInstanceManager.PluginContextWrapper; -import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; import com.android.systemui.plugins.annotations.ProvidesInterface; import dalvik.system.PathClassLoader; @@ -120,14 +119,21 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage } PluginInstanceManager<T> p = mFactory.createPluginInstanceManager(mContext, action, null, false, mLooper, cls, this); + PluginListener<Plugin> listener = new PluginListener<Plugin>() { + @Override + public void onPluginConnected(Plugin plugin, Context pluginContext) { } + }; + mPluginMap.put(listener, p); mPluginPrefs.addAction(action); - PluginInfo<T> info = p.getPlugin(); + PluginInstanceManager.PluginInfo<T> info = p.getPlugin(); if (info != null) { mOneShotPackages.add(info.mPackage); mHasOneShot = true; startListening(); + mPluginMap.remove(listener); return info.mPlugin; } + mPluginMap.remove(listener); return null; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java index ed57c043a109..33b5268e03e1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java @@ -38,7 +38,7 @@ public class QSContainerImpl extends FrameLayout { protected View mHeader; protected float mQsExpansion; private QSCustomizer mQSCustomizer; - private QSFooter mQSFooter; + private View mQSFooter; private float mFullElevation; public QSContainerImpl(Context context, AttributeSet attrs) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java index 488fc03032fd..3f3cea2eaa17 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015 The Android Open Source Project + * Copyright (C) 2017 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. @@ -13,426 +13,60 @@ * See the License for the specific language governing permissions and * limitations under the License */ - package com.android.systemui.qs; -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_DATE; - -import android.app.ActivityManager; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.content.res.Resources; -import android.graphics.PorterDuff.Mode; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.RippleDrawable; -import android.os.UserManager; -import android.provider.AlarmClock; import android.support.annotation.Nullable; -import android.support.annotation.VisibleForTesting; -import android.util.AttributeSet; import android.view.View; -import android.view.View.OnClickListener; -import android.widget.FrameLayout; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; -import android.widget.Toast; - -import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto; -import com.android.keyguard.KeyguardStatusView; -import com.android.settingslib.Utils; -import com.android.systemui.Dependency; -import com.android.systemui.FontSizeUtils; -import com.android.systemui.R; -import com.android.systemui.R.dimen; -import com.android.systemui.R.id; -import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.qs.TouchAnimator.Builder; -import com.android.systemui.qs.TouchAnimator.Listener; -import com.android.systemui.qs.TouchAnimator.ListenerAdapter; -import com.android.systemui.statusbar.phone.ExpandableIndicator; -import com.android.systemui.statusbar.phone.MultiUserSwitch; -import com.android.systemui.statusbar.phone.SettingsButton; -import com.android.systemui.statusbar.policy.DeviceProvisionedController; -import com.android.systemui.statusbar.policy.NetworkController; -import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; -import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; -import com.android.systemui.statusbar.policy.NextAlarmController; -import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback; -import com.android.systemui.statusbar.policy.UserInfoController; -import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; -import com.android.systemui.tuner.TunerService; - -public class QSFooter extends FrameLayout implements - NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener, EmergencyListener, - SignalCallback { - private static final float EXPAND_INDICATOR_THRESHOLD = .93f; - - private ActivityStarter mActivityStarter; - private NextAlarmController mNextAlarmController; - private UserInfoController mUserInfoController; - private SettingsButton mSettingsButton; - protected View mSettingsContainer; - - private TextView mAlarmStatus; - private View mAlarmStatusCollapsed; - private View mDate; - - private QSPanel mQsPanel; - - private boolean mExpanded; - private boolean mAlarmShowing; - - protected ExpandableIndicator mExpandIndicator; - - private boolean mListening; - private AlarmManager.AlarmClockInfo mNextAlarm; - - private boolean mShowEmergencyCallsOnly; - protected MultiUserSwitch mMultiUserSwitch; - private ImageView mMultiUserAvatar; - private boolean mAlwaysShowMultiUserSwitch; - - protected TouchAnimator mSettingsAlpha; - private float mExpansionAmount; - - protected View mEdit; - private boolean mShowEditIcon; - private TouchAnimator mAnimator; - private View mDateTimeGroup; - private boolean mKeyguardShowing; - private TouchAnimator mAlarmAnimator; - - public QSFooter(Context context, AttributeSet attrs) { - super(context, attrs); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - Resources res = getResources(); - - mShowEditIcon = res.getBoolean(R.bool.config_showQuickSettingsEditingIcon); - - mEdit = findViewById(android.R.id.edit); - mEdit.setVisibility(mShowEditIcon ? VISIBLE : GONE); - - if (mShowEditIcon) { - findViewById(android.R.id.edit).setOnClickListener(view -> - Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() -> - mQsPanel.showEdit(view))); - } - - mDateTimeGroup = findViewById(id.date_time_alarm_group); - mDate = findViewById(R.id.date); - - mExpandIndicator = findViewById(R.id.expand_indicator); - mExpandIndicator.setVisibility( - res.getBoolean(R.bool.config_showQuickSettingsExpandIndicator) - ? VISIBLE : GONE); - - mSettingsButton = findViewById(R.id.settings_button); - mSettingsContainer = findViewById(R.id.settings_button_container); - mSettingsButton.setOnClickListener(this); - - mAlarmStatusCollapsed = findViewById(R.id.alarm_status_collapsed); - mAlarmStatus = findViewById(R.id.alarm_status); - mDateTimeGroup.setOnClickListener(this); - - mMultiUserSwitch = findViewById(R.id.multi_user_switch); - mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); - mAlwaysShowMultiUserSwitch = res.getBoolean(R.bool.config_alwaysShowMultiUserSwitcher); - - // RenderThread is doing more harm than good when touching the header (to expand quick - // settings), so disable it for this view - ((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true); - ((RippleDrawable) mExpandIndicator.getBackground()).setForceSoftware(true); - - updateResources(); - - mNextAlarmController = Dependency.get(NextAlarmController.class); - mUserInfoController = Dependency.get(UserInfoController.class); - mActivityStarter = Dependency.get(ActivityStarter.class); - addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, - oldBottom) -> updateAnimator(right - left)); - } - - private void updateAnimator(int width) { - int numTiles = QuickQSPanel.getNumQuickTiles(mContext); - int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size) - - mContext.getResources().getDimensionPixelSize(dimen.qs_quick_tile_padding); - int remaining = (width - numTiles * size) / (numTiles - 1); - int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space); - - mAnimator = new Builder() - .addFloat(mSettingsContainer, "translationX", -(remaining - defSpace), 0) - .addFloat(mSettingsButton, "rotation", -120, 0) - .build(); - if (mAlarmShowing) { - mAlarmAnimator = new Builder().addFloat(mDate, "alpha", 1, 0) - .addFloat(mDateTimeGroup, "translationX", 0, -mDate.getWidth()) - .addFloat(mAlarmStatus, "alpha", 0, 1) - .setListener(new ListenerAdapter() { - @Override - public void onAnimationAtStart() { - mAlarmStatus.setVisibility(View.GONE); - } - - @Override - public void onAnimationStarted() { - mAlarmStatus.setVisibility(View.VISIBLE); - } - }).build(); - } else { - mAlarmAnimator = null; - mAlarmStatus.setVisibility(View.GONE); - mDate.setAlpha(1); - mDateTimeGroup.setTranslationX(0); - } - setExpansion(mExpansionAmount); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - updateResources(); - } - - @Override - public void onRtlPropertiesChanged(int layoutDirection) { - super.onRtlPropertiesChanged(layoutDirection); - updateResources(); - } - - private void updateResources() { - FontSizeUtils.updateFontSize(mAlarmStatus, R.dimen.qs_date_collapsed_size); - - updateSettingsAnimator(); - } - - private void updateSettingsAnimator() { - mSettingsAlpha = createSettingsAlphaAnimator(); - - final boolean isRtl = isLayoutRtl(); - if (isRtl && mDate.getWidth() == 0) { - mDate.addOnLayoutChangeListener(new OnLayoutChangeListener() { - @Override - public void onLayoutChange(View v, int left, int top, int right, int bottom, - int oldLeft, int oldTop, int oldRight, int oldBottom) { - mDate.setPivotX(getWidth()); - mDate.removeOnLayoutChangeListener(this); - } - }); - } else { - mDate.setPivotX(isRtl ? mDate.getWidth() : 0); - } - } +/** + * The bottom footer of the quick settings panel. + */ +public interface QSFooter { + /** + * Sets the given {@link QSPanel} to be the one that will display the quick settings. + */ + void setQSPanel(@Nullable QSPanel panel); + + /** + * Sets whether or not the footer should be visible. + * + * @param visibility One of {@link View#VISIBLE}, {@link View#INVISIBLE} or {@link View#GONE}. + * @see View#setVisibility(int) + */ + void setVisibility(int visibility); + + /** + * Sets whether the footer is in an expanded state. + */ + void setExpanded(boolean expanded); + + /** + * Returns the full height of the footer. + */ + int getHeight(); + + /** + * Sets the percentage amount that the quick settings has been expanded. + * + * @param expansion A value from 1 to 0 that indicates how much the quick settings have been + * expanded. 1 is fully expanded. + */ + void setExpansion(float expansion); + + /** + * Sets whether or not this footer should set itself to listen for changes in any callbacks + * that it has implemented. + */ + void setListening(boolean listening); + + /** + * Sets whether or not the keyguard is currently being shown. + */ + void setKeyguardShowing(boolean keyguardShowing); + + /** + * Returns the {@link View} that should expand the quick settings when clicked. + */ @Nullable - private TouchAnimator createSettingsAlphaAnimator() { - // If the settings icon is not shown and the user switcher is always shown, then there - // is nothing to animate. - if (!mShowEditIcon && mAlwaysShowMultiUserSwitch) { - return null; - } - - TouchAnimator.Builder animatorBuilder = new TouchAnimator.Builder(); - animatorBuilder.setStartDelay(QSAnimator.EXPANDED_TILE_DELAY); - - if (mShowEditIcon) { - animatorBuilder.addFloat(mEdit, "alpha", 0, 1); - } - - if (!mAlwaysShowMultiUserSwitch) { - animatorBuilder.addFloat(mMultiUserSwitch, "alpha", 0, 1); - } - - return animatorBuilder.build(); - } - - public void setKeyguardShowing(boolean keyguardShowing) { - mKeyguardShowing = keyguardShowing; - setExpansion(mExpansionAmount); - } - - public void setExpanded(boolean expanded) { - if (mExpanded == expanded) return; - mExpanded = expanded; - updateEverything(); - } - - @Override - public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) { - mNextAlarm = nextAlarm; - if (nextAlarm != null) { - String alarmString = KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm); - mAlarmStatus.setText(alarmString); - mAlarmStatus.setContentDescription(mContext.getString( - R.string.accessibility_quick_settings_alarm, alarmString)); - mAlarmStatusCollapsed.setContentDescription(mContext.getString( - R.string.accessibility_quick_settings_alarm, alarmString)); - } - if (mAlarmShowing != (nextAlarm != null)) { - mAlarmShowing = nextAlarm != null; - updateAnimator(getWidth()); - updateEverything(); - } - } - - public void setExpansion(float headerExpansionFraction) { - mExpansionAmount = headerExpansionFraction; - if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction); - if (mAlarmAnimator != null) mAlarmAnimator.setPosition( - mKeyguardShowing ? 0 : headerExpansionFraction); - - if (mSettingsAlpha != null) { - mSettingsAlpha.setPosition(headerExpansionFraction); - } - - updateAlarmVisibilities(); - - mExpandIndicator.setExpanded(headerExpansionFraction > EXPAND_INDICATOR_THRESHOLD); - } - - @Override - @VisibleForTesting - public void onDetachedFromWindow() { - setListening(false); - super.onDetachedFromWindow(); - } - - private void updateAlarmVisibilities() { - mAlarmStatusCollapsed.setVisibility(mAlarmShowing ? View.VISIBLE : View.GONE); - } - - public void setListening(boolean listening) { - if (listening == mListening) { - return; - } - mListening = listening; - updateListeners(); - } - - public View getExpandView() { - return findViewById(R.id.expand_indicator); - } - - public void updateEverything() { - post(() -> { - updateVisibilities(); - setClickable(false); - }); - } - - private void updateVisibilities() { - updateAlarmVisibilities(); - mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility( - TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE); - final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); - - mMultiUserSwitch.setVisibility((mExpanded || mAlwaysShowMultiUserSwitch) - && mMultiUserSwitch.hasMultipleUsers() && !isDemo - ? View.VISIBLE : View.INVISIBLE); - - if (mShowEditIcon) { - mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); - } - } - - private void updateListeners() { - if (mListening) { - mNextAlarmController.addCallback(this); - mUserInfoController.addCallback(this); - if (Dependency.get(NetworkController.class).hasVoiceCallingFeature()) { - Dependency.get(NetworkController.class).addEmergencyListener(this); - Dependency.get(NetworkController.class).addCallback(this); - } - } else { - mNextAlarmController.removeCallback(this); - mUserInfoController.removeCallback(this); - Dependency.get(NetworkController.class).removeEmergencyListener(this); - Dependency.get(NetworkController.class).removeCallback(this); - } - } - - public void setQSPanel(final QSPanel qsPanel) { - mQsPanel = qsPanel; - if (mQsPanel != null) { - mMultiUserSwitch.setQsPanel(qsPanel); - } - } - - @Override - public void onClick(View v) { - if (v == mSettingsButton) { - if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) { - // If user isn't setup just unlock the device and dump them back at SUW. - mActivityStarter.postQSRunnableDismissingKeyguard(() -> { }); - return; - } - MetricsLogger.action(mContext, - mExpanded ? MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH - : MetricsProto.MetricsEvent.ACTION_QS_COLLAPSED_SETTINGS_LAUNCH); - if (mSettingsButton.isTunerClick()) { - Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() -> { - if (TunerService.isTunerEnabled(mContext)) { - TunerService.showResetRequest(mContext, () -> { - // Relaunch settings so that the tuner disappears. - startSettingsActivity(); - }); - } else { - Toast.makeText(getContext(), R.string.tuner_toast, - Toast.LENGTH_LONG).show(); - TunerService.setTunerEnabled(mContext, true); - } - startSettingsActivity(); - - }); - } else { - startSettingsActivity(); - } - } else if (v == mDateTimeGroup) { - Dependency.get(MetricsLogger.class).action(ACTION_QS_DATE, - mNextAlarm != null); - if (mNextAlarm != null) { - PendingIntent showIntent = mNextAlarm.getShowIntent(); - mActivityStarter.startPendingIntentDismissingKeyguard(showIntent); - } else { - mActivityStarter.postStartActivityDismissingKeyguard(new Intent( - AlarmClock.ACTION_SHOW_ALARMS), 0); - } - } - } - - private void startSettingsActivity() { - mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS), - true /* dismissShade */); - } - - @Override - public void setEmergencyCallsOnly(boolean show) { - boolean changed = show != mShowEmergencyCallsOnly; - if (changed) { - mShowEmergencyCallsOnly = show; - if (mExpanded) { - updateEverything(); - } - } - } - - @Override - public void onUserInfoChanged(String name, Drawable picture, String userAccount) { - if (picture != null && - UserManager.get(mContext).isGuestUser(ActivityManager.getCurrentUser())) { - picture = picture.getConstantState().newDrawable().mutate(); - picture.setColorFilter( - Utils.getColorAttr(mContext, android.R.attr.colorForeground), - Mode.SRC_IN); - } - mMultiUserAvatar.setImageDrawable(picture); - } + View getExpandView(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java new file mode 100644 index 000000000000..94da5f72be10 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java @@ -0,0 +1,414 @@ +/* + * Copyright (C) 2017 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.systemui.qs; + +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_QS_DATE; + +import android.app.ActivityManager; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.PorterDuff.Mode; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.RippleDrawable; +import android.os.UserManager; +import android.provider.AlarmClock; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.util.AttributeSet; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; +import android.widget.Toast; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto; +import com.android.keyguard.KeyguardStatusView; +import com.android.settingslib.Utils; +import com.android.systemui.Dependency; +import com.android.systemui.FontSizeUtils; +import com.android.systemui.R; +import com.android.systemui.R.dimen; +import com.android.systemui.R.id; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.qs.TouchAnimator.Builder; +import com.android.systemui.qs.TouchAnimator.Listener; +import com.android.systemui.qs.TouchAnimator.ListenerAdapter; +import com.android.systemui.statusbar.phone.ExpandableIndicator; +import com.android.systemui.statusbar.phone.MultiUserSwitch; +import com.android.systemui.statusbar.phone.SettingsButton; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.statusbar.policy.NetworkController; +import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; +import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NextAlarmController; +import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback; +import com.android.systemui.statusbar.policy.UserInfoController; +import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; +import com.android.systemui.tuner.TunerService; + +public class QSFooterImpl extends FrameLayout implements QSFooter, + NextAlarmChangeCallback, OnClickListener, OnUserInfoChangedListener, EmergencyListener, + SignalCallback { + private static final float EXPAND_INDICATOR_THRESHOLD = .93f; + + private ActivityStarter mActivityStarter; + private NextAlarmController mNextAlarmController; + private UserInfoController mUserInfoController; + private SettingsButton mSettingsButton; + protected View mSettingsContainer; + + private TextView mAlarmStatus; + private View mAlarmStatusCollapsed; + private View mDate; + + private QSPanel mQsPanel; + + private boolean mExpanded; + private boolean mAlarmShowing; + + protected ExpandableIndicator mExpandIndicator; + + private boolean mListening; + private AlarmManager.AlarmClockInfo mNextAlarm; + + private boolean mShowEmergencyCallsOnly; + protected MultiUserSwitch mMultiUserSwitch; + private ImageView mMultiUserAvatar; + + protected TouchAnimator mSettingsAlpha; + private float mExpansionAmount; + + protected View mEdit; + private TouchAnimator mAnimator; + private View mDateTimeGroup; + private boolean mKeyguardShowing; + private TouchAnimator mAlarmAnimator; + + public QSFooterImpl(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + Resources res = getResources(); + + mEdit = findViewById(android.R.id.edit); + mEdit.setOnClickListener(view -> + Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() -> + mQsPanel.showEdit(view))); + + mDateTimeGroup = findViewById(id.date_time_alarm_group); + mDate = findViewById(R.id.date); + + mExpandIndicator = findViewById(R.id.expand_indicator); + mSettingsButton = findViewById(R.id.settings_button); + mSettingsContainer = findViewById(R.id.settings_button_container); + mSettingsButton.setOnClickListener(this); + + mAlarmStatusCollapsed = findViewById(R.id.alarm_status_collapsed); + mAlarmStatus = findViewById(R.id.alarm_status); + mDateTimeGroup.setOnClickListener(this); + + mMultiUserSwitch = findViewById(R.id.multi_user_switch); + mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); + + // RenderThread is doing more harm than good when touching the header (to expand quick + // settings), so disable it for this view + ((RippleDrawable) mSettingsButton.getBackground()).setForceSoftware(true); + ((RippleDrawable) mExpandIndicator.getBackground()).setForceSoftware(true); + + updateResources(); + + mNextAlarmController = Dependency.get(NextAlarmController.class); + mUserInfoController = Dependency.get(UserInfoController.class); + mActivityStarter = Dependency.get(ActivityStarter.class); + addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, + oldBottom) -> updateAnimator(right - left)); + } + + private void updateAnimator(int width) { + int numTiles = QuickQSPanel.getNumQuickTiles(mContext); + int size = mContext.getResources().getDimensionPixelSize(R.dimen.qs_quick_tile_size) + - mContext.getResources().getDimensionPixelSize(dimen.qs_quick_tile_padding); + int remaining = (width - numTiles * size) / (numTiles - 1); + int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space); + + mAnimator = new Builder() + .addFloat(mSettingsContainer, "translationX", -(remaining - defSpace), 0) + .addFloat(mSettingsButton, "rotation", -120, 0) + .build(); + if (mAlarmShowing) { + mAlarmAnimator = new Builder().addFloat(mDate, "alpha", 1, 0) + .addFloat(mDateTimeGroup, "translationX", 0, -mDate.getWidth()) + .addFloat(mAlarmStatus, "alpha", 0, 1) + .setListener(new ListenerAdapter() { + @Override + public void onAnimationAtStart() { + mAlarmStatus.setVisibility(View.GONE); + } + + @Override + public void onAnimationStarted() { + mAlarmStatus.setVisibility(View.VISIBLE); + } + }).build(); + } else { + mAlarmAnimator = null; + mAlarmStatus.setVisibility(View.GONE); + mDate.setAlpha(1); + mDateTimeGroup.setTranslationX(0); + } + setExpansion(mExpansionAmount); + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + updateResources(); + } + + @Override + public void onRtlPropertiesChanged(int layoutDirection) { + super.onRtlPropertiesChanged(layoutDirection); + updateResources(); + } + + private void updateResources() { + FontSizeUtils.updateFontSize(mAlarmStatus, R.dimen.qs_date_collapsed_size); + + updateSettingsAnimator(); + } + + private void updateSettingsAnimator() { + mSettingsAlpha = createSettingsAlphaAnimator(); + + final boolean isRtl = isLayoutRtl(); + if (isRtl && mDate.getWidth() == 0) { + mDate.addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + mDate.setPivotX(getWidth()); + mDate.removeOnLayoutChangeListener(this); + } + }); + } else { + mDate.setPivotX(isRtl ? mDate.getWidth() : 0); + } + } + + @Nullable + private TouchAnimator createSettingsAlphaAnimator() { + return new TouchAnimator.Builder() + .addFloat(mEdit, "alpha", 0, 1) + .addFloat(mMultiUserSwitch, "alpha", 0, 1) + .build(); + } + + @Override + public void setKeyguardShowing(boolean keyguardShowing) { + mKeyguardShowing = keyguardShowing; + setExpansion(mExpansionAmount); + } + + @Override + public void setExpanded(boolean expanded) { + if (mExpanded == expanded) return; + mExpanded = expanded; + updateEverything(); + } + + @Override + public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) { + mNextAlarm = nextAlarm; + if (nextAlarm != null) { + String alarmString = KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm); + mAlarmStatus.setText(alarmString); + mAlarmStatus.setContentDescription(mContext.getString( + R.string.accessibility_quick_settings_alarm, alarmString)); + mAlarmStatusCollapsed.setContentDescription(mContext.getString( + R.string.accessibility_quick_settings_alarm, alarmString)); + } + if (mAlarmShowing != (nextAlarm != null)) { + mAlarmShowing = nextAlarm != null; + updateAnimator(getWidth()); + updateEverything(); + } + } + + @Override + public void setExpansion(float headerExpansionFraction) { + mExpansionAmount = headerExpansionFraction; + if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction); + if (mAlarmAnimator != null) mAlarmAnimator.setPosition( + mKeyguardShowing ? 0 : headerExpansionFraction); + + if (mSettingsAlpha != null) { + mSettingsAlpha.setPosition(headerExpansionFraction); + } + + updateAlarmVisibilities(); + + mExpandIndicator.setExpanded(headerExpansionFraction > EXPAND_INDICATOR_THRESHOLD); + } + + @Override + @VisibleForTesting + public void onDetachedFromWindow() { + setListening(false); + super.onDetachedFromWindow(); + } + + private void updateAlarmVisibilities() { + mAlarmStatusCollapsed.setVisibility(mAlarmShowing ? View.VISIBLE : View.GONE); + } + + @Override + public void setListening(boolean listening) { + if (listening == mListening) { + return; + } + mListening = listening; + updateListeners(); + } + + @Override + public View getExpandView() { + return findViewById(R.id.expand_indicator); + } + + public void updateEverything() { + post(() -> { + updateVisibilities(); + setClickable(false); + }); + } + + private void updateVisibilities() { + updateAlarmVisibilities(); + mSettingsContainer.findViewById(R.id.tuner_icon).setVisibility( + TunerService.isTunerEnabled(mContext) ? View.VISIBLE : View.INVISIBLE); + final boolean isDemo = UserManager.isDeviceInDemoMode(mContext); + + mMultiUserSwitch.setVisibility(mExpanded && mMultiUserSwitch.hasMultipleUsers() && !isDemo + ? View.VISIBLE : View.INVISIBLE); + + mEdit.setVisibility(isDemo || !mExpanded ? View.INVISIBLE : View.VISIBLE); + } + + private void updateListeners() { + if (mListening) { + mNextAlarmController.addCallback(this); + mUserInfoController.addCallback(this); + if (Dependency.get(NetworkController.class).hasVoiceCallingFeature()) { + Dependency.get(NetworkController.class).addEmergencyListener(this); + Dependency.get(NetworkController.class).addCallback(this); + } + } else { + mNextAlarmController.removeCallback(this); + mUserInfoController.removeCallback(this); + Dependency.get(NetworkController.class).removeEmergencyListener(this); + Dependency.get(NetworkController.class).removeCallback(this); + } + } + + @Override + public void setQSPanel(final QSPanel qsPanel) { + mQsPanel = qsPanel; + if (mQsPanel != null) { + mMultiUserSwitch.setQsPanel(qsPanel); + } + } + + @Override + public void onClick(View v) { + if (v == mSettingsButton) { + if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) { + // If user isn't setup just unlock the device and dump them back at SUW. + mActivityStarter.postQSRunnableDismissingKeyguard(() -> { }); + return; + } + MetricsLogger.action(mContext, + mExpanded ? MetricsProto.MetricsEvent.ACTION_QS_EXPANDED_SETTINGS_LAUNCH + : MetricsProto.MetricsEvent.ACTION_QS_COLLAPSED_SETTINGS_LAUNCH); + if (mSettingsButton.isTunerClick()) { + Dependency.get(ActivityStarter.class).postQSRunnableDismissingKeyguard(() -> { + if (TunerService.isTunerEnabled(mContext)) { + TunerService.showResetRequest(mContext, () -> { + // Relaunch settings so that the tuner disappears. + startSettingsActivity(); + }); + } else { + Toast.makeText(getContext(), R.string.tuner_toast, + Toast.LENGTH_LONG).show(); + TunerService.setTunerEnabled(mContext, true); + } + startSettingsActivity(); + + }); + } else { + startSettingsActivity(); + } + } else if (v == mDateTimeGroup) { + Dependency.get(MetricsLogger.class).action(ACTION_QS_DATE, + mNextAlarm != null); + if (mNextAlarm != null) { + PendingIntent showIntent = mNextAlarm.getShowIntent(); + mActivityStarter.startPendingIntentDismissingKeyguard(showIntent); + } else { + mActivityStarter.postStartActivityDismissingKeyguard(new Intent( + AlarmClock.ACTION_SHOW_ALARMS), 0); + } + } + } + + private void startSettingsActivity() { + mActivityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS), + true /* dismissShade */); + } + + @Override + public void setEmergencyCallsOnly(boolean show) { + boolean changed = show != mShowEmergencyCallsOnly; + if (changed) { + mShowEmergencyCallsOnly = show; + if (mExpanded) { + updateEverything(); + } + } + } + + @Override + public void onUserInfoChanged(String name, Drawable picture, String userAccount) { + if (picture != null && + UserManager.get(mContext).isGuestUser(ActivityManager.getCurrentUser())) { + picture = picture.getConstantState().newDrawable().mutate(); + picture.setColorFilter( + Utils.getColorAttr(mContext, android.R.attr.colorForeground), + Mode.SRC_IN); + } + mMultiUserAvatar.setImageDrawable(picture); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index bb3672511c48..f9ccb50dfb41 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -16,11 +16,11 @@ package com.android.systemui.qs; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; -import android.annotation.Nullable; import android.app.Fragment; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.util.Log; import android.view.ContextThemeWrapper; @@ -80,14 +80,9 @@ public class QSFragment extends Fragment implements QS { mFooter = view.findViewById(R.id.qs_footer); mContainer = view.findViewById(id.quick_settings_container); - mQSDetail.setQsPanel(mQSPanel, mHeader, mFooter); - - // If the quick settings row is not shown, then there is no need for the animation from - // the row to the full QS panel. - if (getResources().getBoolean(R.bool.config_showQuickSettingsRow)) { - mQSAnimator = new QSAnimator(this, - mHeader.findViewById(R.id.quick_qs_panel), mQSPanel); - } + mQSDetail.setQsPanel(mQSPanel, mHeader, (View) mFooter); + mQSAnimator = new QSAnimator(this, + mHeader.findViewById(R.id.quick_qs_panel), mQSPanel); mQSCustomizer = view.findViewById(R.id.qs_customize); mQSCustomizer.setQs(this); @@ -131,6 +126,7 @@ public class QSFragment extends Fragment implements QS { public void setHasNotifications(boolean hasNotifications) { } + @Override public void setPanelView(HeightListener panelView) { mPanelView = panelView; } @@ -154,6 +150,7 @@ public class QSFragment extends Fragment implements QS { } } + @Override public boolean isCustomizing() { return mQSCustomizer.isCustomizing(); } @@ -195,15 +192,22 @@ public class QSFragment extends Fragment implements QS { return mQSCustomizer; } + @Override public boolean isShowingDetail() { return mQSPanel.isShowingCustomize() || mQSDetail.isShowingDetail(); } + @Override public void setHeaderClickable(boolean clickable) { if (DEBUG) Log.d(TAG, "setHeaderClickable " + clickable); - mFooter.getExpandView().setClickable(clickable); + + View expandView = mFooter.getExpandView(); + if (expandView != null) { + expandView.setClickable(clickable); + } } + @Override public void setExpanded(boolean expanded) { if (DEBUG) Log.d(TAG, "setExpanded " + expanded); mQsExpanded = expanded; @@ -211,6 +215,7 @@ public class QSFragment extends Fragment implements QS { updateQsState(); } + @Override public void setKeyguardShowing(boolean keyguardShowing) { if (DEBUG) Log.d(TAG, "setKeyguardShowing " + keyguardShowing); mKeyguardShowing = keyguardShowing; @@ -223,12 +228,14 @@ public class QSFragment extends Fragment implements QS { updateQsState(); } + @Override public void setOverscrolling(boolean stackScrollerOverscrolling) { if (DEBUG) Log.d(TAG, "setOverscrolling " + stackScrollerOverscrolling); mStackScrollerOverscrolling = stackScrollerOverscrolling; updateQsState(); } + @Override public void setListening(boolean listening) { if (DEBUG) Log.d(TAG, "setListening " + listening); mListening = listening; @@ -237,11 +244,13 @@ public class QSFragment extends Fragment implements QS { mQSPanel.setListening(mListening && mQsExpanded); } + @Override public void setHeaderListening(boolean listening) { mHeader.setListening(listening); mFooter.setListening(listening); } + @Override public void setQsExpansion(float expansion, float headerTranslation) { if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + headerTranslation); mContainer.setExpansion(expansion); @@ -269,6 +278,7 @@ public class QSFragment extends Fragment implements QS { mQSPanel.setClipBounds(mQsBounds); } + @Override public void animateHeaderSlidingIn(long delay) { if (DEBUG) Log.d(TAG, "animateHeaderSlidingIn"); // If the QS is already expanded we don't need to slide in the header as it's already @@ -280,6 +290,7 @@ public class QSFragment extends Fragment implements QS { } } + @Override public void animateHeaderSlidingOut() { if (DEBUG) Log.d(TAG, "animateHeaderSlidingOut"); mHeaderAnimating = true; @@ -300,7 +311,11 @@ public class QSFragment extends Fragment implements QS { @Override public void setExpandClickListener(OnClickListener onClickListener) { - mFooter.getExpandView().setOnClickListener(onClickListener); + View expandView = mFooter.getExpandView(); + + if (expandView != null) { + expandView.setOnClickListener(onClickListener); + } } @Override @@ -323,6 +338,7 @@ public class QSFragment extends Fragment implements QS { * The height this view wants to be. This is different from {@link #getMeasuredHeight} such that * during closing the detail panel, this already returns the smaller height. */ + @Override public int getDesiredHeight() { if (mQSCustomizer.isCustomizing()) { return getView().getHeight(); @@ -342,6 +358,7 @@ public class QSFragment extends Fragment implements QS { mContainer.setHeightOverride(desiredHeight); } + @Override public int getQsMinExpansionHeight() { return mHeader.getHeight(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 7ec07604fab5..0709e229bd4d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -58,8 +58,6 @@ public class QuickStatusBarHeader extends RelativeLayout { Resources res = getResources(); mHeaderQsPanel = findViewById(R.id.quick_qs_panel); - mHeaderQsPanel.setVisibility(res.getBoolean(R.bool.config_showQuickSettingsRow) - ? VISIBLE : GONE); // RenderThread is doing more harm than good when touching the header (to expand quick // settings), so disable it for this view diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java new file mode 100644 index 000000000000..9730f29da977 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFooter.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2017 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.systemui.qs.car; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.ImageView; +import android.widget.RelativeLayout; + +import com.android.systemui.Dependency; +import com.android.systemui.R; +import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.qs.QSFooter; +import com.android.systemui.qs.QSPanel; +import com.android.systemui.statusbar.phone.MultiUserSwitch; +import com.android.systemui.statusbar.policy.DeviceProvisionedController; +import com.android.systemui.statusbar.policy.UserInfoController; + +/** + * The footer view that displays below the status bar in the auto use-case. This view shows the + * user switcher and access to settings. + */ +public class CarQSFooter extends RelativeLayout implements QSFooter, + UserInfoController.OnUserInfoChangedListener { + private UserInfoController mUserInfoController; + + private MultiUserSwitch mMultiUserSwitch; + private ImageView mMultiUserAvatar; + + public CarQSFooter(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mMultiUserSwitch = findViewById(R.id.multi_user_switch); + mMultiUserAvatar = mMultiUserSwitch.findViewById(R.id.multi_user_avatar); + + mUserInfoController = Dependency.get(UserInfoController.class); + + findViewById(R.id.settings_button).setOnClickListener(v -> { + ActivityStarter activityStarter = Dependency.get(ActivityStarter.class); + + if (!Dependency.get(DeviceProvisionedController.class).isCurrentUserSetup()) { + // If user isn't setup just unlock the device and dump them back at SUW. + activityStarter.postQSRunnableDismissingKeyguard(() -> { }); + return; + } + + activityStarter.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS), + true /* dismissShade */); + }); + } + + @Override + public void onUserInfoChanged(String name, Drawable picture, String userAccount) { + mMultiUserAvatar.setImageDrawable(picture); + } + + @Override + public void setQSPanel(@Nullable QSPanel panel) { + if (panel != null) { + mMultiUserSwitch.setQsPanel(panel); + } + } + + @Override + public void setListening(boolean listening) { + if (listening) { + mUserInfoController.addCallback(this); + } else { + mUserInfoController.removeCallback(this); + } + } + + @Nullable + @Override + public View getExpandView() { + // No view that should expand/collapse the quick settings. + return null; + } + + @Override + public void setExpanded(boolean expanded) { + // Do nothing because the quick settings cannot be expanded. + } + + @Override + public void setExpansion(float expansion) { + // Do nothing because the quick settings cannot be expanded. + } + + @Override + public void setKeyguardShowing(boolean keyguardShowing) { + // Do nothing because the footer will not be shown when the keyguard is up. + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java new file mode 100644 index 000000000000..7c2a8129813a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarQSFragment.java @@ -0,0 +1,164 @@ +/* + * Copyright (C) 2017 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.systemui.qs.car; + +import android.app.Fragment; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; + +import com.android.systemui.R; +import com.android.systemui.plugins.qs.QS; +import com.android.systemui.qs.QSFooter; + +/** + * A quick settings fragment for the car. For auto, there is no row for quick settings or ability + * to expand the quick settings panel. Instead, the only thing is that displayed is the + * status bar, and a static row with access to the user switcher and settings. + */ +public class CarQSFragment extends Fragment implements QS { + private View mHeader; + private QSFooter mFooter; + + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, + Bundle savedInstanceState) { + return inflater.inflate(R.layout.car_qs_panel, container, false); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mHeader = view.findViewById(R.id.header); + mFooter = view.findViewById(R.id.qs_footer); + } + + @Override + public void hideImmediately() { + getView().setVisibility(View.INVISIBLE); + } + + @Override + public void setQsExpansion(float qsExpansionFraction, float headerTranslation) { + // If the header is to be completed translated down, then set it to be visible. + getView().setVisibility(headerTranslation == 0 ? View.VISIBLE : View.INVISIBLE); + } + + @Override + public View getHeader() { + return mHeader; + } + + @VisibleForTesting + QSFooter getFooter() { + return mFooter; + } + + @Override + public void setHeaderListening(boolean listening) { + mFooter.setListening(listening); + } + + @Override + public void setListening(boolean listening) { + mFooter.setListening(listening); + } + + @Override + public int getQsMinExpansionHeight() { + return getView().getHeight(); + } + + @Override + public int getDesiredHeight() { + return getView().getHeight(); + } + + @Override + public void setPanelView(HeightListener notificationPanelView) { + // No quick settings panel. + } + + @Override + public void setHeightOverride(int desiredHeight) { + // No ability to expand quick settings. + } + + @Override + public void setHeaderClickable(boolean qsExpansionEnabled) { + // Usually this sets the expand button to be clickable, but there is no quick settings to + // expand. + } + + @Override + public boolean isCustomizing() { + // No ability to customize the quick settings. + return false; + } + + @Override + public void setOverscrolling(boolean overscrolling) { + // No overscrolling to reveal quick settings. + } + + @Override + public void setExpanded(boolean qsExpanded) { + // No quick settings to expand + } + + @Override + public boolean isShowingDetail() { + // No detail panel to close. + return false; + } + + @Override + public void closeDetail() { + // No detail panel to close. + } + + @Override + public void setKeyguardShowing(boolean keyguardShowing) { + // No keyguard to show. + } + + @Override + public void animateHeaderSlidingIn(long delay) { + // No header to animate. + } + + @Override + public void animateHeaderSlidingOut() { + // No header to animate. + } + + @Override + public void notifyCustomizeChanged() { + // There is no ability to customize quick settings. + } + + @Override + public void setContainer(ViewGroup container) { + // No quick settings, so no container to set. + } + + @Override + public void setExpandClickListener(OnClickListener onClickListener) { + // No ability to expand the quick settings. + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java new file mode 100644 index 000000000000..6797bb9dbe82 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/car/CarStatusBarHeader.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2017 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.systemui.qs.car; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.Rect; +import android.support.annotation.IdRes; +import android.util.AttributeSet; +import android.view.View; +import android.widget.RelativeLayout; + +import com.android.settingslib.Utils; +import com.android.systemui.BatteryMeterView; +import com.android.systemui.R; +import com.android.systemui.statusbar.policy.DarkIconDispatcher; + +/** + * A view that forms the header of the notification panel. This view will ensure that any + * status icons that are displayed are tinted accordingly to the current theme. + */ +public class CarStatusBarHeader extends RelativeLayout { + public CarStatusBarHeader(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + // Set the light/dark theming on the header status UI to match the current theme. + int colorForeground = Utils.getColorAttr(getContext(), android.R.attr.colorForeground); + float intensity = colorForeground == Color.WHITE ? 0f : 1f; + Rect tintArea = new Rect(0, 0, 0, 0); + + applyDarkness(R.id.signal_cluster, tintArea, intensity, colorForeground); + applyDarkness(R.id.battery, tintArea, intensity, colorForeground); + applyDarkness(R.id.clock, tintArea, intensity, colorForeground); + + ((BatteryMeterView) findViewById(R.id.battery)).setForceShowPercent(true); + } + + private void applyDarkness(@IdRes int id, Rect tintArea, float intensity, int color) { + View v = findViewById(id); + if (v instanceof DarkIconDispatcher.DarkReceiver) { + ((DarkIconDispatcher.DarkReceiver) v).onDarkChanged(tintArea, intensity, color); + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 9ba32b354d8f..6b8570771175 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -43,11 +43,14 @@ import android.widget.Toast; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.systemui.Dependency; import com.android.systemui.EventLogConstants; import com.android.systemui.EventLogTags; import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SystemUI; +import com.android.systemui.plugins.PluginActivity; +import com.android.systemui.plugins.PluginActivityManager; import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.ConfigurationChangedEvent; import com.android.systemui.recents.events.activity.DockedTopTaskEvent; @@ -207,7 +210,7 @@ public class Recents extends SystemUI mImpl = new RecentsImpl(mContext); // Check if there is a recents override package - if ("userdebug".equals(Build.TYPE) || "eng".equals(Build.TYPE)) { + if (Build.IS_USERDEBUG || Build.IS_ENG) { String cnStr = SystemProperties.get(RECENTS_OVERRIDE_SYSPROP_KEY); if (!cnStr.isEmpty()) { mOverrideRecentsPackageName = cnStr; @@ -234,6 +237,8 @@ public class Recents extends SystemUI registerWithSystemUser(); } putComponent(Recents.class, this); + Dependency.get(PluginActivityManager.class).addActivityPlugin(RecentsImpl.RECENTS_ACTIVITY, + PluginActivity.ACTION_RECENTS); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index 7b574833cd47..a35310fc7d59 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -46,6 +46,7 @@ import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; +import android.os.PowerManager; import android.os.Process; import android.os.UserHandle; import android.provider.MediaStore; @@ -61,6 +62,7 @@ import android.view.ViewGroup; import android.view.WindowManager; import android.view.animation.Interpolator; import android.widget.ImageView; +import android.widget.Toast; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.R; @@ -678,6 +680,13 @@ class GlobalScreenshot { */ private void startAnimation(final Runnable finisher, int w, int h, boolean statusBarVisible, boolean navBarVisible) { + // If power save is on, show a toast so there is some visual indication that a screenshot + // has been taken. + PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); + if (powerManager.isPowerSaveMode()) { + Toast.makeText(mContext, R.string.screenshot_saved_title, Toast.LENGTH_SHORT).show(); + } + // Add the view for the animation mScreenshotView.setImageBitmap(mScreenBitmap); mScreenshotLayout.requestFocus(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java index 5a163d4d56c2..f8591247f1d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java @@ -417,7 +417,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl @Override public void onHeightUpdate() { - if (mParent == null || mMenuItems.size() == 0) { + if (mParent == null || mMenuItems.size() == 0 || mMenuContainer == null) { return; } int parentHeight = mParent.getCollapsedHeight(); @@ -477,7 +477,7 @@ public class NotificationMenuRow implements NotificationMenuRowPlugin, View.OnCl private void setMenuLocation() { boolean showOnLeft = mTranslation > 0; - if ((mIconsPlaced && showOnLeft == mOnLeft) || mSnapping + if ((mIconsPlaced && showOnLeft == mOnLeft) || mSnapping || mMenuContainer == null || !mMenuContainer.isAttachedToWindow()) { // Do nothing return; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 97e2f6d3e6f1..7abceaf41c70 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -16,15 +16,18 @@ package com.android.systemui.statusbar; +import static com.android.systemui.statusbar.phone.NotificationIconContainer.IconState.NO_VALUE; +import static com.android.systemui.statusbar.phone.NotificationIconContainer.OVERFLOW_EARLY_AMOUNT; + import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; import android.os.SystemProperties; import android.util.AttributeSet; -import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; + import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.ViewInvertHelper; @@ -315,26 +318,65 @@ public class NotificationShelf extends ActivatableNotificationView implements private float updateIconAppearance(ExpandableNotificationRow row, float expandAmount, boolean scrolling, boolean scrollingFast, boolean expandingAnimated, boolean isLastChild) { + StatusBarIconView icon = row.getEntry().expandedIcon; + NotificationIconContainer.IconState iconState = getIconState(icon); + if (iconState == null) { + return 0.0f; + } + // Let calculate how much the view is in the shelf float viewStart = row.getTranslationY(); int fullHeight = row.getActualHeight() + mPaddingBetweenElements; float iconTransformDistance = getIntrinsicHeight() * 1.5f; iconTransformDistance *= NotificationUtils.interpolate(1.f, 1.5f, expandAmount); + iconTransformDistance = Math.min(iconTransformDistance, fullHeight); if (isLastChild) { fullHeight = Math.min(fullHeight, row.getMinHeight() - getIntrinsicHeight()); iconTransformDistance = Math.min(iconTransformDistance, row.getMinHeight() - getIntrinsicHeight()); } float viewEnd = viewStart + fullHeight; + if (expandingAnimated && mAmbientState.getScrollY() == 0 + && !mAmbientState.isOnKeyguard() && !iconState.isLastExpandIcon) { + // We are expanding animated. Because we switch to a linear interpolation in this case, + // the last icon may be stuck in between the shelf position and the notification + // position, which looks pretty bad. We therefore optimize this case by applying a + // shorter transition such that the icon is either fully in the notification or we clamp + // it into the shelf if it's close enough. + // We need to persist this, since after the expansion, the behavior should still be the + // same. + float position = mAmbientState.getIntrinsicPadding() + + mHostLayout.getPositionInLinearLayout(row); + int maxShelfStart = mMaxLayoutHeight - getIntrinsicHeight(); + if (position < maxShelfStart && position + row.getIntrinsicHeight() >= maxShelfStart + && row.getTranslationY() < position) { + iconState.isLastExpandIcon = true; + iconState.customTransformHeight = NO_VALUE; + // Let's check if we're close enough to snap into the shelf + boolean forceInShelf = mMaxLayoutHeight - getIntrinsicHeight() - position + < getIntrinsicHeight(); + if (!forceInShelf) { + // We are overlapping the shelf but not enough, so the icon needs to be + // repositioned + iconState.customTransformHeight = (int) (mMaxLayoutHeight + - getIntrinsicHeight() - position); + } + } + } float fullTransitionAmount; float iconTransitionAmount; float shelfStart = getTranslationY(); + if (iconState.hasCustomTransformHeight()) { + fullHeight = iconState.customTransformHeight; + iconTransformDistance = iconState.customTransformHeight; + } + boolean fullyInOrOut = true; if (viewEnd >= shelfStart && (!mAmbientState.isUnlockHintRunning() || row.isInShelf()) && (mAmbientState.isShadeExpanded() || (!row.isPinned() && !row.isHeadsUpAnimatingAway()))) { if (viewStart < shelfStart) { - float fullAmount = (shelfStart - viewStart) / fullHeight; + fullAmount = Math.min(1.0f, fullAmount); float interpolatedAmount = Interpolators.ACCELERATE_DECELERATE.getInterpolation( fullAmount); interpolatedAmount = NotificationUtils.interpolate( @@ -344,7 +386,7 @@ public class NotificationShelf extends ActivatableNotificationView implements iconTransitionAmount = (shelfStart - viewStart) / iconTransformDistance; iconTransitionAmount = Math.min(1.0f, iconTransitionAmount); iconTransitionAmount = 1.0f - iconTransitionAmount; - + fullyInOrOut = false; } else { fullTransitionAmount = 1.0f; iconTransitionAmount = 1.0f; @@ -353,6 +395,10 @@ public class NotificationShelf extends ActivatableNotificationView implements fullTransitionAmount = 0.0f; iconTransitionAmount = 0.0f; } + if (fullyInOrOut && !expandingAnimated && iconState.isLastExpandIcon) { + iconState.isLastExpandIcon = false; + iconState.customTransformHeight = NO_VALUE; + } updateIconPositioning(row, iconTransitionAmount, fullTransitionAmount, iconTransformDistance, scrolling, scrollingFast, expandingAnimated, isLastChild); return fullTransitionAmount; @@ -366,9 +412,10 @@ public class NotificationShelf extends ActivatableNotificationView implements if (iconState == null) { return; } + boolean forceInShelf = iconState.isLastExpandIcon && !iconState.hasCustomTransformHeight(); float clampedAmount = iconTransitionAmount > 0.5f ? 1.0f : 0.0f; if (clampedAmount == fullTransitionAmount) { - iconState.noAnimations = scrollingFast || expandingAnimated; + iconState.noAnimations = (scrollingFast || expandingAnimated) && !forceInShelf; iconState.useFullTransitionAmount = iconState.noAnimations || (!ICON_ANMATIONS_WHILE_SCROLLING && fullTransitionAmount == 0.0f && scrolling); iconState.useLinearTransitionAmount = !ICON_ANMATIONS_WHILE_SCROLLING @@ -376,12 +423,18 @@ public class NotificationShelf extends ActivatableNotificationView implements iconState.translateContent = mMaxLayoutHeight - getTranslationY() - getIntrinsicHeight() > 0; } - if (scrollingFast || (expandingAnimated && iconState.useFullTransitionAmount - && !ViewState.isAnimatingY(icon))) { + if (!forceInShelf && (scrollingFast || (expandingAnimated + && iconState.useFullTransitionAmount && !ViewState.isAnimatingY(icon)))) { iconState.cancelAnimations(icon); iconState.useFullTransitionAmount = true; iconState.noAnimations = true; } + if (iconState.hasCustomTransformHeight()) { + iconState.useFullTransitionAmount = true; + } + if (iconState.isLastExpandIcon) { + iconState.translateContent = false; + } float transitionAmount; if (isLastChild || !USE_ANIMATIONS_WHEN_OPENING || iconState.useFullTransitionAmount || iconState.useLinearTransitionAmount) { @@ -548,8 +601,7 @@ public class NotificationShelf extends ActivatableNotificationView implements if (!hasOverflow) { // we have to ensure that adding the low priority notification won't lead to an // overflow - collapsedPadding -= (1.0f + NotificationIconContainer.OVERFLOW_EARLY_AMOUNT) - * mCollapsedIcons.getIconSize(); + collapsedPadding -= (1.0f + OVERFLOW_EARLY_AMOUNT) * mCollapsedIcons.getIconSize(); } float padding = NotificationUtils.interpolate(collapsedPadding, mShelfIcons.getPaddingEnd(), diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index c608a8594f6f..680f693a83f8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -76,6 +76,7 @@ public class CarStatusBar extends StatusBar implements private Drawable mNotificationPanelBackground; private ConnectedDeviceSignalController mConnectedDeviceSignalController; + private ViewGroup mNavigationBarWindow; private CarNavigationBarView mNavigationBarView; private final Object mQueueLock = new Object(); @@ -97,6 +98,11 @@ public class CarStatusBar extends StatusBar implements mCarBatteryController.stopListening(); mConnectedDeviceSignalController.stopListening(); + if (mNavigationBarWindow != null) { + mWindowManager.removeViewImmediate(mNavigationBarWindow); + mNavigationBarView = null; + } + super.destroy(); } @@ -153,10 +159,19 @@ public class CarStatusBar extends StatusBar implements // SystemUI requires that the navigation bar view have a parent. Since the regular // StatusBar inflates navigation_bar_window as this parent view, use the same view for the // CarNavigationBarView. - ViewGroup navigationBarWindow = (ViewGroup) View.inflate(mContext, + mNavigationBarWindow = (ViewGroup) View.inflate(mContext, R.layout.navigation_bar_window, null); - View.inflate(mContext, R.layout.car_navigation_bar, navigationBarWindow); - mNavigationBarView = (CarNavigationBarView) navigationBarWindow.getChildAt(0); + if (mNavigationBarWindow == null) { + Log.e(TAG, "CarStatusBar failed inflate for R.layout.navigation_bar_window"); + } + + + View.inflate(mContext, R.layout.car_navigation_bar, mNavigationBarWindow); + mNavigationBarView = (CarNavigationBarView) mNavigationBarWindow.getChildAt(0); + if (mNavigationBarView == null) { + Log.e(TAG, "CarStatusBar failed inflate for R.layout.car_navigation_bar"); + } + mController = new CarNavigationBarController(mContext, mNavigationBarView, this /* ActivityStarter*/); @@ -173,7 +188,7 @@ public class CarStatusBar extends StatusBar implements lp.setTitle("CarNavigationBar"); lp.windowAnimations = 0; - mWindowManager.addView(navigationBarWindow, lp); + mWindowManager.addView(mNavigationBarWindow, lp); } @Override @@ -219,6 +234,11 @@ public class CarStatusBar extends StatusBar implements } @Override + public View getNavigationBarWindow() { + return mNavigationBarWindow; + } + + @Override protected View.OnTouchListener getStatusBarWindowTouchListener() { // Usually, a touch on the background window will dismiss the notification shade. However, // for the car use-case, the shade should remain unless the user switches to a different diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index 720ca1499bf1..09ae521ceb2b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -19,9 +19,11 @@ import android.content.Context; import android.content.res.Configuration; import android.graphics.drawable.Icon; import android.util.AttributeSet; +import android.util.Log; import android.util.SparseArray; import android.view.Display; import android.view.Display.Mode; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -35,6 +37,7 @@ import com.android.systemui.R; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.PluginManager; import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider; +import com.android.systemui.statusbar.phone.ReverseLinearLayout.ReverseFrameLayout; import com.android.systemui.statusbar.policy.KeyButtonView; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; @@ -43,6 +46,8 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; + public class NavigationBarInflaterView extends FrameLayout implements Tunable, PluginListener<NavBarButtonProvider> { @@ -71,6 +76,8 @@ public class NavigationBarInflaterView extends FrameLayout public static final String KEY_CODE_START = "("; public static final String KEY_IMAGE_DELIM = ":"; public static final String KEY_CODE_END = ")"; + private static final String WEIGHT_SUFFIX = "W"; + private static final String WEIGHT_CENTERED_SUFFIX = "WC"; private final List<NavBarButtonProvider> mPlugins = new ArrayList<>(); @@ -219,26 +226,27 @@ public class NavigationBarInflaterView extends FrameLayout String[] center = sets[1].split(BUTTON_SEPARATOR); String[] end = sets[2].split(BUTTON_SEPARATOR); // Inflate these in start to end order or accessibility traversal will be messed up. - inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape); - inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape); + inflateButtons(start, mRot0.findViewById(R.id.ends_group), isRot0Landscape, true); + inflateButtons(start, mRot90.findViewById(R.id.ends_group), !isRot0Landscape, true); - inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group), isRot0Landscape); - inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group), !isRot0Landscape); + inflateButtons(center, mRot0.findViewById(R.id.center_group), isRot0Landscape, false); + inflateButtons(center, mRot90.findViewById(R.id.center_group), !isRot0Landscape, false); - addGravitySpacer((LinearLayout) mRot0.findViewById(R.id.ends_group)); - addGravitySpacer((LinearLayout) mRot90.findViewById(R.id.ends_group)); + addGravitySpacer(mRot0.findViewById(R.id.ends_group)); + addGravitySpacer(mRot90.findViewById(R.id.ends_group)); - inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group), isRot0Landscape); - inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group), !isRot0Landscape); + inflateButtons(end, mRot0.findViewById(R.id.ends_group), isRot0Landscape, false); + inflateButtons(end, mRot90.findViewById(R.id.ends_group), !isRot0Landscape, false); } private void addGravitySpacer(LinearLayout layout) { layout.addView(new Space(mContext), new LinearLayout.LayoutParams(0, 0, 1)); } - private void inflateButtons(String[] buttons, ViewGroup parent, boolean landscape) { + private void inflateButtons(String[] buttons, ViewGroup parent, boolean landscape, + boolean start) { for (int i = 0; i < buttons.length; i++) { - inflateButton(buttons[i], parent, landscape); + inflateButton(buttons[i], parent, landscape, start); } } @@ -251,16 +259,13 @@ public class NavigationBarInflaterView extends FrameLayout } @Nullable - protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape) { + protected View inflateButton(String buttonSpec, ViewGroup parent, boolean landscape, + boolean start) { LayoutInflater inflater = landscape ? mLandscapeInflater : mLayoutInflater; - float size = extractSize(buttonSpec); - View v = createView(buttonSpec, parent, inflater, landscape); + View v = createView(buttonSpec, parent, inflater); if (v == null) return null; - if (size != 0) { - ViewGroup.LayoutParams params = v.getLayoutParams(); - params.width = (int) (params.width * size); - } + v = applySize(v, buttonSpec, landscape, start); parent.addView(v); addToDispatchers(v); View lastView = landscape ? mLastLandscape : mLastPortrait; @@ -275,16 +280,41 @@ public class NavigationBarInflaterView extends FrameLayout return v; } - private View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater, - boolean landscape) { + private View applySize(View v, String buttonSpec, boolean landscape, boolean start) { + String sizeStr = extractSize(buttonSpec); + if (sizeStr == null) return v; + + if (sizeStr.contains(WEIGHT_SUFFIX)) { + float weight = Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX))); + FrameLayout frame = new ReverseFrameLayout(mContext); + LayoutParams childParams = new LayoutParams(v.getLayoutParams()); + if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) { + childParams.gravity = Gravity.CENTER; + } else { + childParams.gravity = landscape ? (start ? Gravity.BOTTOM : Gravity.TOP) + : (start ? Gravity.START : Gravity.END); + } + frame.addView(v, childParams); + frame.setLayoutParams(new LinearLayout.LayoutParams(0, MATCH_PARENT, weight)); + frame.setClipChildren(false); + frame.setClipToPadding(false); + return frame; + } + float size = Float.parseFloat(sizeStr); + ViewGroup.LayoutParams params = v.getLayoutParams(); + params.width = (int) (params.width * size); + return v; + } + + private View createView(String buttonSpec, ViewGroup parent, LayoutInflater inflater) { View v = null; String button = extractButton(buttonSpec); if (LEFT.equals(button)) { - buttonSpec = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, NAVSPACE); - button = extractButton(buttonSpec); + String s = Dependency.get(TunerService.class).getValue(NAV_BAR_LEFT, NAVSPACE); + button = extractButton(s); } else if (RIGHT.equals(button)) { - buttonSpec = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME); - button = extractButton(buttonSpec); + String s = Dependency.get(TunerService.class).getValue(NAV_BAR_RIGHT, MENU_IME); + button = extractButton(s); } // Let plugins go first so they can override a standard view if they want. for (NavBarButtonProvider provider : mPlugins) { @@ -340,13 +370,12 @@ public class NavigationBarInflaterView extends FrameLayout return Integer.parseInt(subStr); } - public static float extractSize(String buttonSpec) { + public static String extractSize(String buttonSpec) { if (!buttonSpec.contains(SIZE_MOD_START)) { - return 1; + return null; } final int sizeStart = buttonSpec.indexOf(SIZE_MOD_START); - String sizeStr = buttonSpec.substring(sizeStart + 1, buttonSpec.indexOf(SIZE_MOD_END)); - return Float.parseFloat(sizeStr); + return buttonSpec.substring(sizeStart + 1, buttonSpec.indexOf(SIZE_MOD_END)); } public static String extractButton(String buttonSpec) { @@ -379,8 +408,8 @@ public class NavigationBarInflaterView extends FrameLayout mButtonDispatchers.valueAt(i).clear(); } } - clearAllChildren((ViewGroup) mRot0.findViewById(R.id.nav_buttons)); - clearAllChildren((ViewGroup) mRot90.findViewById(R.id.nav_buttons)); + clearAllChildren(mRot0.findViewById(R.id.nav_buttons)); + clearAllChildren(mRot90.findViewById(R.id.nav_buttons)); } private void clearAllChildren(ViewGroup group) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index a6cd472f2686..18dc7e2fa35b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -575,15 +575,17 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav mRotatedViews[Surface.ROTATION_270] = mRotatedViews[Surface.ROTATION_90] = findViewById(R.id.rot90); - updateCurrentView(); + mCurrentRotation = -1; + reorient(); } public boolean needsReorient(int rotation) { return mCurrentRotation != rotation; } - private void updateCurrentView() { + private boolean updateCurrentView() { final int rot = mDisplay.getRotation(); + if (rot == mCurrentRotation) return false; for (int i=0; i<4; i++) { mRotatedViews[i].setVisibility(View.GONE); } @@ -595,6 +597,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } updateLayoutTransitionsEnabled(); mCurrentRotation = rot; + return true; } private void updateRecentsIcon() { @@ -607,10 +610,15 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav } public void reorient() { - updateCurrentView(); + if (!updateCurrentView()) { + return; + } + Log.d(TAG, "reorient", new Throwable()); mDeadZone = (DeadZone) mCurrentView.findViewById(R.id.deadzone); - ((NavigationBarFrame) getRootView()).setDeadZone(mDeadZone); + if (getRootView() instanceof NavigationBarFrame) { + ((NavigationBarFrame) getRootView()).setDeadZone(mDeadZone); + } mDeadZone.setDisplayRotation(mCurrentRotation); // force the low profile & disabled states into compliance @@ -644,6 +652,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav mVertical = newVertical; //Log.v(TAG, String.format("onSizeChanged: h=%d, w=%d, vert=%s", h, w, mVertical?"y":"n")); reorient(); + getHomeButton().setVertical(mVertical); notifyVerticalChangedListener(newVertical); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java index 3937dd3eea2a..38c8d31e0970 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java @@ -526,6 +526,7 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { } public class IconState extends ViewState { + public static final int NO_VALUE = NotificationIconContainer.NO_VALUE; public float iconAppearAmount = 1.0f; public float clampedAppearAmount = 1.0f; public int visibleState; @@ -538,6 +539,8 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { public boolean justUndarkened; public int iconColor = StatusBarIconView.NO_COLOR; public boolean noAnimations; + public boolean isLastExpandIcon; + public int customTransformHeight = NO_VALUE; @Override public void applyToView(View view) { @@ -615,6 +618,10 @@ public class NotificationIconContainer extends AlphaOptimizedFrameLayout { justUndarkened = false; } + public boolean hasCustomTransformHeight() { + return isLastExpandIcon && customTransformHeight != NO_VALUE; + } + @Override public void initFrom(View view) { super.initFrom(view); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 4701f85c5ff3..a7731724b807 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -153,7 +153,6 @@ public class NotificationPanelView extends PanelView implements protected int mQsMinExpansionHeight; protected int mQsMaxExpansionHeight; private int mQsPeekHeight; - private boolean mQsOverscrollExpansionEnabled; private boolean mStackScrollerOverscrolling; private boolean mQsExpansionFromOverscroll; private float mLastOverscroll; @@ -242,8 +241,6 @@ public class NotificationPanelView extends PanelView implements super(context, attrs); setWillNotDraw(!DEBUG); mFalsingManager = FalsingManager.getInstance(context); - mQsOverscrollExpansionEnabled = - getResources().getBoolean(R.bool.config_enableQuickSettingsOverscrollExpansion); } public void setStatusBar(StatusBar bar) { @@ -668,7 +665,7 @@ public class NotificationPanelView extends PanelView implements return true; } - if (mQsOverscrollExpansionEnabled && !isFullyCollapsed() && onQsIntercept(event)) { + if (!isFullyCollapsed() && onQsIntercept(event)) { return true; } return super.onInterceptTouchEvent(event); @@ -843,8 +840,7 @@ public class NotificationPanelView extends PanelView implements } handled |= mHeadsUpTouchHelper.onTouchEvent(event); - if (mQsOverscrollExpansionEnabled && !mHeadsUpTouchHelper.isTrackingHeadsUp() - && handleQsTouch(event)) { + if (!mHeadsUpTouchHelper.isTrackingHeadsUp() && handleQsTouch(event)) { return true; } if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyCollapsed()) { @@ -1028,10 +1024,6 @@ public class NotificationPanelView extends PanelView implements @Override public void onOverscrollTopChanged(float amount, boolean isRubberbanded) { - if (!mQsOverscrollExpansionEnabled) { - return; - } - cancelQsAnimation(); if (!mQsExpansionEnabled) { amount = 0f; @@ -1046,10 +1038,6 @@ public class NotificationPanelView extends PanelView implements @Override public void flingTopOverscroll(float velocity, boolean open) { - if (!mQsOverscrollExpansionEnabled) { - return; - } - mLastOverscroll = 0f; mQsExpansionFromOverscroll = false; setQsExpansion(mQsExpansionHeight); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ReverseLinearLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ReverseLinearLayout.java index f45967a0a0a6..bcbc3457a2e2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ReverseLinearLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ReverseLinearLayout.java @@ -16,10 +16,10 @@ package com.android.systemui.statusbar.phone; import android.annotation.Nullable; import android.content.Context; -import android.content.res.Configuration; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.LinearLayout; import java.util.ArrayList; @@ -48,7 +48,7 @@ public class ReverseLinearLayout extends LinearLayout { @Override public void addView(View child) { - reversParams(child.getLayoutParams()); + reverseParams(child.getLayoutParams(), child); if (mIsLayoutReverse) { super.addView(child, 0); } else { @@ -58,7 +58,7 @@ public class ReverseLinearLayout extends LinearLayout { @Override public void addView(View child, ViewGroup.LayoutParams params) { - reversParams(params); + reverseParams(params, child); if (mIsLayoutReverse) { super.addView(child, 0, params); } else { @@ -100,7 +100,15 @@ public class ReverseLinearLayout extends LinearLayout { } } - private void reversParams(ViewGroup.LayoutParams params) { + private static void reverseParams(ViewGroup.LayoutParams params, View child) { + if (child instanceof Reversable) { + ((Reversable) child).reverse(); + } + if (child.getPaddingLeft() == child.getPaddingRight() + && child.getPaddingTop() == child.getPaddingBottom()) { + child.setPadding(child.getPaddingTop(), child.getPaddingLeft(), + child.getPaddingTop(), child.getPaddingLeft()); + } if (params == null) { return; } @@ -109,4 +117,23 @@ public class ReverseLinearLayout extends LinearLayout { params.height = width; } + public interface Reversable { + void reverse(); + } + + public static class ReverseFrameLayout extends FrameLayout implements Reversable { + + public ReverseFrameLayout(Context context) { + super(context); + } + + @Override + public void reverse() { + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + reverseParams(child.getLayoutParams(), child); + } + } + } + } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 419aefe3e9e9..754c34486954 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -61,11 +61,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, public static final float GRADIENT_SCRIM_ALPHA = 0.45f; // A scrim varies its opacity based on a busyness factor, for example // how many notifications are currently visible. - public static final float GRADIENT_SCRIM_ALPHA_BUSY = 0.90f; + public static final float GRADIENT_SCRIM_ALPHA_BUSY = 0.70f; protected static final float SCRIM_BEHIND_ALPHA_KEYGUARD = GRADIENT_SCRIM_ALPHA; protected static final float SCRIM_BEHIND_ALPHA_UNLOCKING = 0.2f; - private static final float SCRIM_IN_FRONT_ALPHA = GRADIENT_SCRIM_ALPHA; - private static final float SCRIM_IN_FRONT_ALPHA_LOCKED = GRADIENT_SCRIM_ALPHA; + private static final float SCRIM_IN_FRONT_ALPHA = GRADIENT_SCRIM_ALPHA_BUSY; + private static final float SCRIM_IN_FRONT_ALPHA_LOCKED = GRADIENT_SCRIM_ALPHA_BUSY; private static final int TAG_KEY_ANIM = R.id.scrim; private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target; private static final int TAG_START_ALPHA = R.id.scrim_alpha_start; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java index deea521b7c2f..7a7efbdc6615 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java @@ -100,12 +100,8 @@ public class SignalDrawable extends Drawable { // How far the circle defining the corners is inset from the edges private final float mAppliedCornerInset; - // The easiest way to understand this is as if we set Style.STROKE and draw the triangle, - // but that is only theoretically right. Instead, draw the triangle and clip out a smaller - // one inset by this amount. - private final float mEmptyStrokeWidth; private static final float INV_TAN = 1f / (float) Math.tan(Math.PI / 8f); - private final float mEmptyDiagInset; // == mEmptyStrokeWidth * INV_TAN + private static final float CUT_WIDTH_DP = 1f / 12f; // Where the top and left points of the triangle would be if not for rounding private final PointF mVirtualTop = new PointF(); @@ -145,11 +141,6 @@ public class SignalDrawable extends Drawable { Utils.getDefaultColor(context, R.color.light_mode_icon_color_dual_tone_fill); mIntrinsicSize = context.getResources().getDimensionPixelSize(R.dimen.signal_icon_size); - // mCutPath parameters - mEmptyStrokeWidth = context.getResources() - .getDimensionPixelSize(R.dimen.mobile_signal_empty_strokewidth); - mEmptyDiagInset = mEmptyStrokeWidth * INV_TAN; - mHandler = new Handler(); setDarkIntensity(0); @@ -326,22 +317,20 @@ public class SignalDrawable extends Drawable { (padding + cornerRadius + mAppliedCornerInset) - (INV_TAN * cornerRadius), height - padding); + final float cutWidth = CUT_WIDTH_DP * height; + final float cutDiagInset = cutWidth * INV_TAN; + // Cut out a smaller triangle from the center of mFullPath mCutPath.reset(); mCutPath.setFillType(FillType.WINDING); - mCutPath.moveTo(width - padding - mEmptyStrokeWidth, - height - padding - mEmptyStrokeWidth); - mCutPath.lineTo(width - padding - mEmptyStrokeWidth, - mVirtualTop.y + mEmptyDiagInset); - mCutPath.lineTo(mVirtualLeft.x + mEmptyDiagInset, - height - padding - mEmptyStrokeWidth); - mCutPath.lineTo(width - padding - mEmptyStrokeWidth, - height - padding - mEmptyStrokeWidth); - - // In empty state, draw the full path as the foreground paint - mForegroundPath.set(mFullPath); - mFullPath.reset(); - mForegroundPath.op(mCutPath, Path.Op.DIFFERENCE); + mCutPath.moveTo(width - padding - cutWidth, height - padding - cutWidth); + mCutPath.lineTo(width - padding - cutWidth, mVirtualTop.y + cutDiagInset); + mCutPath.lineTo(mVirtualLeft.x + cutDiagInset, height - padding - cutWidth); + mCutPath.lineTo(width - padding - cutWidth, height - padding - cutWidth); + + // Draw empty state as only background + mForegroundPath.reset(); + mFullPath.op(mCutPath, Path.Op.DIFFERENCE); } else if (mState == STATE_AIRPLANE) { // Airplane mode is slashed, full-signal mForegroundPath.set(mFullPath); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 4d6fd9c136b5..714c287365b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -182,6 +182,7 @@ import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.Snoo import com.android.systemui.qs.QSFragment; import com.android.systemui.qs.QSPanel; import com.android.systemui.qs.QSTileHost; +import com.android.systemui.qs.car.CarQSFragment; import com.android.systemui.recents.Recents; import com.android.systemui.recents.ScreenPinningRequest; import com.android.systemui.recents.events.EventBus; @@ -1149,7 +1150,7 @@ public class StatusBar extends SystemUI implements DemoMode, ExtensionFragmentListener.attachExtensonToFragment(container, QS.TAG, R.id.qs_frame, Dependency.get(ExtensionController.class).newExtension(QS.class) .withPlugin(QS.class) - .withUiMode(UI_MODE_TYPE_CAR, () -> new QSFragment()) + .withUiMode(UI_MODE_TYPE_CAR, () -> new CarQSFragment()) .withDefault(() -> new QSFragment()) .build()); final QSTileHost qsh = SystemUIFactory.getInstance().createQSTileHost(mContext, this, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java index c2618cd5edaf..b79137ea68ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java @@ -262,7 +262,8 @@ public class ExtensionControllerImpl implements ExtensionController { public UiModeItem(int uiMode, Supplier<T> supplier) { mDesiredUiMode = uiMode; mSupplier = supplier; - mUiMode = mDefaultContext.getResources().getConfiguration().uiMode; + mUiMode = mDefaultContext.getResources().getConfiguration().uiMode + & Configuration.UI_MODE_TYPE_MASK; Dependency.get(ConfigurationController.class).addCallback(this); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index bd7fee0f7f52..b6c76551c48b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -341,6 +341,10 @@ public class MobileSignalController extends SignalController< } private boolean isRoaming() { + // During a carrier change, roaming indications need to be supressed. + if (isCarrierNetworkChangeActive()) { + return false; + } if (isCdma()) { final int iconMode = mServiceState.getCdmaEriIconMode(); return mServiceState.getCdmaEriIconIndex() != EriInfo.ROAMING_INDICATOR_OFF diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java index b7b991e36710..ba1e7c2d86c5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java @@ -62,6 +62,7 @@ public class AmbientState { private boolean mHasPulsingNotifications; private boolean mUnlockHintRunning; private boolean mQsCustomizerShowing; + private int mIntrinsicPadding; public AmbientState(Context context) { reload(context); @@ -323,4 +324,12 @@ public class AmbientState { public void setQsCustomizerShowing(boolean qsCustomizerShowing) { mQsCustomizerShowing = qsCustomizerShowing; } + + public void setIntrinsicPadding(int intrinsicPadding) { + mIntrinsicPadding = intrinsicPadding; + } + + public int getIntrinsicPadding() { + return mIntrinsicPadding; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index cbd315b940f3..41cde9c7dd5e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -2735,7 +2735,7 @@ public class NotificationStackScrollLayout extends ViewGroup return view.getHeight(); } - private int getPositionInLinearLayout(View requestedView) { + public int getPositionInLinearLayout(View requestedView) { ExpandableNotificationRow childInGroup = null; ExpandableNotificationRow requestedRow = null; if (isChildInGroup(requestedView)) { @@ -3650,6 +3650,7 @@ public class NotificationStackScrollLayout extends ViewGroup public void setIntrinsicPadding(int intrinsicPadding) { mIntrinsicPadding = intrinsicPadding; + mAmbientState.setIntrinsicPadding(intrinsicPadding); } public int getIntrinsicPadding() { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index 5d51a33c6307..eaad2f9bd457 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -43,6 +43,7 @@ import android.provider.Settings; import android.service.notification.Condition; import android.util.ArrayMap; import android.util.Log; +import android.view.accessibility.AccessibilityManager; import com.android.internal.annotations.GuardedBy; import com.android.systemui.Dumpable; @@ -122,6 +123,12 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa mReceiver.init(); mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); mHasVibrator = mVibrator != null && mVibrator.hasVibrator(); + + boolean accessibilityVolumeStreamActive = context.getSystemService( + AccessibilityManager.class).isAccessibilityVolumeStreamActive(); + mVolumeController.setA11yMode(accessibilityVolumeStreamActive ? + VolumePolicy.A11Y_MODE_INDEPENDENT_A11Y_VOLUME : + VolumePolicy.A11Y_MODE_MEDIA_A11Y_VOLUME); } public AudioManager getAudioManager() { @@ -210,6 +217,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa public void addCallback(Callbacks callback, Handler handler) { mCallbacks.add(callback, handler); + callback.onAccessibilityModeChanged(mShowA11yStream); } public void setUserActivityListener(UserActivityListener listener) { diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml index b12fd1c9ba89..9bb21808e9bc 100644 --- a/packages/SystemUI/tests/AndroidManifest.xml +++ b/packages/SystemUI/tests/AndroidManifest.xml @@ -48,7 +48,7 @@ android:process=":killable" /> </application> - <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner" + <instrumentation android:name="android.testing.TestableInstrumentation" android:targetPackage="com.android.systemui.tests" android:label="Tests for SystemUI"> </instrumentation> diff --git a/packages/SystemUI/tests/src/com/android/systemui/RoundedCornersTest.java b/packages/SystemUI/tests/src/com/android/systemui/RoundedCornersTest.java index 945af34c1df1..13ed2a25abf9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/RoundedCornersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/RoundedCornersTest.java @@ -21,7 +21,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -30,7 +29,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Fragment; -import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; import android.view.Display; @@ -53,7 +51,6 @@ import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidTestingRunner.class) -@FlakyTest @SmallTest public class RoundedCornersTest extends SysuiTestCase { @@ -72,6 +69,7 @@ public class RoundedCornersTest extends SysuiTestCase { mWindowManager = mock(WindowManager.class); mView = spy(new StatusBarWindowView(mContext, null)); when(mStatusBar.getStatusBarWindow()).thenReturn(mView); + when(mStatusBar.getNavigationBarWindow()).thenReturn(mView); mContext.putComponent(StatusBar.class, mStatusBar); Display display = mContext.getSystemService(WindowManager.class).getDefaultDisplay(); @@ -94,6 +92,8 @@ public class RoundedCornersTest extends SysuiTestCase { @Test public void testNoRounding() { mContext.getOrCreateTestableResources().addOverride(dimen.rounded_corner_radius, 0); + mContext.getOrCreateTestableResources() + .addOverride(dimen.rounded_corner_content_padding, 0); mRoundedCorners.start(); // No views added. @@ -105,8 +105,11 @@ public class RoundedCornersTest extends SysuiTestCase { } @Test + @Ignore public void testRounding() { mContext.getOrCreateTestableResources().addOverride(dimen.rounded_corner_radius, 20); + mContext.getOrCreateTestableResources() + .addOverride(dimen.rounded_corner_content_padding, 20); mRoundedCorners.start(); // Add 2 windows for rounded corners (top and bottom). diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java index 361a20fb7bdc..66d00dd6c5c6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java +++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java @@ -31,6 +31,8 @@ import android.util.Log; import org.junit.After; import org.junit.Before; import org.junit.Rule; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -56,10 +58,14 @@ public abstract class SysuiTestCase { mRealInstrumentation = InstrumentationRegistry.getInstrumentation(); Instrumentation inst = spy(mRealInstrumentation); - when(inst.getContext()).thenThrow(new RuntimeException( - "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext")); - when(inst.getTargetContext()).thenThrow(new RuntimeException( - "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext")); + when(inst.getContext()).thenAnswer(invocation -> { + throw new RuntimeException( + "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext"); + }); + when(inst.getTargetContext()).thenAnswer(invocation -> { + throw new RuntimeException( + "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext"); + }); InstrumentationRegistry.registerInstance(inst, InstrumentationRegistry.getArguments()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 2363b2aadc10..8641faca5d6e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -27,7 +27,6 @@ import android.app.Instrumentation; import android.os.Handler; import android.os.Looper; import android.support.test.InstrumentationRegistry; -import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java index b8e9fcd29096..bba982c3b060 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java @@ -26,8 +26,6 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; -import android.support.test.annotation.UiThreadTest; -import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -36,11 +34,10 @@ import android.testing.TestableLooper.RunWithLooper; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.annotations.ProvidesInterface; import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; +import com.android.systemui.plugins.annotations.ProvidesInterface; import com.android.systemui.plugins.PluginManagerImpl.PluginInstanceManagerFactory; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java index 6a85511daca2..ed47fbb89077 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java @@ -23,10 +23,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import org.junit.After; -import org.junit.Ignore; import android.support.test.filters.SmallTest; -import android.support.test.filters.FlakyTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -41,6 +38,7 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java index f4fda065860e..703b4d5e22ec 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterImplTest.java @@ -21,7 +21,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.support.test.filters.SmallTest; -import android.support.test.filters.FlakyTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -43,9 +42,9 @@ import org.junit.runner.RunWith; @RunWithLooper @SmallTest @Ignore("failing") -public class QSFooterTest extends LeakCheckedTest { +public class QSFooterImplTest extends LeakCheckedTest { - private QSFooter mFooter; + private QSFooterImpl mFooter; private ActivityStarter mActivityStarter; private DeviceProvisionedController mDeviceProvisionedController; @@ -55,9 +54,9 @@ public class QSFooterTest extends LeakCheckedTest { mActivityStarter = mDependency.injectMockDependency(ActivityStarter.class); mDeviceProvisionedController = mDependency.injectMockDependency( DeviceProvisionedController.class); - TestableLooper.get(this).runWithLooper(() -> { - mFooter = (QSFooter) LayoutInflater.from(mContext).inflate(R.layout.qs_footer, null); - }); + TestableLooper.get(this).runWithLooper( + () -> mFooter = (QSFooterImpl) LayoutInflater.from(mContext).inflate( + R.layout.qs_footer_impl, null)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java index 637b2440af09..85cdfcc2ce09 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java @@ -20,7 +20,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.support.test.filters.SmallTest; -import android.support.test.filters.FlakyTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -31,7 +30,6 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.qs.customize.QSCustomizer; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,7 +38,6 @@ import java.util.Collections; @RunWith(AndroidTestingRunner.class) @RunWithLooper @SmallTest -@FlakyTest public class QSPanelTest extends SysuiTestCase { private MetricsLogger mMetricsLogger; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java new file mode 100644 index 000000000000..4f87b02ed35f --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2017 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.systemui.qs.car; + +import static org.junit.Assert.assertNotNull; + +import android.content.Context; +import android.support.test.filters.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.LayoutInflaterBuilder; +import android.testing.TestableLooper; +import android.testing.TestableLooper.RunWithLooper; +import android.view.View; +import android.widget.FrameLayout; + +import com.android.keyguard.CarrierText; +import com.android.systemui.Dependency; +import com.android.systemui.SysuiBaseFragmentTest; +import com.android.systemui.statusbar.policy.Clock; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Tests for {@link CarQSFragment}. + */ +@RunWith(AndroidTestingRunner.class) +@RunWithLooper(setAsMainLooper = true) +@SmallTest +public class CarQsFragmentTest extends SysuiBaseFragmentTest { + public CarQsFragmentTest() { + super(CarQSFragment.class); + } + + @Before + public void initDependencies() { + mContext.addMockSystemService(Context.LAYOUT_INFLATER_SERVICE, + new LayoutInflaterBuilder(mContext) + .replace("com.android.systemui.statusbar.policy.SplitClockView", + FrameLayout.class) + .replace("TextClock", View.class) + .replace(CarrierText.class, View.class) + .replace(Clock.class, View.class) + .build()); + + mDependency.injectTestDependency(Dependency.BG_LOOPER, + TestableLooper.get(this).getLooper()); + } + + @Test + public void testLayoutInflation() { + CarQSFragment fragment = (CarQSFragment) mFragment; + mFragments.dispatchResume(); + + assertNotNull(fragment.getHeader()); + assertNotNull(fragment.getFooter()); + } + + @Test + public void testListening() { + CarQSFragment qs = (CarQSFragment) mFragment; + mFragments.dispatchResume(); + processAllMessages(); + + qs.setListening(true); + processAllMessages(); + + qs.setListening(false); + processAllMessages(); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java index 664ea710d61e..2f6511c8481e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java @@ -21,27 +21,21 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.View; +import com.android.systemui.SysuiTestCase; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; import com.android.systemui.statusbar.stack.NotificationChildrenContainer; -import com.android.systemui.SysuiTestCase; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @RunWith(AndroidJUnit4.class) -@FlakyTest public class ExpandableNotificationRowTest extends SysuiTestCase { private ExpandableNotificationRow mGroup; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java index 4dce2f5f87ed..436849c9d700 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java @@ -16,30 +16,25 @@ package com.android.systemui.statusbar; -import android.content.Context; -import android.support.test.InstrumentationRegistry; +import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; + import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.View; +import com.android.systemui.SysuiTestCase; + import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import static org.mockito.ArgumentMatchers.anyFloat; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; - -import com.android.systemui.SysuiTestCase; - @SmallTest @RunWith(AndroidJUnit4.class) -@FlakyTest public class NotificationContentViewTest extends SysuiTestCase { NotificationContentView mView; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java index d18e63bcc151..6e59d10aad3c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java @@ -16,10 +16,7 @@ package com.android.systemui.statusbar; -import android.content.Context; -import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.View; @@ -32,13 +29,11 @@ import com.android.systemui.statusbar.notification.NotificationViewWrapper; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @RunWith(AndroidJUnit4.class) -@FlakyTest public class NotificationCustomViewWrapperTest extends SysuiTestCase { private ExpandableNotificationRow mRow; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java index 630da2e7eabc..2a2acabc8cee 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java @@ -57,4 +57,10 @@ public class NotificationMenuRowTest extends LeakCheckedTest { row.createMenu(null, null); assertTrue(row.getMenuView() != null); } + + @Test + public void testResetUncreatedMenu() { + NotificationMenuRowPlugin row = new NotificationMenuRow(mContext); + row.resetMenu(); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index be3802bd68ed..cba9f77df2ff 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -494,6 +494,79 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { DEFAULT_ICON /* typeIcon */); } + @Test + public void testCarrierNetworkChange_roamingBeforeNetworkChange() { + int strength = SignalStrength.SIGNAL_STRENGTH_GREAT; + + setupDefaultSignal(); + setLevel(strength); + setGsmRoaming(true); + + // Verify baseline + verifyLastMobileDataIndicators(true /* visible */, + strength /* strengthIcon */, + DEFAULT_ICON /* typeIcon */, + true /* roaming */); + + // API call is made + setCarrierNetworkChange(true /* enabled */); + + // Carrier network change is true, show special indicator, no roaming. + verifyLastMobileDataIndicators(true /* visible */, + SignalDrawable.getCarrierChangeState(SignalStrength.NUM_SIGNAL_STRENGTH_BINS), + 0 /* typeIcon */, + false /* roaming */); + + // Revert back + setCarrierNetworkChange(false /* enabled */); + + // Verify back in previous state + verifyLastMobileDataIndicators(true /* visible */, + strength /* strengthIcon */, + DEFAULT_ICON /* typeIcon */, + true /* roaming */); + } + + @Test + public void testCarrierNetworkChange_roamingAfterNetworkChange() { + int strength = SignalStrength.SIGNAL_STRENGTH_GREAT; + + setupDefaultSignal(); + setLevel(strength); + + // Verify baseline + verifyLastMobileDataIndicators(true /* visible */, + strength /* strengthIcon */, + DEFAULT_ICON /* typeIcon */, + false /* roaming */); + + // API call is made + setCarrierNetworkChange(true /* enabled */); + + // Carrier network change is true, show special indicator, no roaming. + verifyLastMobileDataIndicators(true /* visible */, + SignalDrawable.getCarrierChangeState(SignalStrength.NUM_SIGNAL_STRENGTH_BINS), + 0 /* typeIcon */, + false /* roaming */); + + setGsmRoaming(true); + + // Roaming should not show. + verifyLastMobileDataIndicators(true /* visible */, + SignalDrawable.getCarrierChangeState(SignalStrength.NUM_SIGNAL_STRENGTH_BINS), + 0 /* typeIcon */, + false /* roaming */); + + // Revert back + setCarrierNetworkChange(false /* enabled */); + + // Verify back in previous state + verifyLastMobileDataIndicators(true /* visible */, + strength /* strengthIcon */, + DEFAULT_ICON /* typeIcon */, + true /* roaming */); + } + private void verifyEmergencyOnly(boolean isEmergencyOnly) { ArgumentCaptor<Boolean> emergencyOnly = ArgumentCaptor.forClass(Boolean.class); Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setEmergencyCallsOnly( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java index bc6833df1e30..5ac965cf4042 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java @@ -16,10 +16,6 @@ package com.android.systemui.statusbar.stack; -import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.annotation.UiThreadTest; -import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.NotificationHeaderView; @@ -31,13 +27,11 @@ import com.android.systemui.statusbar.NotificationTestHelper; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @RunWith(AndroidJUnit4.class) -@FlakyTest public class NotificationChildrenContainerTest extends SysuiTestCase { private ExpandableNotificationRow mGroup; diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java index 0a83a896dfaf..d1b1c5b9a066 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java @@ -14,7 +14,6 @@ package com.android.systemui.utils.leaks; -import android.content.Context; import android.testing.LeakCheck; import com.android.systemui.plugins.Plugin; diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 39ee6cf4a234..c6e3ed5f30ae 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -4153,11 +4153,42 @@ message MetricsEvent { // OS: O DR FIELD_PLUG_BATTERY_PERCENTAGE = 1024; + // Device Headset battery level on Plug + // CATEGORY: OTHER + // FIELD - The battery percentage when the user decided to plug in + // Type: integer + // OS: O DR + FIELD_UNPLUG_BATTERY_PERCENTAGE = 1025; + // Device Headset Pose status // CATEGORY: OTHER // SUBTYPE: 1 is 6DOF, 2 is 3DOF // OS: O DR - ACTION_HEADSET_POSE_STATUS = 1025; + ACTION_HEADSET_POSE_STATUS = 1026; + + // Device Headset Usage session time + // CATEGORY: OTHER + // FIELD - The time the headset was used in a session + // OS: O DR + FIELD_SESSION_TIME_MS = 1027; + + // Device Headset Idle time + // CATEGORY: OTHER + // FIELD - The time in between each session + // OS: O DR + FIELD_TIME_ELAPSED_BETWEEN_SESSION_MS = 1028; + + // Device Headset charge session time + // CATEGORY: OTHER + // FIELD - The time taken for each charge + // OS: O DR + FIELD_TIME_OF_CHARGE_MS = 1029; + + // Device Headset time between charge + // CATEGORY: OTHER + // FIELD - The time in between each charge + // OS: O DR + FIELD_TIME_ELAPSED_BETWEEN_CHARGE_MS = 1030; // Add new aosp constants above this line. // END OF AOSP CONSTANTS diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java index 9e4d89cbc9c5..0e42e6d6a83d 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityInputFilter.java @@ -271,6 +271,7 @@ class AccessibilityInputFilter extends InputFilter implements EventStreamTransfo private void processKeyEvent(EventStreamState state, KeyEvent event, int policyFlags) { if (!state.shouldProcessKeyEvent(event)) { + super.onInputEvent(event, policyFlags); return; } mEventHandler.onKeyEvent(event, policyFlags); diff --git a/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java b/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java index fe0611eef0a2..49f4b538448e 100644 --- a/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java +++ b/services/autofill/java/com/android/server/autofill/ui/OverlayControl.java @@ -21,6 +21,7 @@ import android.app.AppOpsManager; import android.content.Context; import android.os.Binder; import android.os.IBinder; +import android.os.UserHandle; /** * This class controls showing/hiding overlays. We don't @@ -47,10 +48,10 @@ class OverlayControl { private void setOverlayAllowed(boolean allowed) { if (mAppOpsManager != null) { - mAppOpsManager.setUserRestriction( - AppOpsManager.OP_SYSTEM_ALERT_WINDOW, !allowed, mToken); - mAppOpsManager.setUserRestriction( - AppOpsManager.OP_TOAST_WINDOW, !allowed, mToken); + mAppOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, !allowed, + mToken, null, UserHandle.USER_ALL); + mAppOpsManager.setUserRestrictionForUser(AppOpsManager.OP_TOAST_WINDOW, !allowed, + mToken, null, UserHandle.USER_ALL); } } } diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 56a66eb6b5fd..5c180f128901 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -5685,13 +5685,15 @@ public class BackupManagerService implements BackupManagerServiceInterface { PerformFullTransportBackupTask pftbt = null; synchronized (mQueueLock) { if (mRunningFullBackupTask != null) { - if (DEBUG_SCHEDULING) { - Slog.i(TAG, "Telling running backup to stop"); - } pftbt = mRunningFullBackupTask; } } - pftbt.handleCancel(true); + if (pftbt != null) { + if (DEBUG_SCHEDULING) { + Slog.i(TAG, "Telling running backup to stop"); + } + pftbt.handleCancel(true); + } } }; new Thread(endFullBackupRunnable, "end-full-backup").start(); diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 4810f4fe8c82..f47b0d3c6e73 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -383,7 +383,7 @@ public class CompanionDeviceManagerService extends SystemService implements Bind findDeviceCallback, getServiceCallback()); } catch (RemoteException e) { - throw new RuntimeException(e); + Log.e(LOG_TAG, "Error while initiating device discovery", e); } } diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index c8e6e2efb240..29f8a1130792 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -16,22 +16,6 @@ package com.android.server; -import java.io.File; -import java.io.FileDescriptor; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - import android.Manifest; import android.app.ActivityManager; import android.app.ActivityThread; @@ -42,6 +26,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.UserInfo; import android.media.AudioAttributes; import android.os.AsyncTask; import android.os.Binder; @@ -55,6 +40,7 @@ import android.os.ServiceManager; import android.os.ShellCallback; import android.os.ShellCommand; import android.os.UserHandle; +import android.os.UserManager; import android.os.storage.StorageManagerInternal; import android.util.ArrayMap; import android.util.ArraySet; @@ -66,8 +52,8 @@ import android.util.SparseIntArray; import android.util.TimeUtils; import android.util.Xml; -import com.android.internal.app.IAppOpsService; import com.android.internal.app.IAppOpsCallback; +import com.android.internal.app.IAppOpsService; import com.android.internal.os.Zygote; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; @@ -76,10 +62,27 @@ import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import libcore.util.EmptyArray; + import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + public class AppOpsService extends IAppOpsService.Stub { static final String TAG = "AppOps"; static final boolean DEBUG = false; @@ -2526,38 +2529,56 @@ public class AppOpsService extends IAppOpsService.Stub { perUserRestrictions = new SparseArray<>(); } - if (perUserRestrictions != null) { - boolean[] userRestrictions = perUserRestrictions.get(userId); - if (userRestrictions == null && restricted) { - userRestrictions = new boolean[AppOpsManager._NUM_OP]; - perUserRestrictions.put(userId, userRestrictions); - } - if (userRestrictions != null && userRestrictions[code] != restricted) { - userRestrictions[code] = restricted; - if (!restricted && isDefault(userRestrictions)) { - perUserRestrictions.remove(userId); - userRestrictions = null; - } - changed = true; + int[] users; + if (userId == UserHandle.USER_ALL) { + List<UserInfo> liveUsers = UserManager.get(mContext).getUsers(false); + + users = new int[liveUsers.size()]; + for (int i = 0; i < liveUsers.size(); i++) { + users[i] = liveUsers.get(i).id; } + } else { + users = new int[]{userId}; + } - if (userRestrictions != null) { - final boolean noExcludedPackages = ArrayUtils.isEmpty(excludedPackages); - if (perUserExcludedPackages == null && !noExcludedPackages) { - perUserExcludedPackages = new SparseArray<>(); + if (perUserRestrictions != null) { + int numUsers = users.length; + + for (int i = 0; i < numUsers; i++) { + int thisUserId = users[i]; + + boolean[] userRestrictions = perUserRestrictions.get(thisUserId); + if (userRestrictions == null && restricted) { + userRestrictions = new boolean[AppOpsManager._NUM_OP]; + perUserRestrictions.put(thisUserId, userRestrictions); } - if (perUserExcludedPackages != null && !Arrays.equals(excludedPackages, - perUserExcludedPackages.get(userId))) { - if (noExcludedPackages) { - perUserExcludedPackages.remove(userId); - if (perUserExcludedPackages.size() <= 0) { - perUserExcludedPackages = null; - } - } else { - perUserExcludedPackages.put(userId, excludedPackages); + if (userRestrictions != null && userRestrictions[code] != restricted) { + userRestrictions[code] = restricted; + if (!restricted && isDefault(userRestrictions)) { + perUserRestrictions.remove(thisUserId); + userRestrictions = null; } changed = true; } + + if (userRestrictions != null) { + final boolean noExcludedPackages = ArrayUtils.isEmpty(excludedPackages); + if (perUserExcludedPackages == null && !noExcludedPackages) { + perUserExcludedPackages = new SparseArray<>(); + } + if (perUserExcludedPackages != null && !Arrays.equals(excludedPackages, + perUserExcludedPackages.get(thisUserId))) { + if (noExcludedPackages) { + perUserExcludedPackages.remove(thisUserId); + if (perUserExcludedPackages.size() <= 0) { + perUserExcludedPackages = null; + } + } else { + perUserExcludedPackages.put(thisUserId, excludedPackages); + } + changed = true; + } + } } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 224845ce68b8..98389a663f5e 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2973,12 +2973,16 @@ public class ConnectivityService extends IConnectivityManager.Stub return mTethering.getTetheredDhcpRanges(); } + @Override + public boolean isTetheringSupported(String callerPkg) { + ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg); + return isTetheringSupported(); + } + // if ro.tether.denied = true we default to no tethering // gservices could set the secure setting to 1 though to enable it on a build where it // had previously been turned off. - @Override - public boolean isTetheringSupported() { - enforceTetherAccessPermission(); + private boolean isTetheringSupported() { int defaultVal = encodeBool(!mSystemProperties.get("ro.tether.denied").equals("true")); boolean tetherSupported = toBool(Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.TETHER_SUPPORTED, defaultVal)); @@ -5380,6 +5384,7 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public String getCaptivePortalServerUrl() { + enforceConnectivityInternalPermission(); return NetworkMonitor.getCaptivePortalServerHttpUrl(mContext); } diff --git a/services/core/java/com/android/server/RescueParty.java b/services/core/java/com/android/server/RescueParty.java index 3b36c3c0d2bc..1924a861e002 100644 --- a/services/core/java/com/android/server/RescueParty.java +++ b/services/core/java/com/android/server/RescueParty.java @@ -55,6 +55,7 @@ public class RescueParty { private static final String PROP_RESCUE_LEVEL = "sys.rescue_level"; private static final String PROP_RESCUE_BOOT_COUNT = "sys.rescue_boot_count"; private static final String PROP_RESCUE_BOOT_START = "sys.rescue_boot_start"; + private static final String PROP_VIRTUAL_DEVICE = "ro.hardware.virtual_device"; private static final int LEVEL_NONE = 0; private static final int LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS = 1; @@ -336,6 +337,10 @@ public class RescueParty { * a good proxy for someone doing local development work. */ private static boolean isUsbActive() { + if (SystemProperties.getBoolean(PROP_VIRTUAL_DEVICE, false)) { + Slog.v(TAG, "Assuming virtual device is connected over USB"); + return true; + } try { final String state = FileUtils .readTextFile(new File("/sys/class/android_usb/android0/state"), 128, ""); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index de853df85139..209c6be5dea8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.CHANGE_CONFIGURATION; import static android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST; import static android.Manifest.permission.INTERACT_ACROSS_USERS; import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; +import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import static android.Manifest.permission.READ_FRAME_BUFFER; import static android.Manifest.permission.START_TASKS_FROM_RECENTS; @@ -507,8 +508,6 @@ public class ActivityManagerService extends IActivityManager.Stub static final String SYSTEM_DEBUGGABLE = "ro.debuggable"; - static final boolean IS_USER_BUILD = "user".equals(Build.TYPE); - // Amount of time after a call to stopAppSwitches() during which we will // prevent further untrusted switches from happening. static final long APP_SWITCH_DELAY_TIME = 5*1000; @@ -5730,7 +5729,7 @@ public class ActivityManagerService extends IActivityManager.Stub } final void logAppTooSlow(ProcessRecord app, long startTime, String msg) { - if (true || IS_USER_BUILD) { + if (true || Build.IS_USER) { return; } String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null); @@ -6719,10 +6718,6 @@ public class ActivityManagerService extends IActivityManager.Stub mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); - if (app.isolated) { - mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); - getPackageManagerInternalLocked().removeIsolatedUid(app.uid); - } boolean willRestart = false; if (app.persistent && !app.isolated) { if (!callerWillRestart) { @@ -6732,6 +6727,10 @@ public class ActivityManagerService extends IActivityManager.Stub } } app.kill(reason, true); + if (app.isolated) { + mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); + getPackageManagerInternalLocked().removeIsolatedUid(app.uid); + } handleAppDiedLocked(app, willRestart, allowRestart); if (willRestart) { removeLruProcessLocked(app); @@ -6771,14 +6770,14 @@ public class ActivityManagerService extends IActivityManager.Stub mHeavyWeightProcess = null; } mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); - if (app.isolated) { - mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); - } // Take care of any launching providers waiting for this process. cleanupAppInLaunchingProvidersLocked(app, true); // Take care of any services that are waiting for the process. mServices.processStartTimedOutLocked(app); app.kill("start timeout", true); + if (app.isolated) { + mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); + } removeLruProcessLocked(app); if (mBackupTarget != null && mBackupTarget.app.pid == pid) { Slog.w(TAG, "Unattached app died before backup, skipping"); @@ -10322,7 +10321,7 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void moveStackToDisplay(int stackId, int displayId) { - enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "moveStackToDisplay()"); + enforceCallingPermission(INTERNAL_SYSTEM_WINDOW, "moveStackToDisplay()"); synchronized (this) { final long ident = Binder.clearCallingIdentity(); @@ -12592,7 +12591,6 @@ public class ActivityManagerService extends IActivityManager.Stub Binder.restoreCallingIdentity(ident); } } - closeSystemDialogs("setLockScreenShown"); } @Override @@ -14540,7 +14538,7 @@ public class ActivityManagerService extends IActivityManager.Stub final ProcessRecord r = handleApplicationWtfInner(callingUid, callingPid, app, tag, crashInfo); - final boolean isFatal = "eng".equals(Build.TYPE) || Settings.Global + final boolean isFatal = Build.IS_ENG || Settings.Global .getInt(mContext.getContentResolver(), Settings.Global.WTF_IS_FATAL, 0) != 0; final boolean isSystem = (r == null) || r.persistent; @@ -20587,7 +20585,7 @@ public class ActivityManagerService extends IActivityManager.Stub && config.navigation == Configuration.NAVIGATION_NONAV); int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK; final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR - && !(modeType == Configuration.UI_MODE_TYPE_WATCH && "user".equals(Build.TYPE)) + && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER) && modeType != Configuration.UI_MODE_TYPE_TELEVISION && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET); return inputMethodExists && uiModeSupportsDialogs; @@ -24150,7 +24148,7 @@ public class ActivityManagerService extends IActivityManager.Stub record.networkStateLock.wait(mWaitForNetworkTimeoutMs); record.waitingForNetwork = false; final long totalTime = SystemClock.uptimeMillis() - startTime; - if (totalTime >= mWaitForNetworkTimeoutMs) { + if (totalTime >= mWaitForNetworkTimeoutMs || DEBUG_NETWORK) { Slog.wtf(TAG_NETWORK, "Total time waited for network rules to get updated: " + totalTime + ". Uid: " + callingUid + " procStateSeq: " + procStateSeq + " UidRec: " + record diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 68f4d0d99f93..c7cac3be5bc9 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -91,7 +91,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_THUMBNAIL import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; -import static com.android.server.am.ActivityManagerService.IS_USER_BUILD; import static com.android.server.am.ActivityManagerService.TAKE_FULLSCREEN_SCREENSHOTS; import static com.android.server.am.ActivityStack.ActivityState.DESTROYED; import static com.android.server.am.ActivityStack.ActivityState.DESTROYING; @@ -1801,7 +1800,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } void startLaunchTickingLocked() { - if (IS_USER_BUILD) { + if (Build.IS_USER) { return; } if (launchTickTime == 0) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 1ccac1b8dc8a..e0f2a751604a 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -16,6 +16,7 @@ package com.android.server.am; +import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; import static android.Manifest.permission.START_ANY_ACTIVITY; import static android.Manifest.permission.START_TASKS_FROM_RECENTS; @@ -38,11 +39,13 @@ import static android.app.ITaskStackListener.FORCED_RESIZEABLE_REASON_SPLIT_SCRE import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.os.Process.SYSTEM_UID; import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.FLAG_PRIVATE; import static android.view.Display.INVALID_DISPLAY; import static android.view.Display.REMOVE_MODE_DESTROY_CONTENT; +import static android.view.Display.TYPE_VIRTUAL; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; @@ -1694,6 +1697,24 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return false; } + // Check if the caller can manage activity stacks. + final int startAnyPerm = mService.checkPermission(INTERNAL_SYSTEM_WINDOW, callingPid, + callingUid); + if (startAnyPerm == PERMISSION_GRANTED) { + if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" + + " allow launch any on display"); + return true; + } + + if (activityDisplay.mDisplay.getType() == TYPE_VIRTUAL + && activityDisplay.mDisplay.getOwnerUid() != SYSTEM_UID) { + // Limit launching on virtual displays, because their contents can be read from Surface + // by apps that created them. + if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" + + " disallow launch on virtual display for not-embedded activity"); + return false; + } + if (!activityDisplay.isPrivate()) { // Anyone can launch on a public display. if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" @@ -1715,15 +1736,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D return true; } - // Check if the caller can manage activity stacks. - final int startAnyPerm = mService.checkPermission(MANAGE_ACTIVITY_STACKS, callingPid, - callingUid); - if (startAnyPerm == PERMISSION_GRANTED) { - if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check:" - + " allow launch any on display"); - return true; - } - Slog.w(TAG, "Launch on display check: denied"); return false; } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index a145435976fa..a31c33e4ab91 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -17,6 +17,7 @@ package com.android.server.am; import static android.app.Activity.RESULT_CANCELED; +import static android.app.ActivityManager.START_ABORTED; import static android.app.ActivityManager.START_CANCELED; import static android.app.ActivityManager.START_CLASS_NOT_FOUND; import static android.app.ActivityManager.START_DELIVERED_TO_TOP; @@ -279,7 +280,9 @@ class ActivityStarter { // mLastStartActivityRecord[0] is set in the call to startActivity above. outActivity[0] = mLastStartActivityRecord[0]; } - return mLastStartActivityResult; + + // Aborted results are treated as successes externally, but we must track them internally. + return mLastStartActivityResult != START_ABORTED ? mLastStartActivityResult : START_SUCCESS; } /** DO NOT call this method directly. Use {@link #startActivityLocked} instead. */ @@ -465,7 +468,7 @@ class ActivityStarter { // We pretend to the caller that it was really started, but // they will just get a cancel result. ActivityOptions.abort(options); - return START_SUCCESS; + return START_ABORTED; } // If permissions need a review before any of the app components can run, we diff --git a/services/core/java/com/android/server/am/AppErrorDialog.java b/services/core/java/com/android/server/am/AppErrorDialog.java index c9c1d005a85a..51ce30ef08f3 100644 --- a/services/core/java/com/android/server/am/AppErrorDialog.java +++ b/services/core/java/com/android/server/am/AppErrorDialog.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -32,8 +33,6 @@ import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.TextView; -import static com.android.server.am.ActivityManagerService.IS_USER_BUILD; - final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListener { private final ActivityManagerService mService; @@ -124,7 +123,7 @@ final class AppErrorDialog extends BaseErrorDialog implements View.OnClickListen close.setVisibility(!hasRestart ? View.VISIBLE : View.GONE); close.setOnClickListener(this); - boolean showMute = !IS_USER_BUILD && Settings.Global.getInt(context.getContentResolver(), + boolean showMute = !Build.IS_USER && Settings.Global.getInt(context.getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; final TextView mute = findViewById(com.android.internal.R.id.aerr_mute); mute.setOnClickListener(this); diff --git a/services/core/java/com/android/server/am/AppNotRespondingDialog.java b/services/core/java/com/android/server/am/AppNotRespondingDialog.java index a3a67784fadc..d9c6a3023903 100644 --- a/services/core/java/com/android/server/am/AppNotRespondingDialog.java +++ b/services/core/java/com/android/server/am/AppNotRespondingDialog.java @@ -35,8 +35,6 @@ import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.TextView; -import static com.android.server.am.ActivityManagerService.IS_USER_BUILD; - final class AppNotRespondingDialog extends BaseErrorDialog implements View.OnClickListener { private static final String TAG = "AppNotRespondingDialog"; diff --git a/services/core/java/com/android/server/am/UriPermission.java b/services/core/java/com/android/server/am/UriPermission.java index 0aa54d910ea7..90577e33f5ae 100644 --- a/services/core/java/com/android/server/am/UriPermission.java +++ b/services/core/java/com/android/server/am/UriPermission.java @@ -17,6 +17,7 @@ package com.android.server.am; import android.content.Intent; +import android.os.Binder; import android.os.UserHandle; import android.util.ArraySet; import android.util.Log; @@ -101,7 +102,8 @@ final class UriPermission { Slog.d(TAG, "Permission for " + targetPkg + " to " + uri + " is changing from 0x" + Integer.toHexString(oldModeFlags) + " to 0x" - + Integer.toHexString(modeFlags), + + Integer.toHexString(modeFlags) + " via calling UID " + + Binder.getCallingUid() + " PID " + Binder.getCallingPid(), new Throwable()); } } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 2b8ac0d4e68e..405ee323bbe1 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -1499,8 +1499,7 @@ final class UserController { } } - // One way or another, we're running! - return true; + return state.state != UserState.STATE_STOPPING && state.state != UserState.STATE_SHUTDOWN; } UserInfo getCurrentUser() { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index c6307a793e34..7eee3e4caa15 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -239,6 +239,7 @@ public class AudioService extends IAudioService.Stub private static final int MSG_SET_A2DP_SRC_CONNECTION_STATE = 101; private static final int MSG_SET_A2DP_SINK_CONNECTION_STATE = 102; private static final int MSG_A2DP_DEVICE_CONFIG_CHANGE = 103; + private static final int MSG_DISABLE_AUDIO_FOR_UID = 104; // end of messages handled under wakelock private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000; @@ -4873,6 +4874,12 @@ public class AudioService extends IAudioService.Stub mAudioEventWakeLock.release(); break; + case MSG_DISABLE_AUDIO_FOR_UID: + mPlaybackMonitor.disableAudioForUid( msg.arg1 == 1 /* disable */, + msg.arg2 /* uid */); + mAudioEventWakeLock.release(); + break; + case MSG_REPORT_NEW_ROUTES: { int N = mRoutesObservers.beginBroadcast(); if (N > 0) { @@ -6595,6 +6602,13 @@ public class AudioService extends IAudioService.Stub } } } + + @Override + public void disableAudioForUid(boolean disable, int uid) { + queueMsgUnderWakeLock(mAudioHandler, MSG_DISABLE_AUDIO_FOR_UID, + disable ? 1 : 0 /* arg1 */, uid /* arg2 */, + null /* obj */, 0 /* delay */); + } } //========================================================================================== diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index 702cbbed17de..663559f59eec 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -29,6 +29,8 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Log; +import com.android.internal.util.ArrayUtils; + import java.io.PrintWriter; import java.text.DateFormat; import java.util.ArrayList; @@ -67,6 +69,12 @@ public final class PlaybackActivityMonitor .createIfNeeded() .build(); + // TODO support VolumeShaper on those players + private static final int[] UNDUCKABLE_PLAYER_TYPES = { + AudioPlaybackConfiguration.PLAYER_TYPE_AAUDIO, + AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL, + }; + // like a PLAY_CREATE_IF_NEEDED operation but with a skip to the end of the ramp private static final VolumeShaper.Operation PLAY_SKIP_RAMP = new VolumeShaper.Operation.Builder(PLAY_CREATE_IF_NEEDED).setXOffset(1.0f).build(); @@ -87,6 +95,43 @@ public final class PlaybackActivityMonitor } //================================================================= + private final ArrayList<Integer> mBannedUids = new ArrayList<Integer>(); + + // see AudioManagerInternal.disableAudioForUid(boolean disable, int uid) + public void disableAudioForUid(boolean disable, int uid) { + synchronized(mPlayerLock) { + final int index = mBannedUids.indexOf(new Integer(uid)); + if (index >= 0) { + if (!disable) { + mBannedUids.remove(index); + // nothing else to do, future playback requests from this uid are ok + } // no else to handle, uid already present, so disabling again is no-op + } else { + if (disable) { + for (AudioPlaybackConfiguration apc : mPlayers.values()) { + checkBanPlayer(apc, uid); + } + mBannedUids.add(new Integer(uid)); + } // no else to handle, uid already not in list, so enabling again is no-op + } + } + } + + private boolean checkBanPlayer(@NonNull AudioPlaybackConfiguration apc, int uid) { + final boolean toBan = (apc.getClientUid() == uid); + if (toBan) { + final int piid = apc.getPlayerInterfaceId(); + try { + Log.v(TAG, "banning player " + piid + " uid:" + uid); + apc.getPlayerProxy().pause(); + } catch (Exception e) { + Log.e(TAG, "error banning player " + piid + " uid:" + uid, e); + } + } + return toBan; + } + + //================================================================= // Track players and their states // methods playerAttributes, playerEvent, releasePlayer are all oneway calls // into AudioService. They trigger synchronous dispatchPlaybackChange() which updates @@ -129,6 +174,14 @@ public final class PlaybackActivityMonitor if (apc == null) { return; } + if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) { + for (Integer uidInteger: mBannedUids) { + if (checkBanPlayer(apc, uidInteger.intValue())) { + // player was banned, do not update its state + return; + } + } + } if (apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) { // FIXME SoundPool not ready for state reporting return; @@ -178,10 +231,17 @@ public final class PlaybackActivityMonitor pw.println("\n ducked players:"); mDuckingManager.dump(pw); // players muted due to the device ringing or being in a call - pw.println("\n muted player piids:"); + pw.print("\n muted player piids:"); for (int piid : mMutedPlayers) { - pw.println(" " + piid); + pw.print(" " + piid); + } + pw.println(); + // banned players: + pw.print("\n banned uids:"); + for (int uid : mBannedUids) { + pw.print(" " + uid); } + pw.println(); } } @@ -298,12 +358,12 @@ public final class PlaybackActivityMonitor + " uid:" + apc.getClientUid() + " pid:" + apc.getClientPid() + " - SPEECH"); return false; - } else if (apc.getPlayerType() - == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) { - // TODO support ducking of SoundPool players + } else if (ArrayUtils.contains(UNDUCKABLE_PLAYER_TYPES, apc.getPlayerType())) { Log.v(TAG, "not ducking player " + apc.getPlayerInterfaceId() + " uid:" + apc.getClientUid() + " pid:" + apc.getClientPid() - + " - SoundPool"); + + " due to type:" + + AudioPlaybackConfiguration.toLogFriendlyPlayerType( + apc.getPlayerType())); return false; } apcsToDuck.add(apc); diff --git a/services/core/java/com/android/server/audio/RotationHelper.java b/services/core/java/com/android/server/audio/RotationHelper.java index 359cc360bbc7..ad20ed895805 100644 --- a/services/core/java/com/android/server/audio/RotationHelper.java +++ b/services/core/java/com/android/server/audio/RotationHelper.java @@ -17,15 +17,13 @@ package com.android.server.audio; import android.content.Context; +import android.hardware.display.DisplayManager; import android.media.AudioSystem; import android.os.Handler; import android.util.Log; -import android.view.OrientationEventListener; import android.view.Surface; import android.view.WindowManager; -import com.android.server.policy.WindowOrientationListener; - /** * Class to handle device rotation events for AudioService, and forward device rotation * to the audio HALs through AudioSystem. @@ -42,18 +40,17 @@ class RotationHelper { private static final String TAG = "AudioService.RotationHelper"; - private static AudioOrientationListener sOrientationListener; - private static AudioWindowOrientationListener sWindowOrientationListener; + private static AudioDisplayListener sDisplayListener; private static final Object sRotationLock = new Object(); private static int sDeviceRotation = Surface.ROTATION_0; // R/W synchronized on sRotationLock private static Context sContext; + private static Handler sHandler; /** * post conditions: - * - (sWindowOrientationListener != null) xor (sOrientationListener != null) - * - sWindowOrientationListener xor sOrientationListener is enabled + * - sDisplayListener != null * - sContext != null */ static void init(Context context, Handler handler) { @@ -61,34 +58,20 @@ class RotationHelper { throw new IllegalArgumentException("Invalid null context"); } sContext = context; - sWindowOrientationListener = new AudioWindowOrientationListener(context, handler); - sWindowOrientationListener.enable(); - if (!sWindowOrientationListener.canDetectOrientation()) { - // cannot use com.android.server.policy.WindowOrientationListener, revert to public - // orientation API - Log.i(TAG, "Not using WindowOrientationListener, reverting to OrientationListener"); - sWindowOrientationListener.disable(); - sWindowOrientationListener = null; - sOrientationListener = new AudioOrientationListener(context); - sOrientationListener.enable(); - } + sHandler = handler; + sDisplayListener = new AudioDisplayListener(); + enable(); } static void enable() { - if (sWindowOrientationListener != null) { - sWindowOrientationListener.enable(); - } else { - sOrientationListener.enable(); - } + ((DisplayManager) sContext.getSystemService(Context.DISPLAY_SERVICE)) + .registerDisplayListener(sDisplayListener, sHandler); updateOrientation(); } static void disable() { - if (sWindowOrientationListener != null) { - sWindowOrientationListener.disable(); - } else { - sOrientationListener.disable(); - } + ((DisplayManager) sContext.getSystemService(Context.DISPLAY_SERVICE)) + .unregisterDisplayListener(sDisplayListener); } /** @@ -128,84 +111,21 @@ class RotationHelper { } /** - * Uses android.view.OrientationEventListener + * Uses android.hardware.display.DisplayManager.DisplayListener */ - final static class AudioOrientationListener extends OrientationEventListener { - AudioOrientationListener(Context context) { - super(context); - } + final static class AudioDisplayListener implements DisplayManager.DisplayListener { @Override - public void onOrientationChanged(int orientation) { - updateOrientation(); + public void onDisplayAdded(int displayId) { } - } - /** - * Uses com.android.server.policy.WindowOrientationListener - */ - final static class AudioWindowOrientationListener extends WindowOrientationListener { - private static RotationCheckThread sRotationCheckThread; - - AudioWindowOrientationListener(Context context, Handler handler) { - super(context, handler); + @Override + public void onDisplayRemoved(int displayId) { } - public void onProposedRotationChanged(int rotation) { + @Override + public void onDisplayChanged(int displayId) { updateOrientation(); - if (sRotationCheckThread != null) { - sRotationCheckThread.endCheck(); - } - sRotationCheckThread = new RotationCheckThread(); - sRotationCheckThread.beginCheck(); - } - } - - /** - * When com.android.server.policy.WindowOrientationListener report an orientation change, - * the UI may not have rotated yet. This thread polls with gradually increasing delays - * the new orientation. - */ - final static class RotationCheckThread extends Thread { - // how long to wait between each rotation check - private final int[] WAIT_TIMES_MS = { 10, 20, 50, 100, 100, 200, 200, 500 }; - private int mWaitCounter; - private final Object mCounterLock = new Object(); - - RotationCheckThread() { - super("RotationCheck"); - } - - void beginCheck() { - synchronized(mCounterLock) { - mWaitCounter = 0; - } - try { - start(); - } catch (IllegalStateException e) { } - } - - void endCheck() { - synchronized(mCounterLock) { - mWaitCounter = WAIT_TIMES_MS.length; - } - } - - public void run() { - while (mWaitCounter < WAIT_TIMES_MS.length) { - int waitTimeMs; - synchronized(mCounterLock) { - waitTimeMs = mWaitCounter < WAIT_TIMES_MS.length ? - WAIT_TIMES_MS[mWaitCounter] : 0; - mWaitCounter++; - } - try { - if (waitTimeMs > 0) { - sleep(waitTimeMs); - updateOrientation(); - } - } catch (InterruptedException e) { } - } } } }
\ No newline at end of file diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index 8129f450a85b..ab3aff99937d 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -1221,6 +1221,18 @@ public final class DisplayManagerService extends SystemService { } } + @VisibleForTesting + DisplayDeviceInfo getDisplayDeviceInfoInternal(int displayId) { + synchronized (mSyncRoot) { + LogicalDisplay display = mLogicalDisplays.get(displayId); + if (display != null) { + DisplayDevice displayDevice = display.getPrimaryDisplayDeviceLocked(); + return displayDevice.getDisplayDeviceInfoLocked(); + } + return null; + } + } + private final class DisplayManagerHandler extends Handler { public DisplayManagerHandler(Looper looper) { super(looper, null, true /*async*/); diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java index 9d3021af1ac2..d6ab88813f4d 100644 --- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java +++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java @@ -23,6 +23,7 @@ import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESE import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SECURE; import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH; +import static android.hardware.display.DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT; import android.content.Context; import android.hardware.display.IVirtualDisplayCallback; @@ -359,6 +360,10 @@ public class VirtualDisplayAdapter extends DisplayAdapter { if ((mFlags & VIRTUAL_DISPLAY_FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD) != 0) { mInfo.flags |= DisplayDeviceInfo.FLAG_CAN_SHOW_WITH_INSECURE_KEYGUARD; } + if ((mFlags & VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT) != 0) { + mInfo.flags |= DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT; + } + mInfo.type = Display.TYPE_VIRTUAL; mInfo.touch = ((mFlags & VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH) == 0) ? DisplayDeviceInfo.TOUCH_NONE : DisplayDeviceInfo.TOUCH_VIRTUAL; diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java index 5339bac8b030..370e569f2598 100644 --- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java +++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java @@ -79,7 +79,7 @@ public abstract class AuthenticationClient extends ClientMonitor { } if (!authenticated) { if (receiver != null) { - FingerprintUtils.vibrateFingerprintError(getContext()); + vibrateError(); } // allow system-defined limit of number of attempts before giving up int lockoutMode = handleFailedAttempt(); @@ -99,7 +99,7 @@ public abstract class AuthenticationClient extends ClientMonitor { result |= lockoutMode != LOCKOUT_NONE; // in a lockout mode } else { if (receiver != null) { - FingerprintUtils.vibrateFingerprintSuccess(getContext()); + vibrateSuccess(); } result |= true; // we have a valid fingerprint, done resetFailedAttempts(); diff --git a/services/core/java/com/android/server/fingerprint/ClientMonitor.java b/services/core/java/com/android/server/fingerprint/ClientMonitor.java index 1a2e1443d329..3eae157c53aa 100644 --- a/services/core/java/com/android/server/fingerprint/ClientMonitor.java +++ b/services/core/java/com/android/server/fingerprint/ClientMonitor.java @@ -23,6 +23,8 @@ import android.hardware.fingerprint.FingerprintManager; import android.hardware.fingerprint.IFingerprintServiceReceiver; import android.os.IBinder; import android.os.RemoteException; +import android.os.VibrationEffect; +import android.os.Vibrator; import android.util.Slog; import java.util.NoSuchElementException; @@ -36,14 +38,18 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { protected static final String TAG = FingerprintService.TAG; // TODO: get specific name protected static final int ERROR_ESRCH = 3; // Likely fingerprint HAL is dead. See errno.h. protected static final boolean DEBUG = FingerprintService.DEBUG; + private static final long[] DEFAULT_SUCCESS_VIBRATION_PATTERN = new long[] {0, 30}; + private final Context mContext; + private final long mHalDeviceId; + private final int mTargetUserId; + private final int mGroupId; + // True if client does not have MANAGE_FINGERPRINT permission + private final boolean mIsRestricted; + private final String mOwner; + private final VibrationEffect mSuccessVibrationEffect; + private final VibrationEffect mErrorVibrationEffect; private IBinder mToken; private IFingerprintServiceReceiver mReceiver; - private int mTargetUserId; - private int mGroupId; - private boolean mIsRestricted; // True if client does not have MANAGE_FINGERPRINT permission - private String mOwner; - private Context mContext; - private long mHalDeviceId; protected boolean mAlreadyCancelled; /** @@ -68,6 +74,8 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { mGroupId = groupId; mIsRestricted = restricted; mOwner = owner; + mSuccessVibrationEffect = getSuccessVibrationEffect(context); + mErrorVibrationEffect = VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK); try { if (token != null) { token.linkToDeath(this, 0); @@ -79,7 +87,7 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { /** * Contacts fingerprint HAL to start the client. - * @return 0 on succes, errno from driver on failure + * @return 0 on success, errno from driver on failure */ public abstract int start(); @@ -211,4 +219,39 @@ public abstract class ClientMonitor implements IBinder.DeathRecipient { public final IBinder getToken() { return mToken; } + + public final void vibrateSuccess() { + Vibrator vibrator = mContext.getSystemService(Vibrator.class); + if (vibrator != null) { + vibrator.vibrate(mSuccessVibrationEffect); + } + } + + public final void vibrateError() { + Vibrator vibrator = mContext.getSystemService(Vibrator.class); + if (vibrator != null) { + vibrator.vibrate(mErrorVibrationEffect); + } + } + + private static VibrationEffect getSuccessVibrationEffect(Context ctx) { + int[] arr = ctx.getResources().getIntArray( + com.android.internal.R.array.config_longPressVibePattern); + final long[] vibePattern; + if (arr == null || arr.length == 0) { + vibePattern = DEFAULT_SUCCESS_VIBRATION_PATTERN; + } else { + vibePattern = new long[arr.length]; + for (int i = 0; i < arr.length; i++) { + vibePattern[i] = arr[i]; + } + } + if (vibePattern.length == 1) { + return VibrationEffect.createOneShot( + vibePattern[0], VibrationEffect.DEFAULT_AMPLITUDE); + } else { + return VibrationEffect.createWaveform(vibePattern, -1); + } + } + } diff --git a/services/core/java/com/android/server/fingerprint/EnrollClient.java b/services/core/java/com/android/server/fingerprint/EnrollClient.java index 61708946f806..c9efcf2fd687 100644 --- a/services/core/java/com/android/server/fingerprint/EnrollClient.java +++ b/services/core/java/com/android/server/fingerprint/EnrollClient.java @@ -65,7 +65,7 @@ public abstract class EnrollClient extends ClientMonitor { if (receiver == null) return true; // client not listening - FingerprintUtils.vibrateFingerprintSuccess(getContext()); + vibrateSuccess(); MetricsLogger.action(getContext(), MetricsEvent.ACTION_FINGERPRINT_ENROLL); try { receiver.onEnrollResult(getHalDeviceId(), fpId, groupId, remaining); diff --git a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java b/services/core/java/com/android/server/fingerprint/FingerprintUtils.java index 49dc8e4dac71..5fbd735d4ac5 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintUtils.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintUtils.java @@ -18,7 +18,6 @@ package com.android.server.fingerprint; import android.content.Context; import android.hardware.fingerprint.Fingerprint; -import android.os.Vibrator; import android.text.TextUtils; import android.util.SparseArray; @@ -31,9 +30,6 @@ import java.util.List; */ public class FingerprintUtils { - private static final long[] FP_ERROR_VIBRATE_PATTERN = new long[] {0, 30, 100, 30}; - private static final long[] FP_SUCCESS_VIBRATE_PATTERN = new long[] {0, 30}; - private static final Object sInstanceLock = new Object(); private static FingerprintUtils sInstance; @@ -72,20 +68,6 @@ public class FingerprintUtils { getStateForUser(ctx, userId).renameFingerprint(fingerId, name); } - public static void vibrateFingerprintError(Context context) { - Vibrator vibrator = context.getSystemService(Vibrator.class); - if (vibrator != null) { - vibrator.vibrate(FP_ERROR_VIBRATE_PATTERN, -1); - } - } - - public static void vibrateFingerprintSuccess(Context context) { - Vibrator vibrator = context.getSystemService(Vibrator.class); - if (vibrator != null) { - vibrator.vibrate(FP_SUCCESS_VIBRATE_PATTERN, -1); - } - } - private FingerprintsUserState getStateForUser(Context ctx, int userId) { synchronized (this) { FingerprintsUserState state = mUsers.get(userId); diff --git a/services/core/java/com/android/server/hdmi/HdmiLogger.java b/services/core/java/com/android/server/hdmi/HdmiLogger.java index 537df815e3a2..ebe52c0dfbf0 100644 --- a/services/core/java/com/android/server/hdmi/HdmiLogger.java +++ b/services/core/java/com/android/server/hdmi/HdmiLogger.java @@ -44,7 +44,6 @@ final class HdmiLogger { private static final long ERROR_LOG_DURATTION_MILLIS = 20 * 1000; // 20s private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static final boolean IS_USER_BUILD = "user".equals(Build.TYPE); private static final ThreadLocal<HdmiLogger> sLogger = new ThreadLocal<>(); diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index fe2c5bd87df4..c1e820c9b787 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -142,6 +142,7 @@ public class LockSettingsService extends ILockSettings.Stub { private static final int SYNTHETIC_PASSWORD_ENABLED_BY_DEFAULT = 1; // Order of holding lock: mSeparateChallengeLock -> mSpManager -> this + // Do not call into ActivityManager while holding mSpManager lock. private final Object mSeparateChallengeLock = new Object(); private final DeviceProvisionedObserver mDeviceProvisionedObserver = @@ -1434,16 +1435,14 @@ public class LockSettingsService extends ILockSettings.Stub { Slog.e(TAG, "FRP credential can only be verified prior to provisioning."); return VerifyCredentialResponse.ERROR; } - synchronized (mSpManager) { - if (isSyntheticPasswordBasedCredentialLocked(userId)) { - VerifyCredentialResponse response = spBasedDoVerifyCredentialLocked(credential, - credentialType, hasChallenge, challenge, userId, progressCallback); - if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { - mStrongAuth.reportSuccessfulStrongAuthUnlock(userId); - } - return response; - } + VerifyCredentialResponse response = null; + response = spBasedDoVerifyCredential(credential, credentialType, hasChallenge, challenge, + userId, progressCallback); + // The user employs synthetic password based credential. + if (response != null) { + return response; } + final CredentialHash storedHash; if (userId == USER_FRP) { PersistentData data = mStorage.readPersistentDataBlock(); @@ -1472,7 +1471,7 @@ public class LockSettingsService extends ILockSettings.Stub { credentialToVerify = credential; } - VerifyCredentialResponse response = verifyCredential(userId, storedHash, credentialToVerify, + response = verifyCredential(userId, storedHash, credentialToVerify, hasChallenge, challenge, progressCallback); if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { @@ -1995,33 +1994,46 @@ public class LockSettingsService extends ILockSettings.Stub { setLong(SYNTHETIC_PASSWORD_ENABLED_KEY, 1, UserHandle.USER_SYSTEM); } - private VerifyCredentialResponse spBasedDoVerifyCredentialLocked(String userCredential, int + private VerifyCredentialResponse spBasedDoVerifyCredential(String userCredential, int credentialType, boolean hasChallenge, long challenge, int userId, ICheckCredentialProgressCallback progressCallback) throws RemoteException { - if (DEBUG) Slog.d(TAG, "spBasedDoVerifyCredentialLocked: user=" + userId); + if (DEBUG) Slog.d(TAG, "spBasedDoVerifyCredential: user=" + userId); if (credentialType == LockPatternUtils.CREDENTIAL_TYPE_NONE) { userCredential = null; } - if (userId == USER_FRP) { - return mSpManager.verifyFrpCredential(getGateKeeperService(), - userCredential, credentialType, progressCallback); - } - long handle = getSyntheticPasswordHandleLocked(userId); - AuthenticationResult authResult = mSpManager.unwrapPasswordBasedSyntheticPassword( - getGateKeeperService(), handle, userCredential, userId); + final AuthenticationResult authResult; + VerifyCredentialResponse response; + synchronized (mSpManager) { + if (!isSyntheticPasswordBasedCredentialLocked(userId)) { + return null; + } + if (userId == USER_FRP) { + return mSpManager.verifyFrpCredential(getGateKeeperService(), + userCredential, credentialType, progressCallback); + } - VerifyCredentialResponse response = authResult.gkResponse; - if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { + long handle = getSyntheticPasswordHandleLocked(userId); + authResult = mSpManager.unwrapPasswordBasedSyntheticPassword( + getGateKeeperService(), handle, userCredential, userId); + + response = authResult.gkResponse; // credential has matched - // perform verifyChallenge with synthetic password which generates the real auth - // token for the current user - response = mSpManager.verifyChallenge(getGateKeeperService(), authResult.authToken, - challenge, userId); - if (response.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) { - Slog.wtf(TAG, "verifyChallenge with SP failed."); - return VerifyCredentialResponse.ERROR; + if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { + // perform verifyChallenge with synthetic password which generates the real GK auth + // token and response for the current user + response = mSpManager.verifyChallenge(getGateKeeperService(), authResult.authToken, + challenge, userId); + if (response.getResponseCode() != VerifyCredentialResponse.RESPONSE_OK) { + // This shouldn't really happen: the unwrapping of SP succeeds, but SP doesn't + // match the recorded GK password handle. + Slog.wtf(TAG, "verifyChallenge with SP failed."); + return VerifyCredentialResponse.ERROR; + } } + } + + if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) { if (progressCallback != null) { progressCallback.onCredentialVerified(); } @@ -2032,12 +2044,14 @@ public class LockSettingsService extends ILockSettings.Stub { Slog.i(TAG, "Unlocking user " + userId + " with secret only, length " + secret.length); unlockUser(userId, null, secret); + activateEscrowTokens(authResult.authToken, userId); + if (isManagedProfileWithSeparatedLock(userId)) { TrustManager trustManager = (TrustManager) mContext.getSystemService(Context.TRUST_SERVICE); trustManager.setDeviceLockedForUser(userId, false); } - activateEscrowTokens(authResult.authToken, userId); + mStrongAuth.reportSuccessfulStrongAuthUnlock(userId); } else if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_RETRY) { if (response.getTimeout() > 0) { requireStrongAuth(STRONG_AUTH_REQUIRED_AFTER_LOCKOUT, userId); @@ -2184,8 +2198,8 @@ public class LockSettingsService extends ILockSettings.Stub { private void activateEscrowTokens(AuthenticationToken auth, int userId) throws RemoteException { if (DEBUG) Slog.d(TAG, "activateEscrowTokens: user=" + userId); - disableEscrowTokenOnNonManagedDevicesIfNeeded(userId); synchronized (mSpManager) { + disableEscrowTokenOnNonManagedDevicesIfNeeded(userId); for (long handle : mSpManager.getPendingTokensForUser(userId)) { Slog.i(TAG, String.format("activateEscrowTokens: %x %d ", handle, userId)); mSpManager.activateTokenBasedSyntheticPassword(handle, auth, userId); diff --git a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java index d730c56ae2ca..67ead6f45d7a 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsShellCommand.java @@ -36,6 +36,7 @@ class LockSettingsShellCommand extends ShellCommand { private static final String COMMAND_CLEAR = "clear"; private static final String COMMAND_SP = "sp"; private static final String COMMAND_SET_DISABLED = "set-disabled"; + private static final String COMMAND_VERIFY = "verify"; private int mCurrentUserId; private final LockPatternUtils mLockPatternUtils; @@ -76,6 +77,9 @@ class LockSettingsShellCommand extends ShellCommand { case COMMAND_SET_DISABLED: runSetDisabled(); break; + case COMMAND_VERIFY: + runVerify(); + break; default: getErrPrintWriter().println("Unknown command: " + cmd); break; @@ -88,6 +92,11 @@ class LockSettingsShellCommand extends ShellCommand { } } + private void runVerify() { + // The command is only run if the credential is correct. + getOutPrintWriter().println("Lock credential verified successfully"); + } + @Override public void onHelp() { } diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java index 562ab3319d64..4600c3210389 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java +++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java @@ -56,9 +56,9 @@ final class EphemeralResolverConnection implements DeathRecipient { private static final String TAG = "PackageManager"; // This is running in a critical section and the timeout must be sufficiently low private static final long BIND_SERVICE_TIMEOUT_MS = - ("eng".equals(Build.TYPE)) ? 500 : 300; + Build.IS_ENG ? 500 : 300; private static final long CALL_SERVICE_TIMEOUT_MS = - ("eng".equals(Build.TYPE)) ? 200 : 100; + Build.IS_ENG ? 200 : 100; private static final boolean DEBUG_EPHEMERAL = Build.IS_DEBUGGABLE; private final Object mLock = new Object(); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index e59b9e383d13..92c5862910c5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3050,7 +3050,7 @@ public class PackageManagerService extends IPackageManager.Stub } // Disable package parsing on eng builds to allow for faster incremental development. - if ("eng".equals(Build.TYPE)) { + if (Build.IS_ENG) { return null; } @@ -3085,7 +3085,7 @@ public class PackageManagerService extends IPackageManager.Stub // NOTE: When no BUILD_NUMBER is set by the build system, it defaults to a build // that starts with "eng." to signify that this is an engineering build and not // destined for release. - if ("userdebug".equals(Build.TYPE) && Build.VERSION.INCREMENTAL.startsWith("eng.")) { + if (Build.IS_USERDEBUG && Build.VERSION.INCREMENTAL.startsWith("eng.")) { Slog.w(TAG, "Wiping cache directory because the system partition changed."); // Heuristic: If the /system directory has been modified recently due to an "adb sync" @@ -5533,7 +5533,7 @@ public class PackageManagerService extends IPackageManager.Stub if (eventIdIndex == -1) { if (AppOpsManager.permissionToOpCode(name) == AppOpsManager.OP_NONE - || "user".equals(Build.TYPE)) { + || Build.IS_USER) { Log.i(TAG, "Unknown permission " + name); return MetricsEvent.ACTION_PERMISSION_REQUEST_UNKNOWN; @@ -16933,12 +16933,20 @@ public class PackageManagerService extends IPackageManager.Stub public void setError(String msg, PackageParserException e) { setReturnCode(e.error); setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); + final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + addedChildPackages.valueAt(i).setError(msg, e); + } Slog.w(TAG, msg, e); } public void setError(String msg, PackageManagerException e) { returnCode = e.error; setReturnMessage(ExceptionUtils.getCompleteMessage(msg, e)); + final int childCount = (addedChildPackages != null) ? addedChildPackages.size() : 0; + for (int i = 0; i < childCount; i++) { + addedChildPackages.valueAt(i).setError(msg, e); + } Slog.w(TAG, msg, e); } diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index f3a292b7e1e0..20d7b28c55e1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -1018,7 +1018,7 @@ class PackageManagerShellCommand extends ShellCommand { throw new RuntimeException(e.getMessage(), e); } try { - ResolveInfo ri = mInterface.resolveIntent(intent, null, 0, mTargetUser); + ResolveInfo ri = mInterface.resolveIntent(intent, intent.getType(), 0, mTargetUser); PrintWriter pw = getOutPrintWriter(); if (ri == null) { pw.println("No activity found"); @@ -1040,7 +1040,7 @@ class PackageManagerShellCommand extends ShellCommand { throw new RuntimeException(e.getMessage(), e); } try { - List<ResolveInfo> result = mInterface.queryIntentActivities(intent, null, 0, + List<ResolveInfo> result = mInterface.queryIntentActivities(intent, intent.getType(), 0, mTargetUser).getList(); PrintWriter pw = getOutPrintWriter(); if (result == null || result.size() <= 0) { @@ -1074,7 +1074,7 @@ class PackageManagerShellCommand extends ShellCommand { throw new RuntimeException(e.getMessage(), e); } try { - List<ResolveInfo> result = mInterface.queryIntentServices(intent, null, 0, + List<ResolveInfo> result = mInterface.queryIntentServices(intent, intent.getType(), 0, mTargetUser).getList(); PrintWriter pw = getOutPrintWriter(); if (result == null || result.size() <= 0) { @@ -1108,7 +1108,7 @@ class PackageManagerShellCommand extends ShellCommand { throw new RuntimeException(e.getMessage(), e); } try { - List<ResolveInfo> result = mInterface.queryIntentReceivers(intent, null, 0, + List<ResolveInfo> result = mInterface.queryIntentReceivers(intent, intent.getType(), 0, mTargetUser).getList(); PrintWriter pw = getOutPrintWriter(); if (result == null || result.size() <= 0) { diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 50670710b044..5b6bf1fdbeb1 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -795,7 +795,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub { mHandler.post(() -> { // ShutdownThread displays UI, so give it a UI context. if (safeMode) { - ShutdownThread.rebootSafeMode(getUiContext(), false); + ShutdownThread.rebootSafeMode(getUiContext(), true); } else { ShutdownThread.reboot(getUiContext(), PowerManager.SHUTDOWN_USER_REQUESTED, false); diff --git a/services/core/java/com/android/server/timezone/PackageStatusStorage.java b/services/core/java/com/android/server/timezone/PackageStatusStorage.java index 31f0e3145f8a..05e97c7ef1e9 100644 --- a/services/core/java/com/android/server/timezone/PackageStatusStorage.java +++ b/services/core/java/com/android/server/timezone/PackageStatusStorage.java @@ -16,73 +16,83 @@ package com.android.server.timezone; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; +import com.android.internal.util.FastXmlSerializer; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import android.util.AtomicFile; import android.util.Slog; +import android.util.Xml; import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; import static com.android.server.timezone.PackageStatus.CHECK_COMPLETED_FAILURE; import static com.android.server.timezone.PackageStatus.CHECK_COMPLETED_SUCCESS; import static com.android.server.timezone.PackageStatus.CHECK_STARTED; +import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; +import static org.xmlpull.v1.XmlPullParser.START_TAG; /** * Storage logic for accessing/mutating the Android system's persistent state related to time zone - * update checking. There is expected to be a single instance and all methods synchronized on - * {@code this} for thread safety. + * update checking. There is expected to be a single instance. All non-private methods are thread + * safe. */ final class PackageStatusStorage { - private static final String TAG = "timezone.PackageStatusStorage"; + private static final String LOG_TAG = "timezone.PackageStatusStorage"; - private static final String DATABASE_NAME = "timezonepackagestatus.db"; - private static final int DATABASE_VERSION = 1; - - /** The table name. It will have a single row with _id == {@link #SINGLETON_ID} */ - private static final String TABLE = "status"; - private static final String COLUMN_ID = "_id"; + private static final String TAG_PACKAGE_STATUS = "PackageStatus"; /** - * Column that stores a monotonically increasing lock ID, used to detect concurrent update + * Attribute that stores a monotonically increasing lock ID, used to detect concurrent update * issues without on-line locks. Incremented on every write. */ - private static final String COLUMN_OPTIMISTIC_LOCK_ID = "optimistic_lock_id"; + private static final String ATTRIBUTE_OPTIMISTIC_LOCK_ID = "optimisticLockId"; /** - * Column that stores the current "check status" of the time zone update application packages. + * Attribute that stores the current "check status" of the time zone update application + * packages. */ - private static final String COLUMN_CHECK_STATUS = "check_status"; + private static final String ATTRIBUTE_CHECK_STATUS = "checkStatus"; /** - * Column that stores the version of the time zone rules update application being checked / last - * checked. + * Attribute that stores the version of the time zone rules update application being checked + * / last checked. */ - private static final String COLUMN_UPDATE_APP_VERSION = "update_app_package_version"; + private static final String ATTRIBUTE_UPDATE_APP_VERSION = "updateAppPackageVersion"; /** - * Column that stores the version of the time zone rules data application being checked / last - * checked. + * Attribute that stores the version of the time zone rules data application being checked + * / last checked. */ - private static final String COLUMN_DATA_APP_VERSION = "data_app_package_version"; - - /** - * The ID of the one row. - */ - private static final int SINGLETON_ID = 1; + private static final String ATTRIBUTE_DATA_APP_VERSION = "dataAppPackageVersion"; private static final int UNKNOWN_PACKAGE_VERSION = -1; - private final DatabaseHelper mDatabaseHelper; + private final AtomicFile mPackageStatusFile; - PackageStatusStorage(Context context) { - mDatabaseHelper = new DatabaseHelper(context); + PackageStatusStorage(File storageDir) { + mPackageStatusFile = new AtomicFile(new File(storageDir, "packageStatus.xml")); + if (!mPackageStatusFile.getBaseFile().exists()) { + try { + insertInitialPackageStatus(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } } - void deleteDatabaseForTests() { - SQLiteDatabase.deleteDatabase(mDatabaseHelper.getDatabaseFile()); + void deleteFileForTests() { + synchronized(this) { + mPackageStatusFile.delete(); + } } /** @@ -93,48 +103,60 @@ final class PackageStatusStorage { synchronized (this) { try { return getPackageStatusInternal(); - } catch (IllegalArgumentException e) { - // This means that data exists in the table but it was bad. - Slog.e(TAG, "Package status invalid, resetting and retrying", e); + } catch (ParseException e) { + // This means that data exists in the file but it was bad. + Slog.e(LOG_TAG, "Package status invalid, resetting and retrying", e); // Reset the storage so it is in a good state again. - mDatabaseHelper.recoverFromBadData(); - return getPackageStatusInternal(); + recoverFromBadData(e); + try { + return getPackageStatusInternal(); + } catch (ParseException e2) { + throw new IllegalStateException("Recovery from bad file failed", e2); + } } } } - private PackageStatus getPackageStatusInternal() { - String[] columns = { - COLUMN_CHECK_STATUS, COLUMN_UPDATE_APP_VERSION, COLUMN_DATA_APP_VERSION - }; - Cursor cursor = mDatabaseHelper.getReadableDatabase() - .query(TABLE, columns, COLUMN_ID + " = ?", - new String[] { Integer.toString(SINGLETON_ID) }, - null /* groupBy */, null /* having */, null /* orderBy */); - if (cursor.getCount() != 1) { - Slog.e(TAG, "Unable to find package status from package status row. Rows returned: " - + cursor.getCount()); - return null; + private PackageStatus getPackageStatusInternal() throws ParseException { + try (FileInputStream fis = mPackageStatusFile.openRead()) { + XmlPullParser parser = parseToPackageStatusTag(fis); + Integer checkStatus = getNullableIntAttribute(parser, ATTRIBUTE_CHECK_STATUS); + if (checkStatus == null) { + return null; + } + int updateAppVersion = getIntAttribute(parser, ATTRIBUTE_UPDATE_APP_VERSION); + int dataAppVersion = getIntAttribute(parser, ATTRIBUTE_DATA_APP_VERSION); + return new PackageStatus(checkStatus, + new PackageVersions(updateAppVersion, dataAppVersion)); + } catch (IOException e) { + ParseException e2 = new ParseException("Error reading package status", 0); + e2.initCause(e); + throw e2; } - cursor.moveToFirst(); + } - // Determine check status. - if (cursor.isNull(0)) { - // This is normal the first time getPackageStatus() is called, or after - // resetCheckState(). - return null; + // Callers should be synchronized(this). + private int recoverFromBadData(Exception cause) { + mPackageStatusFile.delete(); + try { + return insertInitialPackageStatus(); + } catch (IOException e) { + IllegalStateException fatal = new IllegalStateException(e); + fatal.addSuppressed(cause); + throw fatal; } - int checkStatus = cursor.getInt(0); + } - // Determine package version. - if (cursor.isNull(1) || cursor.isNull(2)) { - Slog.e(TAG, "Package version information unexpectedly null"); - return null; - } - PackageVersions packageVersions = new PackageVersions(cursor.getInt(1), cursor.getInt(2)); + /** Insert the initial data, returning the optimistic lock ID */ + private int insertInitialPackageStatus() throws IOException { + // Doesn't matter what it is, but we avoid the obvious starting value each time the data + // is reset to ensure that old tokens are unlikely to work. + final int initialOptimisticLockId = (int) System.currentTimeMillis(); - return new PackageStatus(checkStatus, packageVersions); + writePackageStatusInternal(null /* status */, initialOptimisticLockId, + null /* packageVersions */); + return initialOptimisticLockId; } /** @@ -147,23 +169,29 @@ final class PackageStatusStorage { } synchronized (this) { - Integer optimisticLockId = getCurrentOptimisticLockId(); - if (optimisticLockId == null) { - Slog.w(TAG, "Unable to find optimistic lock ID from package status row"); + int optimisticLockId; + try { + optimisticLockId = getCurrentOptimisticLockId(); + } catch (ParseException e) { + Slog.w(LOG_TAG, "Unable to find optimistic lock ID from package status"); // Recover. - optimisticLockId = mDatabaseHelper.recoverFromBadData(); + optimisticLockId = recoverFromBadData(e); } int newOptimisticLockId = optimisticLockId + 1; - boolean statusRowUpdated = writeStatusRow( - optimisticLockId, newOptimisticLockId, CHECK_STARTED, currentInstalledVersions); - if (!statusRowUpdated) { - Slog.e(TAG, "Unable to update status to CHECK_STARTED in package status row." - + " synchronization failure?"); - return null; + try { + boolean statusUpdated = writePackageStatusWithOptimisticLockCheck( + optimisticLockId, newOptimisticLockId, CHECK_STARTED, + currentInstalledVersions); + if (!statusUpdated) { + throw new IllegalStateException("Unable to update status to CHECK_STARTED." + + " synchronization failure?"); + } + return new CheckToken(newOptimisticLockId, currentInstalledVersions); + } catch (IOException e) { + throw new IllegalStateException(e); } - return new CheckToken(newOptimisticLockId, currentInstalledVersions); } } @@ -172,19 +200,25 @@ final class PackageStatusStorage { */ void resetCheckState() { synchronized(this) { - Integer optimisticLockId = getCurrentOptimisticLockId(); - if (optimisticLockId == null) { - Slog.w(TAG, "resetCheckState: Unable to find optimistic lock ID from package" - + " status row"); + int optimisticLockId; + try { + optimisticLockId = getCurrentOptimisticLockId(); + } catch (ParseException e) { + Slog.w(LOG_TAG, "resetCheckState: Unable to find optimistic lock ID from package" + + " status"); // Attempt to recover the storage state. - optimisticLockId = mDatabaseHelper.recoverFromBadData(); + optimisticLockId = recoverFromBadData(e); } int newOptimisticLockId = optimisticLockId + 1; - if (!writeStatusRow(optimisticLockId, newOptimisticLockId, - null /* status */, null /* packageVersions */)) { - Slog.e(TAG, "resetCheckState: Unable to reset package status row," - + " newOptimisticLockId=" + newOptimisticLockId); + try { + if (!writePackageStatusWithOptimisticLockCheck(optimisticLockId, + newOptimisticLockId, null /* status */, null /* packageVersions */)) { + throw new IllegalStateException("resetCheckState: Unable to reset package" + + " status, newOptimisticLockId=" + newOptimisticLockId); + } + } catch (IOException e) { + throw new IllegalStateException(e); } } } @@ -199,138 +233,146 @@ final class PackageStatusStorage { int optimisticLockId = checkToken.mOptimisticLockId; int newOptimisticLockId = optimisticLockId + 1; int status = succeeded ? CHECK_COMPLETED_SUCCESS : CHECK_COMPLETED_FAILURE; - return writeStatusRow(optimisticLockId, newOptimisticLockId, - status, checkToken.mPackageVersions); + try { + return writePackageStatusWithOptimisticLockCheck(optimisticLockId, + newOptimisticLockId, status, checkToken.mPackageVersions); + } catch (IOException e) { + throw new IllegalStateException(e); + } } } - // Caller should be synchronized(this) - private Integer getCurrentOptimisticLockId() { - final String[] columns = { COLUMN_OPTIMISTIC_LOCK_ID }; - final String querySelection = COLUMN_ID + " = ?"; - final String[] querySelectionArgs = { Integer.toString(SINGLETON_ID) }; - - SQLiteDatabase database = mDatabaseHelper.getReadableDatabase(); - try (Cursor cursor = database.query(TABLE, columns, querySelection, querySelectionArgs, - null /* groupBy */, null /* having */, null /* orderBy */)) { - if (cursor.getCount() != 1) { - Slog.w(TAG, cursor.getCount() + " rows returned, expected exactly one."); - return null; - } - cursor.moveToFirst(); - return cursor.getInt(0); + // Caller should be synchronized(this). + private int getCurrentOptimisticLockId() throws ParseException { + try (FileInputStream fis = mPackageStatusFile.openRead()) { + XmlPullParser parser = parseToPackageStatusTag(fis); + return getIntAttribute(parser, ATTRIBUTE_OPTIMISTIC_LOCK_ID); + } catch (IOException e) { + ParseException e2 = new ParseException("Unable to read file", 0); + e2.initCause(e); + throw e2; } } - // Caller should be synchronized(this) - private boolean writeStatusRow(int optimisticLockId, int newOptimisticLockId, Integer status, - PackageVersions packageVersions) { - if ((status == null) != (packageVersions == null)) { - throw new IllegalArgumentException( - "Provide both status and packageVersions, or neither."); + /** Returns a parser or throws ParseException, never returns null. */ + private static XmlPullParser parseToPackageStatusTag(FileInputStream fis) + throws ParseException { + try { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(fis, StandardCharsets.UTF_8.name()); + int type; + while ((type = parser.next()) != END_DOCUMENT) { + final String tag = parser.getName(); + if (type == START_TAG && TAG_PACKAGE_STATUS.equals(tag)) { + return parser; + } + } + throw new ParseException("Unable to find " + TAG_PACKAGE_STATUS + " tag", 0); + } catch (XmlPullParserException e) { + throw new IllegalStateException("Unable to configure parser", e); + } catch (IOException e) { + ParseException e2 = new ParseException("Error reading XML", 0); + e.initCause(e); + throw e2; } + } - SQLiteDatabase database = mDatabaseHelper.getWritableDatabase(); - ContentValues values = new ContentValues(); - values.put(COLUMN_OPTIMISTIC_LOCK_ID, newOptimisticLockId); - if (status == null) { - values.putNull(COLUMN_CHECK_STATUS); - values.put(COLUMN_UPDATE_APP_VERSION, UNKNOWN_PACKAGE_VERSION); - values.put(COLUMN_DATA_APP_VERSION, UNKNOWN_PACKAGE_VERSION); - } else { - values.put(COLUMN_CHECK_STATUS, status); - values.put(COLUMN_UPDATE_APP_VERSION, packageVersions.mUpdateAppVersion); - values.put(COLUMN_DATA_APP_VERSION, packageVersions.mDataAppVersion); - } + // Caller should be synchronized(this). + private boolean writePackageStatusWithOptimisticLockCheck(int optimisticLockId, + int newOptimisticLockId, Integer status, PackageVersions packageVersions) + throws IOException { - String updateSelection = COLUMN_ID + " = ? AND " + COLUMN_OPTIMISTIC_LOCK_ID + " = ?"; - String[] updateSelectionArgs = { - Integer.toString(SINGLETON_ID), Integer.toString(optimisticLockId) - }; - int count = database.update(TABLE, values, updateSelection, updateSelectionArgs); - if (count > 1) { - // This has to be because of corruption: there should only ever be one row. - Slog.w(TAG, "writeStatusRow: " + count + " rows updated, expected exactly one."); - // Reset the table. - mDatabaseHelper.recoverFromBadData(); + int currentOptimisticLockId; + try { + currentOptimisticLockId = getCurrentOptimisticLockId(); + if (currentOptimisticLockId != optimisticLockId) { + return false; + } + } catch (ParseException e) { + recoverFromBadData(e); + return false; } - // 1 is the success case. 0 rows updated means the row is missing or the optimistic lock ID - // was not as expected, this could be because of corruption but is most likely due to an - // optimistic lock failure. Callers can decide on a case-by-case basis. - return count == 1; - } - - /** Only used during tests to force an empty table. */ - void deleteRowForTests() { - mDatabaseHelper.getWritableDatabase().delete(TABLE, null, null); + writePackageStatusInternal(status, newOptimisticLockId, packageVersions); + return true; } - /** Only used during tests to force a known table state. */ - public void forceCheckStateForTests(int checkStatus, PackageVersions packageVersions) { - int optimisticLockId = getCurrentOptimisticLockId(); - writeStatusRow(optimisticLockId, optimisticLockId, checkStatus, packageVersions); - } - - static class DatabaseHelper extends SQLiteOpenHelper { - - private final Context mContext; - - public DatabaseHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - mContext = context; - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL("CREATE TABLE " + TABLE + " (" + - "_id INTEGER PRIMARY KEY," + - COLUMN_OPTIMISTIC_LOCK_ID + " INTEGER NOT NULL," + - COLUMN_CHECK_STATUS + " INTEGER," + - COLUMN_UPDATE_APP_VERSION + " INTEGER NOT NULL," + - COLUMN_DATA_APP_VERSION + " INTEGER NOT NULL" + - ");"); - insertInitialRowState(db); + // Caller should be synchronized(this). + private void writePackageStatusInternal(Integer status, int optimisticLockId, + PackageVersions packageVersions) throws IOException { + if ((status == null) != (packageVersions == null)) { + throw new IllegalArgumentException( + "Provide both status and packageVersions, or neither."); } - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int currentVersion) { - // no-op: nothing to upgrade + FileOutputStream fos = null; + try { + fos = mPackageStatusFile.startWrite(); + XmlSerializer serializer = new FastXmlSerializer(); + serializer.setOutput(fos, StandardCharsets.UTF_8.name()); + serializer.startDocument(null /* encoding */, true /* standalone */); + final String namespace = null; + serializer.startTag(namespace, TAG_PACKAGE_STATUS); + String statusAttributeValue = status == null ? "" : Integer.toString(status); + serializer.attribute(namespace, ATTRIBUTE_CHECK_STATUS, statusAttributeValue); + serializer.attribute(namespace, ATTRIBUTE_OPTIMISTIC_LOCK_ID, + Integer.toString(optimisticLockId)); + int updateAppVersion = status == null + ? UNKNOWN_PACKAGE_VERSION : packageVersions.mUpdateAppVersion; + serializer.attribute(namespace, ATTRIBUTE_UPDATE_APP_VERSION, + Integer.toString(updateAppVersion)); + int dataAppVersion = status == null + ? UNKNOWN_PACKAGE_VERSION : packageVersions.mDataAppVersion; + serializer.attribute(namespace, ATTRIBUTE_DATA_APP_VERSION, + Integer.toString(dataAppVersion)); + serializer.endTag(namespace, TAG_PACKAGE_STATUS); + serializer.endDocument(); + serializer.flush(); + mPackageStatusFile.finishWrite(fos); + } catch (IOException e) { + if (fos != null) { + mPackageStatusFile.failWrite(fos); + } + throw e; } - /** Recover the initial data row state, returning the new current optimistic lock ID */ - int recoverFromBadData() { - // Delete the table content. - SQLiteDatabase writableDatabase = getWritableDatabase(); - writableDatabase.delete(TABLE, null /* whereClause */, null /* whereArgs */); + } - // Insert the initial content. - return insertInitialRowState(writableDatabase); + /** Only used during tests to force a known table state. */ + public void forceCheckStateForTests(int checkStatus, PackageVersions packageVersions) { + synchronized (this) { + try { + int optimisticLockId = getCurrentOptimisticLockId(); + writePackageStatusWithOptimisticLockCheck(optimisticLockId, optimisticLockId, + checkStatus, packageVersions); + } catch (IOException | ParseException e) { + throw new IllegalStateException(e); + } } + } - /** Insert the initial data row, returning the optimistic lock ID */ - private static int insertInitialRowState(SQLiteDatabase db) { - // Doesn't matter what it is, but we avoid the obvious starting value each time the row - // is reset to ensure that old tokens are unlikely to work. - final int initialOptimisticLockId = (int) System.currentTimeMillis(); - - // Insert the one row. - ContentValues values = new ContentValues(); - values.put(COLUMN_ID, SINGLETON_ID); - values.put(COLUMN_OPTIMISTIC_LOCK_ID, initialOptimisticLockId); - values.putNull(COLUMN_CHECK_STATUS); - values.put(COLUMN_UPDATE_APP_VERSION, UNKNOWN_PACKAGE_VERSION); - values.put(COLUMN_DATA_APP_VERSION, UNKNOWN_PACKAGE_VERSION); - long id = db.insert(TABLE, null, values); - if (id == -1) { - Slog.w(TAG, "insertInitialRow: could not insert initial row, id=" + id); - return -1; + private static Integer getNullableIntAttribute(XmlPullParser parser, String attributeName) + throws ParseException { + String attributeValue = parser.getAttributeValue(null, attributeName); + try { + if (attributeValue == null) { + throw new ParseException("Attribute " + attributeName + " missing", 0); + } else if (attributeValue.isEmpty()) { + return null; } - return initialOptimisticLockId; + return Integer.parseInt(attributeValue); + } catch (NumberFormatException e) { + throw new ParseException( + "Bad integer for attributeName=" + attributeName + ": " + attributeValue, 0); } + } - File getDatabaseFile() { - return mContext.getDatabasePath(DATABASE_NAME); + private static int getIntAttribute(XmlPullParser parser, String attributeName) + throws ParseException { + Integer value = getNullableIntAttribute(parser, attributeName); + if (value == null) { + throw new ParseException("Missing attribute " + attributeName, 0); } + return value; } } diff --git a/services/core/java/com/android/server/timezone/PackageTracker.java b/services/core/java/com/android/server/timezone/PackageTracker.java index 8abf7df9952b..f9af2eae92cd 100644 --- a/services/core/java/com/android/server/timezone/PackageTracker.java +++ b/services/core/java/com/android/server/timezone/PackageTracker.java @@ -21,9 +21,12 @@ import com.android.internal.annotations.VisibleForTesting; import android.app.timezone.RulesUpdaterContract; import android.content.Context; import android.content.pm.PackageManager; +import android.os.Environment; import android.provider.TimeZoneRulesDataContract; import android.util.Slog; +import java.io.File; + /** * Monitors the installed applications associated with time zone updates. If the app packages are * updated it indicates there <em>might</em> be a time zone rules update to apply so a targeted @@ -81,11 +84,17 @@ public class PackageTracker implements IntentHelper.Listener { /** Creates the {@link PackageTracker} for normal use. */ static PackageTracker create(Context context) { PackageTrackerHelperImpl helperImpl = new PackageTrackerHelperImpl(context); + // TODO(nfuller): Switch to FileUtils.createDir() when available. http://b/31008728 + File storageDir = new File(Environment.getDataSystemDirectory(), "timezone"); + if (!storageDir.exists()) { + storageDir.mkdir(); + } + return new PackageTracker( helperImpl /* clock */, helperImpl /* configHelper */, helperImpl /* packageManagerHelper */, - new PackageStatusStorage(context), + new PackageStatusStorage(storageDir), new IntentHelperImpl(context)); } diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java index 58bdeb9d11ec..804a8b79310e 100644 --- a/services/core/java/com/android/server/timezone/RulesManagerService.java +++ b/services/core/java/com/android/server/timezone/RulesManagerService.java @@ -20,8 +20,8 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.SystemService; import com.android.timezone.distro.DistroException; import com.android.timezone.distro.DistroVersion; -import com.android.timezone.distro.TimeZoneDistro; import com.android.timezone.distro.StagedDistroOperation; +import com.android.timezone.distro.TimeZoneDistro; import android.app.timezone.Callback; import android.app.timezone.DistroFormatVersion; @@ -36,7 +36,9 @@ import android.os.RemoteException; import android.util.Slog; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Arrays; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; @@ -83,26 +85,22 @@ public final class RulesManagerService extends IRulesManager.Stub { private final PackageTracker mPackageTracker; private final Executor mExecutor; private final TimeZoneDistroInstaller mInstaller; - private final FileDescriptorHelper mFileDescriptorHelper; private static RulesManagerService create(Context context) { RulesManagerServiceHelperImpl helper = new RulesManagerServiceHelperImpl(context); return new RulesManagerService( helper /* permissionHelper */, helper /* executor */, - helper /* fileDescriptorHelper */, PackageTracker.create(context), new TimeZoneDistroInstaller(TAG, SYSTEM_TZ_DATA_FILE, TZ_DATA_DIR)); } // A constructor that can be used by tests to supply mocked / faked dependencies. RulesManagerService(PermissionHelper permissionHelper, - Executor executor, - FileDescriptorHelper fileDescriptorHelper, PackageTracker packageTracker, + Executor executor, PackageTracker packageTracker, TimeZoneDistroInstaller timeZoneDistroInstaller) { mPermissionHelper = permissionHelper; mExecutor = executor; - mFileDescriptorHelper = fileDescriptorHelper; mPackageTracker = packageTracker; mInstaller = timeZoneDistroInstaller; } @@ -177,55 +175,78 @@ public final class RulesManagerService extends IRulesManager.Stub { } @Override - public int requestInstall( - ParcelFileDescriptor timeZoneDistro, byte[] checkTokenBytes, ICallback callback) { - mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION); + public int requestInstall(ParcelFileDescriptor distroParcelFileDescriptor, + byte[] checkTokenBytes, ICallback callback) { - CheckToken checkToken = null; - if (checkTokenBytes != null) { - checkToken = createCheckTokenOrThrow(checkTokenBytes); - } - synchronized (this) { - if (timeZoneDistro == null) { - throw new NullPointerException("timeZoneDistro == null"); - } - if (callback == null) { - throw new NullPointerException("observer == null"); - } - if (mOperationInProgress.get()) { - return RulesManager.ERROR_OPERATION_IN_PROGRESS; + boolean closeParcelFileDescriptorOnExit = true; + try { + mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION); + + CheckToken checkToken = null; + if (checkTokenBytes != null) { + checkToken = createCheckTokenOrThrow(checkTokenBytes); } - mOperationInProgress.set(true); - // Execute the install asynchronously. - mExecutor.execute(new InstallRunnable(timeZoneDistro, checkToken, callback)); + synchronized (this) { + if (distroParcelFileDescriptor == null) { + throw new NullPointerException("distroParcelFileDescriptor == null"); + } + if (callback == null) { + throw new NullPointerException("observer == null"); + } + if (mOperationInProgress.get()) { + return RulesManager.ERROR_OPERATION_IN_PROGRESS; + } + mOperationInProgress.set(true); - return RulesManager.SUCCESS; + // Execute the install asynchronously. + mExecutor.execute( + new InstallRunnable(distroParcelFileDescriptor, checkToken, callback)); + + // The InstallRunnable now owns the ParcelFileDescriptor, so it will close it after + // it executes (and we do not have to). + closeParcelFileDescriptorOnExit = false; + + return RulesManager.SUCCESS; + } + } finally { + // We should close() the local ParcelFileDescriptor we were passed if it hasn't been + // passed to another thread to handle. + if (distroParcelFileDescriptor != null && closeParcelFileDescriptorOnExit) { + try { + distroParcelFileDescriptor.close(); + } catch (IOException e) { + Slog.w(TAG, "Failed to close distroParcelFileDescriptor", e); + } + } } } private class InstallRunnable implements Runnable { - private final ParcelFileDescriptor mTimeZoneDistro; + private final ParcelFileDescriptor mDistroParcelFileDescriptor; private final CheckToken mCheckToken; private final ICallback mCallback; - InstallRunnable( - ParcelFileDescriptor timeZoneDistro, CheckToken checkToken, ICallback callback) { - mTimeZoneDistro = timeZoneDistro; + InstallRunnable(ParcelFileDescriptor distroParcelFileDescriptor, CheckToken checkToken, + ICallback callback) { + mDistroParcelFileDescriptor = distroParcelFileDescriptor; mCheckToken = checkToken; mCallback = callback; } @Override public void run() { + boolean success = false; // Adopt the ParcelFileDescriptor into this try-with-resources so it is closed // when we are done. - boolean success = false; - try { - byte[] distroBytes = - RulesManagerService.this.mFileDescriptorHelper.readFully(mTimeZoneDistro); - TimeZoneDistro distro = new TimeZoneDistro(distroBytes); + try (ParcelFileDescriptor pfd = mDistroParcelFileDescriptor) { + // The ParcelFileDescriptor owns the underlying FileDescriptor and we'll close + // it at the end of the try-with-resources. + final boolean isFdOwner = false; + InputStream is = new FileInputStream(pfd.getFileDescriptor(), isFdOwner); + + TimeZoneDistro distro = new TimeZoneDistro(is); int installerResult = mInstaller.stageInstallWithErrorCode(distro); int resultCode = mapInstallerResultToApiCode(installerResult); sendFinishedStatus(mCallback, resultCode); diff --git a/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java b/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java index 15a571d6750c..482d8e2c8014 100644 --- a/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java +++ b/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java @@ -27,8 +27,7 @@ import libcore.io.Streams; /** * A single class that implements multiple helper interfaces for use by {@link RulesManagerService}. */ -final class RulesManagerServiceHelperImpl - implements PermissionHelper, Executor, FileDescriptorHelper { +final class RulesManagerServiceHelperImpl implements PermissionHelper, Executor { private final Context mContext; @@ -47,13 +46,4 @@ final class RulesManagerServiceHelperImpl // TODO Is there a better way? new Thread(runnable).start(); } - - @Override - public byte[] readFully(ParcelFileDescriptor parcelFileDescriptor) throws IOException { - try (ParcelFileDescriptor pfd = parcelFileDescriptor) { - // Read bytes - FileInputStream in = new FileInputStream(pfd.getFileDescriptor(), false /* isOwner */); - return Streams.readFully(in); - } - } } diff --git a/services/core/java/com/android/server/vr/Vr2dDisplay.java b/services/core/java/com/android/server/vr/Vr2dDisplay.java index 4a1297f8af71..8335243d590f 100644 --- a/services/core/java/com/android/server/vr/Vr2dDisplay.java +++ b/services/core/java/com/android/server/vr/Vr2dDisplay.java @@ -266,6 +266,7 @@ class Vr2dDisplay { } int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_SUPPORTS_TOUCH; + flags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT; mVirtualDisplay = mDisplayManager.createVirtualDisplay(null /* projection */, DISPLAY_NAME, mVirtualDisplayWidth, mVirtualDisplayHeight, mVirtualDisplayDpi, null /* surface */, flags, null /* callback */, null /* handler */, diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index 5f34c6067997..4e4398ee9d91 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -614,7 +614,7 @@ public class AppWindowContainerController return STARTING_WINDOW_TYPE_SPLASH_SCREEN; } else if (taskSwitch && allowTaskSnapshot) { return snapshot == null ? STARTING_WINDOW_TYPE_NONE - : snapshotOrientationSameAsDisplay(snapshot) || fromRecents + : snapshotOrientationSameAsTask(snapshot) || fromRecents ? STARTING_WINDOW_TYPE_SNAPSHOT : STARTING_WINDOW_TYPE_SPLASH_SCREEN; } else { return STARTING_WINDOW_TYPE_NONE; @@ -640,24 +640,11 @@ public class AppWindowContainerController return true; } - private boolean snapshotOrientationSameAsDisplay(TaskSnapshot snapshot) { + private boolean snapshotOrientationSameAsTask(TaskSnapshot snapshot) { if (snapshot == null) { return false; } - final Rect rect = new Rect(0, 0, snapshot.getSnapshot().getWidth(), - snapshot.getSnapshot().getHeight()); - rect.inset(snapshot.getContentInsets()); - final Rect taskBoundsWithoutInsets = new Rect(); - mContainer.getTask().getBounds(taskBoundsWithoutInsets); - final DisplayInfo di = mContainer.getDisplayContent().getDisplayInfo(); - final Rect displayBounds = new Rect(0, 0, di.logicalWidth, di.logicalHeight); - final Rect stableInsets = new Rect(); - mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight, - stableInsets); - displayBounds.inset(stableInsets); - final boolean snapshotInLandscape = rect.width() >= rect.height(); - final boolean displayInLandscape = displayBounds.width() >= displayBounds.height(); - return snapshotInLandscape == displayInLandscape; + return mContainer.getTask().getConfiguration().orientation == snapshot.getOrientation(); } public void removeStartingWindow() { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index bd379344e18b..8afc4fd6a8df 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -937,8 +937,6 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree // Update keyguard flags upon finishing relaunch. checkKeyguardFlagsChanged(); } - - updateAllDrawn(); } void clearRelaunching() { @@ -1344,6 +1342,10 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } } + /** + * Determines if the token has finished drawing. This should only be called from + * {@link DisplayContent#applySurfaceChangesTransaction} + */ void updateAllDrawn() { if (!allDrawn) { // Number of drawn windows can be less when a window is being relaunched, wait for diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java index 297e2880a455..b628869c54e5 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java @@ -25,6 +25,7 @@ import android.app.ActivityManager.TaskSnapshot; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.Bitmap.Config; +import android.graphics.GraphicBuffer; import android.os.Process; import android.os.SystemClock; import android.util.ArraySet; @@ -325,6 +326,15 @@ class TaskSnapshotPersister { final File file = getBitmapFile(mTaskId, mUserId); final File reducedFile = getReducedResolutionBitmapFile(mTaskId, mUserId); final Bitmap bitmap = Bitmap.createHardwareBitmap(mSnapshot.getSnapshot()); + if (bitmap == null) { + Slog.e(TAG, "Invalid task snapshot"); + return false; + } else if (bitmap.getWidth() == 0 || bitmap.getHeight() == 0) { + Slog.e(TAG, "Invalid task snapshot dimensions " + bitmap.getWidth() + "x" + + bitmap.getHeight()); + return false; + } + final Bitmap swBitmap = bitmap.copy(Config.ARGB_8888, false /* isMutable */); final Bitmap reduced = Bitmap.createScaledBitmap(swBitmap, (int) (bitmap.getWidth() * REDUCED_SCALE), diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java index 70c7e586d3fe..608635491849 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/NetworkLoggingHandler.java @@ -25,8 +25,8 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.SystemClock; -import android.util.Log; import android.util.LongSparseArray; +import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -60,16 +60,21 @@ final class NetworkLoggingHandler extends Handler { /** Delay after which older batches get discarded after a retrieval. */ private static final long RETRIEVED_BATCH_DISCARD_DELAY_MS = 5 * 60 * 1000; // 5m + /** Do not call into mDpm with locks held */ private final DevicePolicyManagerService mDpm; private final AlarmManager mAlarmManager; private final OnAlarmListener mBatchTimeoutAlarmListener = new OnAlarmListener() { @Override public void onAlarm() { - Log.d(TAG, "Received a batch finalization timeout alarm, finalizing " + Slog.d(TAG, "Received a batch finalization timeout alarm, finalizing " + mNetworkEvents.size() + " pending events."); + Bundle notificationExtras = null; synchronized (NetworkLoggingHandler.this) { - finalizeBatchAndNotifyDeviceOwnerLocked(); + notificationExtras = finalizeBatchAndBuildDeviceOwnerMessageLocked(); + } + if (notificationExtras != null) { + notifyDeviceOwner(notificationExtras); } } }; @@ -110,17 +115,21 @@ final class NetworkLoggingHandler extends Handler { case LOG_NETWORK_EVENT_MSG: { final NetworkEvent networkEvent = msg.getData().getParcelable(NETWORK_EVENT_KEY); if (networkEvent != null) { + Bundle notificationExtras = null; synchronized (NetworkLoggingHandler.this) { mNetworkEvents.add(networkEvent); if (mNetworkEvents.size() >= MAX_EVENTS_PER_BATCH) { - finalizeBatchAndNotifyDeviceOwnerLocked(); + notificationExtras = finalizeBatchAndBuildDeviceOwnerMessageLocked(); } } + if (notificationExtras != null) { + notifyDeviceOwner(notificationExtras); + } } break; } default: { - Log.d(TAG, "NetworkLoggingHandler received an unknown of message."); + Slog.d(TAG, "NetworkLoggingHandler received an unknown of message."); break; } } @@ -133,40 +142,48 @@ final class NetworkLoggingHandler extends Handler { mAlarmManager.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP, when, BATCH_FINALIZATION_TIMEOUT_ALARM_INTERVAL_MS, NETWORK_LOGGING_TIMEOUT_ALARM_TAG, mBatchTimeoutAlarmListener, this); - Log.d(TAG, "Scheduled a new batch finalization alarm " + BATCH_FINALIZATION_TIMEOUT_MS + Slog.d(TAG, "Scheduled a new batch finalization alarm " + BATCH_FINALIZATION_TIMEOUT_MS + "ms from now."); } synchronized void pause() { - Log.d(TAG, "Paused network logging"); + Slog.d(TAG, "Paused network logging"); mPaused = true; } - synchronized void resume() { - if (!mPaused) { - Log.d(TAG, "Attempted to resume network logging, but logging is not paused."); - return; - } + void resume() { + Bundle notificationExtras = null; + synchronized (this) { + if (!mPaused) { + Slog.d(TAG, "Attempted to resume network logging, but logging is not paused."); + return; + } - Log.d(TAG, "Resumed network logging. Current batch=" + mCurrentBatchToken - + ", LastRetrievedBatch=" + mLastRetrievedBatchToken); - mPaused = false; + Slog.d(TAG, "Resumed network logging. Current batch=" + mCurrentBatchToken + + ", LastRetrievedBatch=" + mLastRetrievedBatchToken); + mPaused = false; - // If there is a batch ready that the device owner hasn't been notified about, do it now. - if (mBatches.size() > 0 && mLastRetrievedBatchToken != mCurrentBatchToken) { - scheduleBatchFinalization(); - notifyDeviceOwnerLocked(); + // If there is a batch ready that the device owner hasn't been notified about, do it now. + if (mBatches.size() > 0 && mLastRetrievedBatchToken != mCurrentBatchToken) { + scheduleBatchFinalization(); + notificationExtras = buildDeviceOwnerMessageLocked(); + } + } + if (notificationExtras != null) { + notifyDeviceOwner(notificationExtras); } } synchronized void discardLogs() { mBatches.clear(); mNetworkEvents = new ArrayList<>(); - Log.d(TAG, "Discarded all network logs"); + Slog.d(TAG, "Discarded all network logs"); } @GuardedBy("this") - private void finalizeBatchAndNotifyDeviceOwnerLocked() { + /** @returns extras if a message should be sent to the device owner */ + private Bundle finalizeBatchAndBuildDeviceOwnerMessageLocked() { + Bundle notificationExtras = null; if (mNetworkEvents.size() > 0) { // Finalize the batch and start a new one from scratch. if (mBatches.size() >= MAX_BATCHES) { @@ -177,27 +194,39 @@ final class NetworkLoggingHandler extends Handler { mBatches.append(mCurrentBatchToken, mNetworkEvents); mNetworkEvents = new ArrayList<>(); if (!mPaused) { - notifyDeviceOwnerLocked(); + notificationExtras = buildDeviceOwnerMessageLocked(); } } else { // Don't notify the DO, since there are no events; DPC can still retrieve // the last full batch if not paused. - Log.d(TAG, "Was about to finalize the batch, but there were no events to send to" + Slog.d(TAG, "Was about to finalize the batch, but there were no events to send to" + " the DPC, the batchToken of last available batch: " + mCurrentBatchToken); } // Regardless of whether the batch was non-empty schedule a new finalization after timeout. scheduleBatchFinalization(); + return notificationExtras; } - /** Sends a notification to the DO. Should only be called when there is a batch available. */ @GuardedBy("this") - private void notifyDeviceOwnerLocked() { + /** Build extras notification to the DO. Should only be called when there + is a batch available. */ + private Bundle buildDeviceOwnerMessageLocked() { final Bundle extras = new Bundle(); final int lastBatchSize = mBatches.valueAt(mBatches.size() - 1).size(); extras.putLong(DeviceAdminReceiver.EXTRA_NETWORK_LOGS_TOKEN, mCurrentBatchToken); extras.putInt(DeviceAdminReceiver.EXTRA_NETWORK_LOGS_COUNT, lastBatchSize); - Log.d(TAG, "Sending network logging batch broadcast to device owner, batchToken: " - + mCurrentBatchToken); + return extras; + } + + /** Sends a notification to the DO. Should not hold locks as DevicePolicyManagerService may + call into NetworkLoggingHandler. */ + private void notifyDeviceOwner(Bundle extras) { + Slog.d(TAG, "Sending network logging batch broadcast to device owner, batchToken: " + + extras.getLong(DeviceAdminReceiver.EXTRA_NETWORK_LOGS_TOKEN, -1)); + if (Thread.holdsLock(this)) { + Slog.wtfStack(TAG, "Shouldn't be called with NetworkLoggingHandler lock held"); + return; + } mDpm.sendDeviceOwnerCommand(DeviceAdminReceiver.ACTION_NETWORK_LOGS_AVAILABLE, extras); } diff --git a/services/print/java/com/android/server/print/RemotePrintSpooler.java b/services/print/java/com/android/server/print/RemotePrintSpooler.java index f4c9c86fda2a..abd2244959cf 100644 --- a/services/print/java/com/android/server/print/RemotePrintSpooler.java +++ b/services/print/java/com/android/server/print/RemotePrintSpooler.java @@ -72,7 +72,7 @@ final class RemotePrintSpooler { private static final boolean DEBUG = false; private static final long BIND_SPOOLER_SERVICE_TIMEOUT = - ("eng".equals(Build.TYPE)) ? 120000 : 10000; + (Build.IS_ENG) ? 120000 : 10000; private final Object mLock = new Object(); diff --git a/services/tests/notification/AndroidManifest.xml b/services/tests/notification/AndroidManifest.xml index 99d9c7b87301..c20020abb85c 100644 --- a/services/tests/notification/AndroidManifest.xml +++ b/services/tests/notification/AndroidManifest.xml @@ -31,7 +31,7 @@ </application> <instrumentation - android:name="android.support.test.runner.AndroidJUnitRunner" + android:name="android.testing.TestableInstrumentation" android:targetPackage="com.android.frameworks.tests.notification" android:label="Notification Tests" /> </manifest> diff --git a/services/tests/notification/src/com/android/server/notification/NotificationTest.java b/services/tests/notification/src/com/android/server/notification/NotificationTest.java new file mode 100644 index 000000000000..4165e9e0aceb --- /dev/null +++ b/services/tests/notification/src/com/android/server/notification/NotificationTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2017 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.server.notification; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNotNull; +import static junit.framework.Assert.assertNull; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import android.app.ActivityManager; +import android.app.Notification; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.graphics.Color; +import android.os.Build; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class NotificationTest extends NotificationTestCase { + + @Mock + ActivityManager mAm; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void testStripsExtendersInLowRamMode() { + Notification.Builder nb = new Notification.Builder(mContext, "channel"); + nb.extend(new Notification.CarExtender().setColor(Color.RED)); + nb.extend(new Notification.TvExtender().setChannelId("different channel")); + nb.extend(new Notification.WearableExtender().setDismissalId("dismiss")); + Notification before = nb.build(); + + Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true); + + assertEquals("different channel", new Notification.TvExtender(before).getChannelId()); + assertNull(new Notification.TvExtender(after).getChannelId()); + + assertEquals(Color.RED, new Notification.CarExtender(before).getColor()); + assertEquals(Notification.COLOR_DEFAULT, new Notification.CarExtender(after).getColor()); + + assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId()); + assertNull(new Notification.WearableExtender(after).getDismissalId()); + } + + @Test + public void testStripsRemoteViewsInLowRamMode() { + Context context = spy(getContext()); + ApplicationInfo ai = new ApplicationInfo(); + ai.targetSdkVersion = Build.VERSION_CODES.M; + when(context.getApplicationInfo()).thenReturn(ai); + + final Notification.BigTextStyle style = new Notification.BigTextStyle() + .bigText("hello") + .setSummaryText("And the summary"); + Notification before = new Notification.Builder(context, "channel") + .setContentText("hi") + .setStyle(style) + .build(); + + Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true); + assertNotNull(before.contentView); + assertNotNull(before.bigContentView); + assertNotNull(before.headsUpContentView); + assertNull(after.contentView); + assertNull(after.bigContentView); + assertNull(after.headsUpContentView); + } + + @Test + public void testDoesNotStripsExtendersInNormalRamMode() { + Notification.Builder nb = new Notification.Builder(mContext, "channel"); + nb.extend(new Notification.CarExtender().setColor(Color.RED)); + nb.extend(new Notification.TvExtender().setChannelId("different channel")); + nb.extend(new Notification.WearableExtender().setDismissalId("dismiss")); + Notification before = nb.build(); + Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, false); + + assertTrue(before == after); + + assertEquals("different channel", new Notification.TvExtender(before).getChannelId()); + assertEquals(Color.RED, new Notification.CarExtender(before).getColor()); + assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId()); + } +} + diff --git a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java index c399a5de46dd..e3ce17bcd2d8 100644 --- a/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/display/DisplayManagerServiceTest.java @@ -29,6 +29,7 @@ import android.view.SurfaceControl; import android.view.WindowManagerInternal; import com.android.server.LocalServices; +import com.android.server.display.DisplayDeviceInfo; import com.android.server.display.DisplayManagerService.SyncRoot; import com.android.server.display.VirtualDisplayAdapter.SurfaceControlDisplayFactory; @@ -115,4 +116,30 @@ public class DisplayManagerServiceTest extends AndroidTestCase { assertEquals(uniqueIdPrefix + uniqueId, dv.uniqueId); assertEquals(displayId, dv.displayId); } + + public void testCreateVirtualDisplayRotatesWithContent() throws Exception { + // This is effectively the DisplayManager service published to ServiceManager. + DisplayManagerService.BinderService bs = mDisplayManager.new BinderService(); + + String uniqueId = "uniqueId --- Rotates With Content Test"; + int width = 600; + int height = 800; + int dpi = 320; + int flags = DisplayManager.VIRTUAL_DISPLAY_FLAG_ROTATES_WITH_CONTENT; + + when(mMockAppToken.asBinder()).thenReturn(mMockAppToken); + int displayId = bs.createVirtualDisplay(mMockAppToken /* callback */, + null /* projection */, "com.android.frameworks.servicestests", + "Test Virtual Display", width, height, dpi, null /* surface */, flags /* flags */, + uniqueId); + + mDisplayManager.performTraversalInTransactionFromWindowManagerInternal(); + + // flush the handler + mHandler.runWithScissors(() -> {}, 0 /* now */); + + DisplayDeviceInfo ddi = mDisplayManager.getDisplayDeviceInfoInternal(displayId); + assertNotNull(ddi); + assertTrue((ddi.flags & DisplayDeviceInfo.FLAG_ROTATES_WITH_CONTENT) != 0); + } } diff --git a/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java new file mode 100644 index 000000000000..304e0e98790e --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/pm/UserLifecycleStressTest.java @@ -0,0 +1,113 @@ +/* + * Copyright (C) 2017 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.server.pm; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import android.app.ActivityManager; +import android.app.IStopUserCallback; +import android.content.Context; +import android.content.pm.UserInfo; +import android.os.RemoteException; +import android.os.UserManager; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.LargeTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.Log; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * To run the test: + * bit FrameworksServicesTests:com.android.server.pm.UserLifecycleStressTest + */ +@RunWith(AndroidJUnit4.class) +@LargeTest +public class UserLifecycleStressTest { + private static final String TAG = "UserLifecycleStressTest"; + // TODO: Make this smaller once we have improved it. + private static final int MAX_TIME_STOP_USER_IN_SECOND = 30; + private static final int NUM_ITERATIONS_STOP_USER = 10; + private static final int WAIT_BEFORE_STOP_USER_IN_SECOND = 3; + + private Context mContext; + private UserManager mUserManager; + private ActivityManager mActivityManager; + + @Before + public void setup() { + mContext = InstrumentationRegistry.getInstrumentation().getContext(); + mUserManager = mContext.getSystemService(UserManager.class); + mActivityManager = mContext.getSystemService(ActivityManager.class); + } + + /** + * Create and stop user 10 times in a row. Check stop user can be finished in a reasonable + * amount of time. + */ + @Test + public void stopManagedProfileStressTest() + throws IOException, RemoteException, InterruptedException { + for (int i = 0; i < NUM_ITERATIONS_STOP_USER; i++) { + final UserInfo userInfo = mUserManager.createProfileForUser("TestUser", + UserInfo.FLAG_MANAGED_PROFILE, mActivityManager.getCurrentUser()); + assertNotNull(userInfo); + try { + assertTrue( + "Failed to start the profile", + ActivityManager.getService().startUserInBackground(userInfo.id)); + // Seems the broadcast queue is getting more busy if we wait a few seconds before + // stopping the user. + TimeUnit.SECONDS.sleep(WAIT_BEFORE_STOP_USER_IN_SECOND); + stopUser(userInfo.id); + } finally { + mUserManager.removeUser(userInfo.id); + } + } + } + + private void stopUser(int userId) throws RemoteException, InterruptedException { + final long startTime = System.currentTimeMillis(); + CountDownLatch countDownLatch = new CountDownLatch(1); + ActivityManager.getService(). + stopUser(userId, true, + new IStopUserCallback.Stub() { + @Override + public void userStopped(int userId) throws RemoteException { + countDownLatch.countDown(); + } + + @Override + public void userStopAborted(int userId) throws RemoteException { + + } + }); + boolean stoppedBeforeTimeout = + countDownLatch.await(MAX_TIME_STOP_USER_IN_SECOND, TimeUnit.SECONDS); + assertTrue( + "Take more than " + MAX_TIME_STOP_USER_IN_SECOND + "s to stop user", + stoppedBeforeTimeout); + Log.d(TAG, "stopUser takes " + (System.currentTimeMillis() - startTime) + " ms"); + } +} + diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java index e085270fc3a4..dd56072372af 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/PackageStatusStorageTest.java @@ -21,10 +21,11 @@ import org.junit.Before; import org.junit.Test; import android.content.Context; -import android.database.sqlite.SQLiteDatabase; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; +import java.io.File; + import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -40,15 +41,16 @@ public class PackageStatusStorageTest { @Before public void setUp() throws Exception { Context context = InstrumentationRegistry.getContext(); + File dataDir = context.getFilesDir(); // Using the instrumentation context means the database is created in a test app-specific // directory. - mPackageStatusStorage = new PackageStatusStorage(context); + mPackageStatusStorage = new PackageStatusStorage(dataDir); } @After public void tearDown() throws Exception { - mPackageStatusStorage.deleteDatabaseForTests(); + mPackageStatusStorage.deleteFileForTests(); } @Test @@ -90,7 +92,7 @@ public class PackageStatusStorageTest { } @Test - public void generateCheckToken_missingRowBehavior() { + public void generateCheckToken_missingFileBehavior() { // Assert initial state. assertNull(mPackageStatusStorage.getPackageStatus()); @@ -100,15 +102,15 @@ public class PackageStatusStorageTest { // There should now be state. assertNotNull(mPackageStatusStorage.getPackageStatus()); - // Corrupt the table by removing the one row. - mPackageStatusStorage.deleteRowForTests(); + // Corrupt the data by removing the file. + mPackageStatusStorage.deleteFileForTests(); // Check that generateCheckToken recovers. assertNotNull(mPackageStatusStorage.generateCheckToken(VALID_PACKAGE_VERSIONS)); } @Test - public void getPackageStatus_missingRowBehavior() { + public void getPackageStatus_missingFileBehavior() { // Assert initial state. assertNull(mPackageStatusStorage.getPackageStatus()); @@ -118,14 +120,14 @@ public class PackageStatusStorageTest { // There should now be a state. assertNotNull(mPackageStatusStorage.getPackageStatus()); - // Corrupt the table by removing the one row. - mPackageStatusStorage.deleteRowForTests(); + // Corrupt the data by removing the file. + mPackageStatusStorage.deleteFileForTests(); assertNull(mPackageStatusStorage.getPackageStatus()); } @Test - public void markChecked_missingRowBehavior() { + public void markChecked_missingFileBehavior() { // Assert initial state. CheckToken token1 = mPackageStatusStorage.generateCheckToken(VALID_PACKAGE_VERSIONS); assertNotNull(token1); @@ -133,10 +135,10 @@ public class PackageStatusStorageTest { // There should now be a state. assertNotNull(mPackageStatusStorage.getPackageStatus()); - // Corrupt the table by removing the one row. - mPackageStatusStorage.deleteRowForTests(); + // Corrupt the data by removing the file. + mPackageStatusStorage.deleteFileForTests(); - // The missing row should mean token1 is now considered invalid, so we should get a false. + // The missing file should mean token1 is now considered invalid, so we should get a false. assertFalse(mPackageStatusStorage.markChecked(token1, true /* succeeded */)); // The storage should have recovered and we should be able to carry on like before. diff --git a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java index 45b0af37f9e3..4c7680b1edef 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java @@ -71,7 +71,7 @@ public class PackageTrackerTest { // Using the instrumentation context means the database is created in a test app-specific // directory. We can use the real thing for this test. - mPackageStatusStorage = new PackageStatusStorage(context); + mPackageStatusStorage = new PackageStatusStorage(context.getFilesDir()); // For other interactions with the Android framework we create a fake object. mFakeIntentHelper = new FakeIntentHelper(); @@ -88,7 +88,7 @@ public class PackageTrackerTest { @After public void tearDown() throws Exception { if (mPackageStatusStorage != null) { - mPackageStatusStorage.deleteDatabaseForTests(); + mPackageStatusStorage.deleteFileForTests(); } } diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java index c3a6f07548c8..3b76d5e05e0e 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java @@ -30,6 +30,8 @@ import android.app.timezone.RulesManager; import android.app.timezone.RulesState; import android.os.ParcelFileDescriptor; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.util.concurrent.Executor; import javax.annotation.Nullable; @@ -61,7 +63,6 @@ public class RulesManagerServiceTest { private FakeExecutor mFakeExecutor; private PermissionHelper mMockPermissionHelper; - private FileDescriptorHelper mMockFileDescriptorHelper; private PackageTracker mMockPackageTracker; private TimeZoneDistroInstaller mMockTimeZoneDistroInstaller; @@ -69,7 +70,6 @@ public class RulesManagerServiceTest { public void setUp() { mFakeExecutor = new FakeExecutor(); - mMockFileDescriptorHelper = mock(FileDescriptorHelper.class); mMockPackageTracker = mock(PackageTracker.class); mMockPermissionHelper = mock(PermissionHelper.class); mMockTimeZoneDistroInstaller = mock(TimeZoneDistroInstaller.class); @@ -77,7 +77,6 @@ public class RulesManagerServiceTest { mRulesManagerService = new RulesManagerService( mMockPermissionHelper, mFakeExecutor, - mMockFileDescriptorHelper, mMockPackageTracker, mMockTimeZoneDistroInstaller); } @@ -273,9 +272,8 @@ public class RulesManagerServiceTest { revision); configureInstalledDistroVersion(installedDistroVersion); - byte[] expectedContent = createArbitraryBytes(1000); - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); - configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent); + ParcelFileDescriptor parcelFileDescriptor = + createParcelFileDescriptor(createArbitraryBytes(1000)); // Start an async operation so there is one in progress. The mFakeExecutor won't actually // execute it. @@ -298,24 +296,27 @@ public class RulesManagerServiceTest { public void requestInstall_operationInProgress() throws Exception { configureCallerHasPermission(); - byte[] expectedContent = createArbitraryBytes(1000); - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); - configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent); + ParcelFileDescriptor parcelFileDescriptor1 = + createParcelFileDescriptor(createArbitraryBytes(1000)); byte[] tokenBytes = createArbitraryTokenBytes(); ICallback callback = new StubbedCallback(); // First request should succeed. assertEquals(RulesManager.SUCCESS, - mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback)); + mRulesManagerService.requestInstall(parcelFileDescriptor1, tokenBytes, callback)); // Something async should be enqueued. Clear it but do not execute it so we can detect the // second request does nothing. mFakeExecutor.getAndResetLastCommand(); // Second request should fail. + ParcelFileDescriptor parcelFileDescriptor2 = + createParcelFileDescriptor(createArbitraryBytes(1000)); assertEquals(RulesManager.ERROR_OPERATION_IN_PROGRESS, - mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback)); + mRulesManagerService.requestInstall(parcelFileDescriptor2, tokenBytes, callback)); + + assertClosed(parcelFileDescriptor2); // Assert nothing async was enqueued. mFakeExecutor.assertNothingQueued(); @@ -327,9 +328,8 @@ public class RulesManagerServiceTest { public void requestInstall_badToken() throws Exception { configureCallerHasPermission(); - byte[] expectedContent = createArbitraryBytes(1000); - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); - configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent); + ParcelFileDescriptor parcelFileDescriptor = + createParcelFileDescriptor(createArbitraryBytes(1000)); byte[] badTokenBytes = new byte[2]; ICallback callback = new StubbedCallback(); @@ -340,6 +340,8 @@ public class RulesManagerServiceTest { } catch (IllegalArgumentException expected) { } + assertClosed(parcelFileDescriptor); + // Assert nothing async was enqueued. mFakeExecutor.assertNothingQueued(); verifyNoInstallerCallsMade(); @@ -369,7 +371,8 @@ public class RulesManagerServiceTest { public void requestInstall_nullCallback() throws Exception { configureCallerHasPermission(); - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); + ParcelFileDescriptor parcelFileDescriptor = + createParcelFileDescriptor(createArbitraryBytes(1000)); byte[] tokenBytes = createArbitraryTokenBytes(); ICallback callback = null; @@ -378,6 +381,8 @@ public class RulesManagerServiceTest { fail(); } catch (NullPointerException expected) {} + assertClosed(parcelFileDescriptor); + // Assert nothing async was enqueued. mFakeExecutor.assertNothingQueued(); verifyNoInstallerCallsMade(); @@ -388,9 +393,8 @@ public class RulesManagerServiceTest { public void requestInstall_asyncSuccess() throws Exception { configureCallerHasPermission(); - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); - byte[] expectedContent = createArbitraryBytes(1000); - configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent); + ParcelFileDescriptor parcelFileDescriptor = + createParcelFileDescriptor(createArbitraryBytes(1000)); CheckToken token = createArbitraryToken(); byte[] tokenBytes = token.toByteArray(); @@ -406,14 +410,14 @@ public class RulesManagerServiceTest { verifyNoInstallerCallsMade(); verifyNoPackageTrackerCallsMade(); - TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent); - // Set up the installer. configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_SUCCESS); // Simulate the async execution. mFakeExecutor.simulateAsyncExecutionOfLastCommand(); + assertClosed(parcelFileDescriptor); + // Verify the expected calls were made to other components. verifyStageInstallCalled(); verifyPackageTrackerCalled(token, true /* success */); @@ -426,9 +430,8 @@ public class RulesManagerServiceTest { public void requestInstall_nullTokenBytes() throws Exception { configureCallerHasPermission(); - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); - byte[] expectedContent = createArbitraryBytes(1000); - configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent); + ParcelFileDescriptor parcelFileDescriptor = + createParcelFileDescriptor(createArbitraryBytes(1000)); TestCallback callback = new TestCallback(); @@ -447,6 +450,8 @@ public class RulesManagerServiceTest { // Simulate the async execution. mFakeExecutor.simulateAsyncExecutionOfLastCommand(); + assertClosed(parcelFileDescriptor); + // Verify the expected calls were made to other components. verifyStageInstallCalled(); verifyPackageTrackerCalled(null /* expectedToken */, true /* success */); @@ -459,9 +464,8 @@ public class RulesManagerServiceTest { public void requestInstall_asyncInstallFail() throws Exception { configureCallerHasPermission(); - byte[] expectedContent = createArbitraryBytes(1000); - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); - configureParcelFileDescriptorReadSuccess(parcelFileDescriptor, expectedContent); + ParcelFileDescriptor parcelFileDescriptor = + createParcelFileDescriptor(createArbitraryBytes(1000)); CheckToken token = createArbitraryToken(); byte[] tokenBytes = token.toByteArray(); @@ -482,6 +486,8 @@ public class RulesManagerServiceTest { // Simulate the async execution. mFakeExecutor.simulateAsyncExecutionOfLastCommand(); + assertClosed(parcelFileDescriptor); + // Verify the expected calls were made to other components. verifyStageInstallCalled(); @@ -494,38 +500,6 @@ public class RulesManagerServiceTest { } @Test - public void requestInstall_asyncParcelFileDescriptorReadFail() throws Exception { - configureCallerHasPermission(); - - ParcelFileDescriptor parcelFileDescriptor = createFakeParcelFileDescriptor(); - configureParcelFileDescriptorReadFailure(parcelFileDescriptor); - - CheckToken token = createArbitraryToken(); - byte[] tokenBytes = token.toByteArray(); - - TestCallback callback = new TestCallback(); - - // Request the install. - assertEquals(RulesManager.SUCCESS, - mRulesManagerService.requestInstall(parcelFileDescriptor, tokenBytes, callback)); - - // Simulate the async execution. - mFakeExecutor.simulateAsyncExecutionOfLastCommand(); - - // Verify nothing else happened. - verifyNoInstallerCallsMade(); - - // A failure to read the ParcelFileDescriptor is treated as a failure. It might be the - // result of a file system error. This is a fairly arbitrary choice. - verifyPackageTrackerCalled(token, false /* success */); - - verifyNoPackageTrackerCallsMade(); - - // Check the callback was received. - callback.assertResultReceived(Callback.ERROR_UNKNOWN_FAILURE); - } - - @Test public void requestUninstall_operationInProgress() throws Exception { configureCallerHasPermission(); @@ -773,17 +747,6 @@ public class RulesManagerServiceTest { .enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION); } - private void configureParcelFileDescriptorReadSuccess(ParcelFileDescriptor parcelFileDescriptor, - byte[] content) throws Exception { - when(mMockFileDescriptorHelper.readFully(parcelFileDescriptor)).thenReturn(content); - } - - private void configureParcelFileDescriptorReadFailure(ParcelFileDescriptor parcelFileDescriptor) - throws Exception { - when(mMockFileDescriptorHelper.readFully(parcelFileDescriptor)) - .thenThrow(new IOException("Simulated failure")); - } - private void configureStageInstallExpectation(int resultCode) throws Exception { when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(any(TimeZoneDistro.class))) @@ -827,10 +790,6 @@ public class RulesManagerServiceTest { return new CheckToken(1, new PackageVersions(1, 1)); } - private ParcelFileDescriptor createFakeParcelFileDescriptor() { - return new ParcelFileDescriptor((ParcelFileDescriptor) null); - } - private void configureDeviceSystemRulesVersion(String systemRulesVersion) throws Exception { when(mMockTimeZoneDistroInstaller.getSystemRulesVersion()).thenReturn(systemRulesVersion); } @@ -870,6 +829,10 @@ public class RulesManagerServiceTest { .thenThrow(new IOException("Simulated failure")); } + private static void assertClosed(ParcelFileDescriptor parcelFileDescriptor) { + assertFalse(parcelFileDescriptor.getFileDescriptor().valid()); + } + private static class FakeExecutor implements Executor { private Runnable mLastCommand; @@ -926,4 +889,17 @@ public class RulesManagerServiceTest { fail("Unexpected call"); } } + + private static ParcelFileDescriptor createParcelFileDescriptor(byte[] bytes) + throws IOException { + File file = File.createTempFile("pfd", null); + try (FileOutputStream fos = new FileOutputStream(file)) { + fos.write(bytes); + } + ParcelFileDescriptor pfd = + ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY); + // This should now be safe to delete. The ParcelFileDescriptor has an open fd. + file.delete(); + return pfd; + } } diff --git a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java index f6d9e9a1a4e4..703f1a1ca656 100644 --- a/services/usb/java/com/android/server/usb/UsbDebuggingManager.java +++ b/services/usb/java/com/android/server/usb/UsbDebuggingManager.java @@ -43,12 +43,10 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.server.FgThread; import java.io.File; -import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.PrintWriter; import java.security.MessageDigest; import java.util.Arrays; @@ -56,10 +54,10 @@ public class UsbDebuggingManager { private static final String TAG = "UsbDebuggingManager"; private static final boolean DEBUG = false; - private final String ADBD_SOCKET = "adbd"; - private final String ADB_DIRECTORY = "misc/adb"; - private final String ADB_KEYS_FILE = "adb_keys"; - private final int BUFFER_SIZE = 4096; + private static final String ADBD_SOCKET = "adbd"; + private static final String ADB_DIRECTORY = "misc/adb"; + private static final String ADB_KEYS_FILE = "adb_keys"; + private static final int BUFFER_SIZE = 4096; private final Context mContext; private final Handler mHandler; @@ -346,7 +344,7 @@ public class UsbDebuggingManager { } /** - * @returns true if the componentName led to an Activity that was started. + * @return true if the componentName led to an Activity that was started. */ private boolean startConfirmationActivity(ComponentName componentName, UserHandle userHandle, String key, String fingerprints) { @@ -365,7 +363,7 @@ public class UsbDebuggingManager { } /** - * @returns true if the componentName led to a Service that was started. + * @return true if the componentName led to a Service that was started. */ private boolean startConfirmationService(ComponentName componentName, UserHandle userHandle, String key, String fingerprints) { diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 42272fddb95b..1a24d9571e72 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -92,14 +92,6 @@ public class UsbDeviceManager { private static final String USB_CONFIG_PROPERTY = "sys.usb.config"; /** - * The property which stores the current build type (user/userdebug/eng). - */ - private static final String BUILD_TYPE_PROPERTY = "ro.build.type"; - - private static final String BUILD_TYPE_USERDEBUG = "userdebug"; - private static final String BUILD_TYPE_ENG = "eng"; - - /** * The non-persistent property which stores the current USB actual state. */ private static final String USB_STATE_PROPERTY = "sys.usb.state"; @@ -179,7 +171,7 @@ public class UsbDeviceManager { private static Set<Integer> sBlackListedInterfaces; static { - sBlackListedInterfaces = new HashSet<Integer>(); + sBlackListedInterfaces = new HashSet<>(); sBlackListedInterfaces.add(UsbConstants.USB_CLASS_AUDIO); sBlackListedInterfaces.add(UsbConstants.USB_CLASS_COMM); sBlackListedInterfaces.add(UsbConstants.USB_CLASS_HID); @@ -191,7 +183,7 @@ public class UsbDeviceManager { sBlackListedInterfaces.add(UsbConstants.USB_CLASS_CONTENT_SEC); sBlackListedInterfaces.add(UsbConstants.USB_CLASS_VIDEO); sBlackListedInterfaces.add(UsbConstants.USB_CLASS_WIRELESS_CONTROLLER); - }; + } private class AdbSettingsObserver extends ContentObserver { public AdbSettingsObserver() { @@ -225,44 +217,6 @@ public class UsbDeviceManager { } }; - private final BroadcastReceiver mPortReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - UsbPort port = intent.getParcelableExtra(UsbManager.EXTRA_PORT); - UsbPortStatus status = intent.getParcelableExtra(UsbManager.EXTRA_PORT_STATUS); - mHandler.updateHostState(port, status); - } - }; - - private final BroadcastReceiver mChargingReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); - boolean usbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; - mHandler.sendMessage(MSG_UPDATE_CHARGING_STATE, usbCharging); - } - }; - - private final BroadcastReceiver mHostReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - Iterator devices = ((UsbManager) context.getSystemService(Context.USB_SERVICE)) - .getDeviceList().entrySet().iterator(); - if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { - mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, true); - } else { - mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, false); - } - } - }; - - private final BroadcastReceiver mLanguageChangedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - mHandler.sendEmptyMessage(MSG_LOCALE_CHANGED); - } - }; - public UsbDeviceManager(Context context, UsbAlsaManager alsaManager, UsbSettingsManager settingsManager) { mContext = context; @@ -287,17 +241,56 @@ public class UsbDeviceManager { if (secureAdbEnabled && !dataEncrypted) { mDebuggingManager = new UsbDebuggingManager(context); } - mContext.registerReceiver(mPortReceiver, + + BroadcastReceiver portReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + UsbPort port = intent.getParcelableExtra(UsbManager.EXTRA_PORT); + UsbPortStatus status = intent.getParcelableExtra(UsbManager.EXTRA_PORT_STATUS); + mHandler.updateHostState(port, status); + } + }; + + BroadcastReceiver chargingReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usbCharging = chargePlug == BatteryManager.BATTERY_PLUGGED_USB; + mHandler.sendMessage(MSG_UPDATE_CHARGING_STATE, usbCharging); + } + }; + + BroadcastReceiver hostReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + Iterator devices = ((UsbManager) context.getSystemService(Context.USB_SERVICE)) + .getDeviceList().entrySet().iterator(); + if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) { + mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, true); + } else { + mHandler.sendMessage(MSG_UPDATE_HOST_STATE, devices, false); + } + } + }; + + BroadcastReceiver languageChangedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + mHandler.sendEmptyMessage(MSG_LOCALE_CHANGED); + } + }; + + mContext.registerReceiver(portReceiver, new IntentFilter(UsbManager.ACTION_USB_PORT_CHANGED)); - mContext.registerReceiver(mChargingReceiver, + mContext.registerReceiver(chargingReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); IntentFilter filter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED); filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); - mContext.registerReceiver(mHostReceiver, filter); + mContext.registerReceiver(hostReceiver, filter); - mContext.registerReceiver(mLanguageChangedReceiver, + mContext.registerReceiver(languageChangedReceiver, new IntentFilter(Intent.ACTION_LOCALE_CHANGED)); } @@ -326,7 +319,7 @@ public class UsbDeviceManager { // We do not show the USB notification if the primary volume supports mass storage. // The legacy mass storage UI will be used instead. - boolean massStorageSupported = false; + boolean massStorageSupported; final StorageManager storageManager = StorageManager.from(mContext); final StorageVolume primary = storageManager.getPrimaryVolume(); massStorageSupported = primary != null && primary.allowMassStorage(); @@ -454,7 +447,7 @@ public class UsbDeviceManager { SystemProperties.get(USB_STATE_PROPERTY)); } - /** + /* * Use the normal bootmode persistent prop to maintain state of adb across * all boot modes. */ @@ -462,7 +455,7 @@ public class UsbDeviceManager { SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY), UsbManager.USB_FUNCTION_ADB); - /** + /* * Previous versions can set persist config to mtp/ptp but it does not * get reset on OTA. Reset the property here instead. */ @@ -652,10 +645,7 @@ public class UsbDeviceManager { private boolean isNormalBoot() { String bootMode = SystemProperties.get(BOOT_MODE_PROPERTY, "unknown"); - if (bootMode.equals(NORMAL_BOOT) || bootMode.equals("unknown")) { - return true; - } - return false; + return bootMode.equals(NORMAL_BOOT) || bootMode.equals("unknown"); } private boolean trySetEnabledFunctions(String functions, boolean forceRestart) { @@ -1311,25 +1301,21 @@ public class UsbDeviceManager { String[] items = config.split(":"); if (items.length == 3 || items.length == 4) { if (mOemModeMap == null) { - mOemModeMap = new HashMap<String, HashMap<String, - Pair<String, String>>>(); + mOemModeMap = new HashMap<>(); } HashMap<String, Pair<String, String>> overrideMap = mOemModeMap.get(items[0]); if (overrideMap == null) { - overrideMap = new HashMap<String, - Pair<String, String>>(); + overrideMap = new HashMap<>(); mOemModeMap.put(items[0], overrideMap); } // Favoring the first combination if duplicate exists if (!overrideMap.containsKey(items[1])) { if (items.length == 3) { - overrideMap.put(items[1], - new Pair<String, String>(items[2], "")); + overrideMap.put(items[1], new Pair<>(items[2], "")); } else { - overrideMap.put(items[1], - new Pair<String, String>(items[2], items[3])); + overrideMap.put(items[1], new Pair<>(items[2], items[3])); } } } @@ -1390,7 +1376,7 @@ public class UsbDeviceManager { String bootMode = SystemProperties.get(BOOT_MODE_PROPERTY, "unknown"); String persistProp = USB_PERSISTENT_CONFIG_PROPERTY; if (!(bootMode.equals(NORMAL_BOOT) || bootMode.equals("unknown"))) { - if (functions == true) { + if (functions) { persistProp = "persist.sys.usb." + bootMode + ".func"; } else { persistProp = "persist.sys.usb." + bootMode + ".config"; diff --git a/services/usb/java/com/android/server/usb/UsbHostManager.java b/services/usb/java/com/android/server/usb/UsbHostManager.java index af78c05ae399..737b572d9f29 100644 --- a/services/usb/java/com/android/server/usb/UsbHostManager.java +++ b/services/usb/java/com/android/server/usb/UsbHostManager.java @@ -16,7 +16,6 @@ package com.android.server.usb; -import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.Context; @@ -44,13 +43,11 @@ public class UsbHostManager { private static final boolean DEBUG = false; // contains all connected USB devices - private final HashMap<String, UsbDevice> mDevices = new HashMap<String, UsbDevice>(); - + private final HashMap<String, UsbDevice> mDevices = new HashMap<>(); // USB busses to exclude from USB host support private final String[] mHostBlacklist; - private final Context mContext; private final Object mLock = new Object(); private UsbDevice mNewDevice; @@ -71,7 +68,6 @@ public class UsbHostManager { public UsbHostManager(Context context, UsbAlsaManager alsaManager, UsbSettingsManager settingsManager) { - mContext = context; mHostBlacklist = context.getResources().getStringArray( com.android.internal.R.array.config_usbHostBlacklist); mUsbAlsaManager = alsaManager; @@ -119,17 +115,14 @@ public class UsbHostManager { } /* returns true if the USB device should not be accessible by applications */ - private boolean isBlackListed(int clazz, int subClass, int protocol) { + private boolean isBlackListed(int clazz, int subClass) { // blacklist hubs if (clazz == UsbConstants.USB_CLASS_HUB) return true; // blacklist HID boot devices (mouse and keyboard) - if (clazz == UsbConstants.USB_CLASS_HID && - subClass == UsbConstants.USB_INTERFACE_SUBCLASS_BOOT) { - return true; - } + return clazz == UsbConstants.USB_CLASS_HID + && subClass == UsbConstants.USB_INTERFACE_SUBCLASS_BOOT; - return false; } /* Called from JNI in monitorUsbHostBus() to report new USB devices @@ -137,6 +130,7 @@ public class UsbHostManager { interfaces and endpoints, and finally call endUsbDeviceAdded after all descriptors have been processed */ + @SuppressWarnings("unused") private boolean beginUsbDeviceAdded(String deviceName, int vendorID, int productID, int deviceClass, int deviceSubclass, int deviceProtocol, String manufacturerName, String productName, int version, String serialNumber) { @@ -161,7 +155,7 @@ public class UsbHostManager { // such test until endUsbDeviceAdded() when we have that info. if (isBlackListed(deviceName) || - isBlackListed(deviceClass, deviceSubclass, deviceProtocol)) { + isBlackListed(deviceClass, deviceSubclass)) { return false; } @@ -183,9 +177,9 @@ public class UsbHostManager { deviceClass, deviceSubclass, deviceProtocol, manufacturerName, productName, versionString, serialNumber); - mNewConfigurations = new ArrayList<UsbConfiguration>(); - mNewInterfaces = new ArrayList<UsbInterface>(); - mNewEndpoints = new ArrayList<UsbEndpoint>(); + mNewConfigurations = new ArrayList<>(); + mNewInterfaces = new ArrayList<>(); + mNewEndpoints = new ArrayList<>(); } return true; @@ -194,6 +188,7 @@ public class UsbHostManager { /* Called from JNI in monitorUsbHostBus() to report new USB configuration for the device currently being added. Returns true if successful, false in case of error. */ + @SuppressWarnings("unused") private void addUsbConfiguration(int id, String name, int attributes, int maxPower) { if (mNewConfiguration != null) { mNewConfiguration.setInterfaces( @@ -208,6 +203,7 @@ public class UsbHostManager { /* Called from JNI in monitorUsbHostBus() to report new USB interface for the device currently being added. Returns true if successful, false in case of error. */ + @SuppressWarnings("unused") private void addUsbInterface(int id, String name, int altSetting, int Class, int subClass, int protocol) { if (mNewInterface != null) { @@ -223,11 +219,13 @@ public class UsbHostManager { /* Called from JNI in monitorUsbHostBus() to report new USB endpoint for the device currently being added. Returns true if successful, false in case of error. */ + @SuppressWarnings("unused") private void addUsbEndpoint(int address, int attributes, int maxPacketSize, int interval) { mNewEndpoints.add(new UsbEndpoint(address, attributes, maxPacketSize, interval)); } /* Called from JNI in monitorUsbHostBus() to finish adding a new device */ + @SuppressWarnings("unused") private void endUsbDeviceAdded() { if (DEBUG) { Slog.d(TAG, "usb:UsbHostManager.endUsbDeviceAdded()"); @@ -273,6 +271,7 @@ public class UsbHostManager { } /* Called from JNI in monitorUsbHostBus to report USB device removal */ + @SuppressWarnings("unused") private void usbDeviceRemoved(String deviceName) { synchronized (mLock) { UsbDevice device = mDevices.remove(deviceName); @@ -288,11 +287,7 @@ public class UsbHostManager { synchronized (mLock) { // Create a thread to call into native code to wait for USB host events. // This thread will call us back on usbDeviceAdded and usbDeviceRemoved. - Runnable runnable = new Runnable() { - public void run() { - monitorUsbHostBus(); - } - }; + Runnable runnable = this::monitorUsbHostBus; new Thread(null, runnable, "UsbService host thread").start(); } } diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index 7e2496c4f0f3..9d800ad5c479 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -87,9 +87,6 @@ public class UsbPortManager { // Mostly due a command sent by the remote Usb device. private HALCallback mHALCallback = new HALCallback(null, this); - // Notification object used to listen to the start of the usb daemon. - private final ServiceNotification mServiceNotification = new ServiceNotification(); - // Cookie sent for usb hal death notification. private static final int USB_HAL_DEATH_COOKIE = 1000; @@ -107,18 +104,20 @@ public class UsbPortManager { // Ports may temporarily have different dispositions as they are added or removed // but the class invariant is that this list will only contain ports with DISPOSITION_READY // except while updatePortsLocked() is in progress. - private final ArrayMap<String, PortInfo> mPorts = new ArrayMap<String, PortInfo>(); + private final ArrayMap<String, PortInfo> mPorts = new ArrayMap<>(); // List of all simulated ports, indexed by id. private final ArrayMap<String, RawPortInfo> mSimulatedPorts = - new ArrayMap<String, RawPortInfo>(); + new ArrayMap<>(); public UsbPortManager(Context context) { mContext = context; try { + ServiceNotification serviceNotification = new ServiceNotification(); + boolean ret = IServiceManager.getService() .registerForNotifications("android.hardware.usb@1.0::IUsb", - "", mServiceNotification); + "", serviceNotification); if (!ret) { logAndPrint(Log.ERROR, null, "Failed to register service start notification"); @@ -258,7 +257,6 @@ public class UsbPortManager { logAndPrintException(pw, "Failed to set the USB port mode: " + "portId=" + portId + ", newMode=" + UsbPort.modeToString(newRole.role), e); - return; } } else { // Change power and data role independently as needed. @@ -289,7 +287,6 @@ public class UsbPortManager { + ", newDataRole=" + UsbPort.dataRoleToString(newRole .role), e); - return; } } } @@ -415,10 +412,6 @@ public class UsbPortManager { public IndentingPrintWriter pw; public UsbPortManager portManager; - HALCallback() { - super(); - } - HALCallback(IndentingPrintWriter pw, UsbPortManager portManager) { this.pw = pw; this.portManager = portManager; @@ -434,7 +427,7 @@ public class UsbPortManager { return; } - ArrayList<RawPortInfo> newPortInfo = new ArrayList<RawPortInfo>(); + ArrayList<RawPortInfo> newPortInfo = new ArrayList<>(); for (PortStatus current : currentPortStatus) { RawPortInfo temp = new RawPortInfo(current.portName, @@ -452,7 +445,6 @@ public class UsbPortManager { message.what = MSG_UPDATE_PORTS; message.setData(bundle); portManager.mHandler.sendMessage(message); - return; } @@ -467,7 +459,7 @@ public class UsbPortManager { return; } - ArrayList<RawPortInfo> newPortInfo = new ArrayList<RawPortInfo>(); + ArrayList<RawPortInfo> newPortInfo = new ArrayList<>(); for (PortStatus_1_1 current : currentPortStatus) { RawPortInfo temp = new RawPortInfo(current.status.portName, @@ -485,7 +477,6 @@ public class UsbPortManager { message.what = MSG_UPDATE_PORTS; message.setData(bundle); portManager.mHandler.sendMessage(message); - return; } public void notifyRoleSwitchStatus(String portName, PortRole role, int retval) { @@ -495,7 +486,7 @@ public class UsbPortManager { logAndPrint(Log.ERROR, pw, portName + " role switch failed"); } } - }; + } final class DeathRecipient implements HwBinder.DeathRecipient { public IndentingPrintWriter pw; diff --git a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java index 840ae221df30..ebb5a62ce7ec 100644 --- a/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbProfileGroupSettingsManager.java @@ -225,7 +225,7 @@ class UsbProfileGroupSettingsManager { } else if ("serial-number".equals(name)) { serialNumber = value; } else { - int intValue = -1; + int intValue; int radix = 10; if (value != null && value.length() > 2 && value.charAt(0) == '0' && (value.charAt(1) == 'x' || value.charAt(1) == 'X')) { @@ -388,9 +388,9 @@ class UsbProfileGroupSettingsManager { (filter.mSerialNumber != null && mSerialNumber != null && !mSerialNumber.equals(filter.mSerialNumber))) { - return(false); + return false; } - return(true); + return true; } if (obj instanceof UsbDevice) { UsbDevice device = (UsbDevice)obj; @@ -415,7 +415,7 @@ class UsbProfileGroupSettingsManager { !mProductName.equals(device.getProductName())) || (device.getSerialNumber() != null && !mSerialNumber.equals(device.getSerialNumber()))) { - return(false); + return false; } return true; } @@ -501,8 +501,7 @@ class UsbProfileGroupSettingsManager { public boolean matches(UsbAccessory acc) { if (mManufacturer != null && !acc.getManufacturer().equals(mManufacturer)) return false; if (mModel != null && !acc.getModel().equals(mModel)) return false; - if (mVersion != null && !acc.getVersion().equals(mVersion)) return false; - return true; + return !(mVersion != null && !acc.getVersion().equals(mVersion)); } /** @@ -517,8 +516,7 @@ class UsbProfileGroupSettingsManager { return false; } if (mModel != null && !Objects.equals(accessory.mModel, mModel)) return false; - if (mVersion != null && !Objects.equals(accessory.mVersion, mVersion)) return false; - return true; + return !(mVersion != null && !Objects.equals(accessory.mVersion, mVersion)); } @Override @@ -624,13 +622,8 @@ class UsbProfileGroupSettingsManager { mPackageMonitor.register(context, null, UserHandle.ALL, true); mMtpNotificationManager = new MtpNotificationManager( parentUserContext, - new MtpNotificationManager.OnOpenInAppListener() { - @Override - public void onOpenInApp(UsbDevice device) { - resolveActivity(createDeviceAttachedIntent(device), - device, false /* showMtpNotification */); - } - }); + device -> resolveActivity(createDeviceAttachedIntent(device), + device, false /* showMtpNotification */)); } /** @@ -727,9 +720,7 @@ class UsbProfileGroupSettingsManager { XmlUtils.nextElement(parser); } } - } catch (IOException e) { - Log.wtf(TAG, "Failed to read single-user settings", e); - } catch (XmlPullParserException e) { + } catch (IOException | XmlPullParserException e) { Log.wtf(TAG, "Failed to read single-user settings", e); } finally { IoUtils.closeQuietly(fis); @@ -1015,8 +1006,8 @@ class UsbProfileGroupSettingsManager { } } - private final ArrayList<ResolveInfo> getDeviceMatchesLocked(UsbDevice device, Intent intent) { - ArrayList<ResolveInfo> matches = new ArrayList<ResolveInfo>(); + private ArrayList<ResolveInfo> getDeviceMatchesLocked(UsbDevice device, Intent intent) { + ArrayList<ResolveInfo> matches = new ArrayList<>(); List<ResolveInfo> resolveInfos = queryIntentActivitiesForAllProfiles(intent); int count = resolveInfos.size(); for (int i = 0; i < count; i++) { @@ -1029,9 +1020,9 @@ class UsbProfileGroupSettingsManager { return removeForwardIntentIfNotNeeded(preferHighPriority(matches)); } - private final ArrayList<ResolveInfo> getAccessoryMatchesLocked( + private ArrayList<ResolveInfo> getAccessoryMatchesLocked( UsbAccessory accessory, Intent intent) { - ArrayList<ResolveInfo> matches = new ArrayList<ResolveInfo>(); + ArrayList<ResolveInfo> matches = new ArrayList<>(); List<ResolveInfo> resolveInfos = queryIntentActivitiesForAllProfiles(intent); int count = resolveInfos.size(); for (int i = 0; i < count; i++) { @@ -1402,7 +1393,7 @@ class UsbProfileGroupSettingsManager { void setDevicePackage(@NonNull UsbDevice device, @Nullable String packageName, @NonNull UserHandle user) { DeviceFilter filter = new DeviceFilter(device); - boolean changed = false; + boolean changed; synchronized (mLock) { if (packageName == null) { changed = (mDevicePreferenceMap.remove(filter) != null); @@ -1430,7 +1421,7 @@ class UsbProfileGroupSettingsManager { void setAccessoryPackage(@NonNull UsbAccessory accessory, @Nullable String packageName, @NonNull UserHandle user) { AccessoryFilter filter = new AccessoryFilter(accessory); - boolean changed = false; + boolean changed; synchronized (mLock) { if (packageName == null) { changed = (mAccessoryPreferenceMap.remove(filter) != null); @@ -1460,8 +1451,7 @@ class UsbProfileGroupSettingsManager { UserPackage userPackage = new UserPackage(packageName, user); synchronized (mLock) { if (mDevicePreferenceMap.values().contains(userPackage)) return true; - if (mAccessoryPreferenceMap.values().contains(userPackage)) return true; - return false; + return mAccessoryPreferenceMap.values().contains(userPackage); } } @@ -1493,9 +1483,9 @@ class UsbProfileGroupSettingsManager { synchronized (mLock) { if (mDevicePreferenceMap.containsValue(userPackage)) { // make a copy of the key set to avoid ConcurrentModificationException - Object[] keys = mDevicePreferenceMap.keySet().toArray(); + DeviceFilter[] keys = mDevicePreferenceMap.keySet().toArray(new DeviceFilter[0]); for (int i = 0; i < keys.length; i++) { - Object key = keys[i]; + DeviceFilter key = keys[i]; if (userPackage.equals(mDevicePreferenceMap.get(key))) { mDevicePreferenceMap.remove(key); cleared = true; @@ -1504,9 +1494,10 @@ class UsbProfileGroupSettingsManager { } if (mAccessoryPreferenceMap.containsValue(userPackage)) { // make a copy of the key set to avoid ConcurrentModificationException - Object[] keys = mAccessoryPreferenceMap.keySet().toArray(); + AccessoryFilter[] keys = + mAccessoryPreferenceMap.keySet().toArray(new AccessoryFilter[0]); for (int i = 0; i < keys.length; i++) { - Object key = keys[i]; + AccessoryFilter key = keys[i]; if (userPackage.equals(mAccessoryPreferenceMap.get(key))) { mAccessoryPreferenceMap.remove(key); cleared = true; diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java index 61e1e8f28c59..e4fcea77fa44 100644 --- a/services/usb/java/com/android/server/usb/UsbService.java +++ b/services/usb/java/com/android/server/usb/UsbService.java @@ -134,25 +134,25 @@ public class UsbService extends IUsbManager.Stub { onSwitchUser(UserHandle.USER_SYSTEM); + BroadcastReceiver receiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + final String action = intent.getAction(); + if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED + .equals(action)) { + if (mDeviceManager != null) { + mDeviceManager.updateUserRestrictions(); + } + } + } + }; + final IntentFilter filter = new IntentFilter(); filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY); filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); - mContext.registerReceiver(mReceiver, filter, null, null); + mContext.registerReceiver(receiver, filter, null, null); } - private BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - final String action = intent.getAction(); - if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED - .equals(action)) { - if (mDeviceManager != null) { - mDeviceManager.updateUserRestrictions(); - } - } - } - }; - /** * Set new {@link #mCurrentUserId} and propagate it to other modules. * @@ -681,7 +681,7 @@ public class UsbService extends IUsbManager.Stub { } } - private static final String removeLastChar(String value) { + private static String removeLastChar(String value) { return value.substring(0, value.length() - 1); } } diff --git a/services/usb/java/com/android/server/usb/UsbSettingsManager.java b/services/usb/java/com/android/server/usb/UsbSettingsManager.java index 7a55be43ffd5..c7e5998db70d 100644 --- a/services/usb/java/com/android/server/usb/UsbSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbSettingsManager.java @@ -28,6 +28,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.util.Slog; import android.util.SparseArray; + import com.android.internal.annotations.GuardedBy; import com.android.internal.util.IndentingPrintWriter; diff --git a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java index 4a34ece9524e..96c5211cecf4 100644 --- a/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java +++ b/services/usb/java/com/android/server/usb/UsbUserSettingsManager.java @@ -32,6 +32,7 @@ import android.os.Process; import android.os.UserHandle; import android.util.Slog; import android.util.SparseBooleanArray; + import com.android.internal.util.IndentingPrintWriter; import java.util.HashMap; @@ -48,10 +49,10 @@ class UsbUserSettingsManager { // Temporary mapping USB device name to list of UIDs with permissions for the device private final HashMap<String, SparseBooleanArray> mDevicePermissionMap = - new HashMap<String, SparseBooleanArray>(); + new HashMap<>(); // Temporary mapping UsbAccessory to list of UIDs with permissions for the accessory private final HashMap<UsbAccessory, SparseBooleanArray> mAccessoryPermissionMap = - new HashMap<UsbAccessory, SparseBooleanArray>(); + new HashMap<>(); private final Object mLock = new Object(); diff --git a/telecomm/java/android/telecom/Log.java b/telecomm/java/android/telecom/Log.java index de205380c3a7..3361b5b6e777 100644 --- a/telecomm/java/android/telecom/Log.java +++ b/telecomm/java/android/telecom/Log.java @@ -56,7 +56,7 @@ public class Log { public static boolean ERROR = isLoggable(android.util.Log.ERROR); private static final boolean FORCE_LOGGING = false; /* STOP SHIP if true */ - private static final boolean USER_BUILD = Build.TYPE.equals("user"); + private static final boolean USER_BUILD = Build.IS_USER; // Used to synchronize singleton logging lazy initialization private static final Object sSingletonSync = new Object(); diff --git a/telephony/java/android/telephony/MbmsDownloadManager.java b/telephony/java/android/telephony/MbmsDownloadManager.java index 79ee37a168d4..14ba7e5d274a 100644 --- a/telephony/java/android/telephony/MbmsDownloadManager.java +++ b/telephony/java/android/telephony/MbmsDownloadManager.java @@ -167,6 +167,14 @@ public class MbmsDownloadManager { "android.telephony.mbms.extra.TEMP_FILES_IN_USE"; /** + * Extra containing an instance of {@link android.telephony.mbms.ServiceInfo}, used by + * file-descriptor requests and cleanup requests to specify which service they want to + * request temp files or clean up temp files for, respectively. + */ + public static final String EXTRA_SERVICE_INFO = + "android.telephony.mbms.extra.SERVICE_INFO"; + + /** * Extra containing a single {@link Uri} indicating the location of the successfully * downloaded file. Set on the intent provided via * {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)}. @@ -388,21 +396,10 @@ public class MbmsDownloadManager { tempRootDirectory.mkdirs(); setTempFileRootDirectory(tempRootDirectory); } - request.setAppName(mDownloadAppName); - // Check if the request is a multipart download. If so, validate that the destination is - // a directory that exists. - // TODO: figure out what qualifies a request as a multipart download request. - if (request.getSourceUri().getLastPathSegment() != null && - request.getSourceUri().getLastPathSegment().contains("*")) { - File toFile = new File(request.getDestinationUri().getSchemeSpecificPart()); - if (!toFile.isDirectory()) { - throw new IllegalArgumentException("Multipart download must specify valid " + - "destination directory."); - } - } - // TODO: check to make sure destination is clear - // TODO: write download request token + + checkValidDownloadDestination(request); + writeDownloadRequestToken(request); try { downloadService.download(request, callback); } catch (RemoteException e) { @@ -435,6 +432,7 @@ public class MbmsDownloadManager { * <li>ERROR_MSDC_UNKNOWN_REQUEST</li> */ public int cancelDownload(DownloadRequest downloadRequest) { + // TODO: don't forget to delete the token return 0; } @@ -518,4 +516,54 @@ public class MbmsDownloadManager { Log.i(LOG_TAG, "Remote exception while disposing of service"); } } + + private void writeDownloadRequestToken(DownloadRequest request) { + File tempFileLocation = MbmsUtils.getEmbmsTempFileDirForService(mContext, + request.getFileServiceInfo()); + if (!tempFileLocation.exists()) { + tempFileLocation.mkdirs(); + } + String downloadTokenFileName = request.getHash() + + MbmsDownloadReceiver.DOWNLOAD_TOKEN_SUFFIX; + File token = new File(tempFileLocation, downloadTokenFileName); + if (token.exists()) { + Log.w(LOG_TAG, "Download token " + downloadTokenFileName + " already exists"); + return; + } + try { + if (!token.createNewFile()) { + throw new RuntimeException("Failed to create download token for request " + + request); + } + } catch (IOException e) { + throw new RuntimeException("Failed to create download token for request " + request + + " due to IOException " + e); + } + } + + /** + * Verifies the following: + * If a request is multi-part, + * 1. Destination Uri must exist and be a directory + * 2. Directory specified must contain no files. + * Otherwise + * 1. The file specified by the destination Uri must not exist. + */ + private void checkValidDownloadDestination(DownloadRequest request) { + File toFile = new File(request.getDestinationUri().getSchemeSpecificPart()); + if (request.isMultipartDownload()) { + if (!toFile.isDirectory()) { + throw new IllegalArgumentException("Multipart download must specify valid " + + "destination directory."); + } + if (toFile.listFiles().length > 0) { + throw new IllegalArgumentException("Destination directory must be clear of all " + + "files."); + } + } else { + if (toFile.exists()) { + throw new IllegalArgumentException("Destination file must not exist."); + } + } + } } diff --git a/telephony/java/android/telephony/Rlog.java b/telephony/java/android/telephony/Rlog.java index 2a31e3a7bda2..e0b46e10eab5 100644 --- a/telephony/java/android/telephony/Rlog.java +++ b/telephony/java/android/telephony/Rlog.java @@ -33,7 +33,7 @@ import java.security.NoSuchAlgorithmException; */ public final class Rlog { - private static final boolean USER_BUILD = Build.TYPE.equals("user"); + private static final boolean USER_BUILD = Build.IS_USER; private Rlog() { } diff --git a/telephony/java/android/telephony/TelephonyScanManager.java b/telephony/java/android/telephony/TelephonyScanManager.java index c905d3a433f3..92a21b6fb85f 100644 --- a/telephony/java/android/telephony/TelephonyScanManager.java +++ b/telephony/java/android/telephony/TelephonyScanManager.java @@ -20,15 +20,18 @@ import static com.android.internal.util.Preconditions.checkNotNull; import android.content.Context; import android.os.Binder; +import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.Messenger; +import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; import android.util.SparseArray; +import java.util.Arrays; import java.util.List; import com.android.internal.telephony.ITelephony; @@ -42,6 +45,9 @@ public final class TelephonyScanManager { private static final String TAG = "TelephonyScanManager"; /** @hide */ + public static final String SCAN_RESULT_KEY = "scanResult"; + + /** @hide */ public static final int CALLBACK_SCAN_RESULTS = 1; /** @hide */ public static final int CALLBACK_SCAN_ERROR = 2; @@ -112,7 +118,13 @@ public final class TelephonyScanManager { switch (message.what) { case CALLBACK_SCAN_RESULTS: try { - callback.onResults((List<CellInfo>) message.obj); + final Bundle b = message.getData(); + final Parcelable[] parcelables = b.getParcelableArray(SCAN_RESULT_KEY); + CellInfo[] ci = new CellInfo[parcelables.length]; + for (int i = 0; i < parcelables.length; i++) { + ci[i] = (CellInfo) parcelables[i]; + } + callback.onResults((List<CellInfo>) Arrays.asList(ci)); } catch (Exception e) { Rlog.e(TAG, "Exception in networkscan callback onResults", e); } diff --git a/telephony/java/android/telephony/euicc/EuiccManager.java b/telephony/java/android/telephony/euicc/EuiccManager.java index f22a6327c80f..8304d84d8a2b 100644 --- a/telephony/java/android/telephony/euicc/EuiccManager.java +++ b/telephony/java/android/telephony/euicc/EuiccManager.java @@ -475,6 +475,36 @@ public class EuiccManager { } } + /** + * Ensure that subscriptions will be retained on the next factory reset. + * + * <p>By default, all subscriptions on the eUICC are erased the first time a device boots (ever + * and after factory resets). This ensures that the data is wiped after a factory reset is + * performed via fastboot or recovery mode, as these modes do not support the necessary radio + * communication needed to wipe the eSIM. + * + * <p>However, this method may be called right before a factory reset issued via settings when + * the user elects to retain subscriptions. Doing so will mark them for retention so that they + * are not cleared after the ensuing reset. + * + * <p>Requires that the calling app has the {@link android.Manifest.permission#MASTER_CLEAR} + * permission. This is for internal system use only. + * + * @param callbackIntent a PendingIntent to launch when the operation completes. + * @hide + */ + public void retainSubscriptionsForFactoryReset(PendingIntent callbackIntent) { + if (!isEnabled()) { + sendUnavailableError(callbackIntent); + return; + } + try { + mController.retainSubscriptionsForFactoryReset(callbackIntent); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + private static void sendUnavailableError(PendingIntent callbackIntent) { try { callbackIntent.send(EMBEDDED_SUBSCRIPTION_RESULT_ERROR); diff --git a/telephony/java/android/telephony/ims/ImsServiceProxy.java b/telephony/java/android/telephony/ims/ImsServiceProxy.java index a75cd86dcf07..038e295d8822 100644 --- a/telephony/java/android/telephony/ims/ImsServiceProxy.java +++ b/telephony/java/android/telephony/ims/ImsServiceProxy.java @@ -90,11 +90,11 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur " status: " + status); if (mSlotId == slotId && feature == mSupportedFeature) { mFeatureStatusCached = status; + if (mStatusCallback != null) { + mStatusCallback.notifyStatusChanged(); + } } } - if (mStatusCallback != null) { - mStatusCallback.notifyStatusChanged(); - } } }; @@ -129,7 +129,9 @@ public class ImsServiceProxy extends ImsServiceProxyCompat implements IRcsFeatur @Override public void endSession(int sessionId) throws RemoteException { synchronized (mLock) { - checkServiceIsReady(); + // Only check to make sure the binder connection still exists. This method should + // still be able to be called when the state is STATE_NOT_AVAILABLE. + checkBinderConnection(); getServiceInterface(mBinder).endSession(mSlotId, mSupportedFeature, sessionId); } } diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java index c561741cc80c..907b0cbd8004 100644 --- a/telephony/java/android/telephony/mbms/DownloadRequest.java +++ b/telephony/java/android/telephony/mbms/DownloadRequest.java @@ -20,15 +20,22 @@ import android.content.Intent; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; +import android.util.Base64; import java.lang.IllegalStateException; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; /** * A Parcelable class describing a pending Cell-Broadcast download request * @hide */ public class DownloadRequest implements Parcelable { + // Version code used to keep token calculation consistent. + private static final int CURRENT_VERSION = 1; + /** @hide */ public static class Builder { private int id; @@ -37,6 +44,7 @@ public class DownloadRequest implements Parcelable { private Uri dest; private int subscriptionId; private String appIntent; + private int version = CURRENT_VERSION; public Builder setId(int id) { this.id = id; @@ -68,9 +76,14 @@ public class DownloadRequest implements Parcelable { return this; } + public Builder setVersion(int version) { + this.version = version; + return this; + } + public DownloadRequest build() { return new DownloadRequest(id, serviceInfo, source, dest, - subscriptionId, appIntent, null); + subscriptionId, appIntent, null, version); } } @@ -80,11 +93,12 @@ public class DownloadRequest implements Parcelable { private final Uri destinationUri; private final int subscriptionId; private final String serializedResultIntentForApp; + private final int version; private String appName; // not the Android app Name, the embms app name private DownloadRequest(int id, FileServiceInfo serviceInfo, Uri source, Uri dest, - int sub, String appIntent, String name) { + int sub, String appIntent, String name, int version) { downloadId = id; fileServiceInfo = serviceInfo; sourceUri = source; @@ -92,6 +106,7 @@ public class DownloadRequest implements Parcelable { subscriptionId = sub; serializedResultIntentForApp = appIntent; appName = name; + this.version = version; } public static DownloadRequest copy(DownloadRequest other) { @@ -106,6 +121,7 @@ public class DownloadRequest implements Parcelable { subscriptionId = dr.subscriptionId; serializedResultIntentForApp = dr.serializedResultIntentForApp; appName = dr.appName; + version = dr.version; } private DownloadRequest(Parcel in) { @@ -116,6 +132,7 @@ public class DownloadRequest implements Parcelable { subscriptionId = in.readInt(); serializedResultIntentForApp = in.readString(); appName = in.readString(); + version = in.readInt(); } public int describeContents() { @@ -130,6 +147,7 @@ public class DownloadRequest implements Parcelable { out.writeInt(subscriptionId); out.writeString(serializedResultIntentForApp); out.writeString(appName); + out.writeInt(version); } public int getDownloadId() { @@ -172,6 +190,10 @@ public class DownloadRequest implements Parcelable { return appName; } + public int getVersion() { + return version; + } + public static final Parcelable.Creator<DownloadRequest> CREATOR = new Parcelable.Creator<DownloadRequest>() { public DownloadRequest createFromParcel(Parcel in) { @@ -181,4 +203,35 @@ public class DownloadRequest implements Parcelable { return new DownloadRequest[size]; } }; + + /** + * @hide + */ + public boolean isMultipartDownload() { + // TODO: figure out what qualifies a request as a multipart download request. + return getSourceUri().getLastPathSegment() != null && + getSourceUri().getLastPathSegment().contains("*"); + } + + /** + * Retrieves the hash string that should be used as the filename when storing a token for + * this DownloadRequest. + * @hide + */ + public String getHash() { + MessageDigest digest; + try { + digest = MessageDigest.getInstance("SHA-256"); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Could not get sha256 hash object"); + } + if (version >= 1) { + // Hash the source URI, destination URI, and the app intent + digest.update(sourceUri.toString().getBytes(StandardCharsets.UTF_8)); + digest.update(destinationUri.toString().getBytes(StandardCharsets.UTF_8)); + digest.update(serializedResultIntentForApp.getBytes(StandardCharsets.UTF_8)); + } + // Add updates for future versions here + return Base64.encodeToString(digest.digest(), Base64.URL_SAFE | Base64.NO_WRAP); + } } diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java index b51c367deb36..1ce82d94b7e5 100644 --- a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java +++ b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java @@ -28,35 +28,85 @@ import android.telephony.MbmsDownloadManager; import android.util.Log; import java.io.File; +import java.io.FileFilter; +import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.UUID; +import java.util.function.Predicate; /** * @hide */ public class MbmsDownloadReceiver extends BroadcastReceiver { + public static final String DOWNLOAD_TOKEN_SUFFIX = ".download_token"; + public static final String MBMS_FILE_PROVIDER_META_DATA_KEY = "mbms-file-provider-authority"; + + /** + * TODO: @SystemApi all these result codes + * Indicates that the requested operation completed without error. + */ + public static final int RESULT_OK = 0; + + /** + * Indicates that the intent sent had an invalid action. This will be the result if + * {@link Intent#getAction()} returns anything other than + * {@link MbmsDownloadManager#ACTION_DOWNLOAD_RESULT_INTERNAL}, + * {@link MbmsDownloadManager#ACTION_FILE_DESCRIPTOR_REQUEST}, or + * {@link MbmsDownloadManager#ACTION_CLEANUP}. + * This is a fatal result code and no result extras should be expected. + */ + public static final int RESULT_INVALID_ACTION = 1; + + /** + * Indicates that the intent was missing some required extras. + * This is a fatal result code and no result extras should be expected. + */ + public static final int RESULT_MALFORMED_INTENT = 2; + + /** + * Indicates that the supplied value for {@link MbmsDownloadManager#EXTRA_TEMP_FILE_ROOT} + * does not match what the app has stored. + * This is a fatal result code and no result extras should be expected. + */ + public static final int RESULT_BAD_TEMP_FILE_ROOT = 3; + + /** + * Indicates that the manager was unable to move the completed download to its final location. + * This is a fatal result code and no result extras should be expected. + */ + public static final int RESULT_DOWNLOAD_FINALIZATION_ERROR = 4; + + /** + * Indicates that the manager weas unable to generate one or more of the requested file + * descriptors. + * This is a non-fatal result code -- some file descriptors may still be generated, but there + * is no guarantee that they will be the same number as requested. + */ + public static final int RESULT_TEMP_FILE_GENERATION_ERROR = 5; + private static final String LOG_TAG = "MbmsDownloadReceiver"; private static final String TEMP_FILE_SUFFIX = ".embms.temp"; private static final int MAX_TEMP_FILE_RETRIES = 5; - public static final String MBMS_FILE_PROVIDER_META_DATA_KEY = "mbms-file-provider-authority"; private String mFileProviderAuthorityCache = null; private String mMiddlewarePackageNameCache = null; @Override public void onReceive(Context context, Intent intent) { - if (!verifyIntentContents(intent)) { - setResultCode(1 /* TODO: define error constants */); + if (!verifyIntentContents(context, intent)) { + setResultCode(RESULT_MALFORMED_INTENT); return; } if (!Objects.equals(intent.getStringExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT), MbmsTempFileProvider.getEmbmsTempFileDir(context).getPath())) { - setResultCode(1 /* TODO: define error constants */); + setResultCode(RESULT_BAD_TEMP_FILE_ROOT); return; } @@ -65,11 +115,14 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { cleanupPostMove(context, intent); } else if (MbmsDownloadManager.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) { generateTempFiles(context, intent); + } else if (MbmsDownloadManager.ACTION_CLEANUP.equals(intent.getAction())) { + cleanupTempFiles(context, intent); + } else { + setResultCode(RESULT_INVALID_ACTION); } - // TODO: Add handling for ACTION_CLEANUP } - private boolean verifyIntentContents(Intent intent) { + private boolean verifyIntentContents(Context context, Intent intent) { if (MbmsDownloadManager.ACTION_DOWNLOAD_RESULT_INTERNAL.equals(intent.getAction())) { if (!intent.hasExtra(MbmsDownloadManager.EXTRA_RESULT)) { Log.w(LOG_TAG, "Download result did not include a result code. Ignoring."); @@ -93,26 +146,47 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { "temp file. Ignoring."); return false; } - return true; + DownloadRequest request = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_REQUEST); + String expectedTokenFileName = request.getHash() + DOWNLOAD_TOKEN_SUFFIX; + File expectedTokenFile = new File( + MbmsUtils.getEmbmsTempFileDirForService(context, request.getFileServiceInfo()), + expectedTokenFileName); + if (!expectedTokenFile.exists()) { + Log.w(LOG_TAG, "Supplied download request does not match a token that we have. " + + "Expected " + expectedTokenFile); + return false; + } } else if (MbmsDownloadManager.ACTION_FILE_DESCRIPTOR_REQUEST.equals(intent.getAction())) { - if (!intent.hasExtra(MbmsDownloadManager.EXTRA_REQUEST)) { - Log.w(LOG_TAG, "Temp file request not include the associated request. Ignoring."); + if (!intent.hasExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO)) { + Log.w(LOG_TAG, "Temp file request did not include the associated service info." + + " Ignoring."); return false; } if (!intent.hasExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT)) { Log.w(LOG_TAG, "Download result did not include the temp file root. Ignoring."); return false; } - return true; + } else if (MbmsDownloadManager.ACTION_CLEANUP.equals(intent.getAction())) { + if (!intent.hasExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO)) { + Log.w(LOG_TAG, "Cleanup request did not include the associated service info." + + " Ignoring."); + return false; + } + if (!intent.hasExtra(MbmsDownloadManager.EXTRA_TEMP_FILE_ROOT)) { + Log.w(LOG_TAG, "Cleanup request did not include the temp file root. Ignoring."); + return false; + } + if (!intent.hasExtra(MbmsDownloadManager.EXTRA_TEMP_FILES_IN_USE)) { + Log.w(LOG_TAG, "Cleanup request did not include the list of temp files in use. " + + "Ignoring."); + return false; + } } - - Log.w(LOG_TAG, "Received intent with unknown action: " + intent.getAction()); - return false; + return true; } private void moveDownloadedFile(Context context, Intent intent) { DownloadRequest request = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_REQUEST); - // TODO: check request against token Intent intentForApp = request.getIntentForApp(); int result = intent.getIntExtra(MbmsDownloadManager.EXTRA_RESULT, @@ -127,9 +201,9 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { Uri destinationUri = request.getDestinationUri(); Uri finalTempFile = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_FINAL_URI); - if (!verifyTempFilePath(context, request, finalTempFile)) { + if (!verifyTempFilePath(context, request.getFileServiceInfo(), finalTempFile)) { Log.w(LOG_TAG, "Download result specified an invalid temp file " + finalTempFile); - setResultCode(1); + setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR); return; } @@ -140,16 +214,15 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { if (finalFileLocation == null) { Log.w(LOG_TAG, "Failed to move temp file to final destination"); // TODO: how do we notify the app of this? - setResultCode(1); + setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR); } intentForApp.putExtra(MbmsDownloadManager.EXTRA_COMPLETED_FILE_URI, finalFileLocation); context.sendBroadcast(intentForApp); - setResultCode(0); + setResultCode(RESULT_OK); } private void cleanupPostMove(Context context, Intent intent) { - // TODO: account for in-use temp files DownloadRequest request = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_REQUEST); if (request == null) { Log.w(LOG_TAG, "Intent does not include a DownloadRequest. Ignoring."); @@ -162,7 +235,7 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { } for (Uri tempFileUri : tempFiles) { - if (verifyTempFilePath(context, request, tempFileUri)) { + if (verifyTempFilePath(context, request.getFileServiceInfo(), tempFileUri)) { File tempFile = new File(tempFileUri.getSchemeSpecificPart()); tempFile.delete(); } @@ -170,11 +243,12 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { } private void generateTempFiles(Context context, Intent intent) { - // TODO: update pursuant to final decision on temp file locations - DownloadRequest request = intent.getParcelableExtra(MbmsDownloadManager.EXTRA_REQUEST); - if (request == null) { - Log.w(LOG_TAG, "Temp file request did not include the associated request. Ignoring."); - setResultCode(1 /* TODO: define error constants */); + FileServiceInfo serviceInfo = + intent.getParcelableExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO); + if (serviceInfo == null) { + Log.w(LOG_TAG, "Temp file request did not include the associated service info. " + + "Ignoring."); + setResultCode(RESULT_MALFORMED_INTENT); return; } int fdCount = intent.getIntExtra(MbmsDownloadManager.EXTRA_FD_COUNT, 0); @@ -182,24 +256,27 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { if (fdCount == 0 && (pausedList == null || pausedList.size() == 0)) { Log.i(LOG_TAG, "No temp files actually requested. Ending."); - setResultCode(0); + setResultCode(RESULT_OK); setResultExtras(Bundle.EMPTY); return; } - ArrayList<UriPathPair> freshTempFiles = generateFreshTempFiles(context, request, fdCount); + ArrayList<UriPathPair> freshTempFiles = + generateFreshTempFiles(context, serviceInfo, fdCount); ArrayList<UriPathPair> pausedFiles = - generateUrisForPausedFiles(context, request, pausedList); + generateUrisForPausedFiles(context, serviceInfo, pausedList); Bundle result = new Bundle(); result.putParcelableArrayList(MbmsDownloadManager.EXTRA_FREE_URI_LIST, freshTempFiles); result.putParcelableArrayList(MbmsDownloadManager.EXTRA_PAUSED_URI_LIST, pausedFiles); + setResultCode(RESULT_OK); setResultExtras(result); } - private ArrayList<UriPathPair> generateFreshTempFiles(Context context, DownloadRequest request, + private ArrayList<UriPathPair> generateFreshTempFiles(Context context, + FileServiceInfo serviceInfo, int freshFdCount) { - File tempFileDir = getEmbmsTempFileDirForRequest(context, request); + File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context, serviceInfo); if (!tempFileDir.exists()) { tempFileDir.mkdirs(); } @@ -210,11 +287,11 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { for (int i = 0; i < freshFdCount; i++) { File tempFile = generateSingleTempFile(tempFileDir); if (tempFile == null) { - setResultCode(2 /* TODO: define error constants */); + setResultCode(RESULT_TEMP_FILE_GENERATION_ERROR); Log.w(LOG_TAG, "Failed to generate a temp file. Moving on."); continue; } - Uri fileUri = Uri.fromParts(ContentResolver.SCHEME_FILE, tempFile.getPath(), null); + Uri fileUri = Uri.fromFile(tempFile); Uri contentUri = MbmsTempFileProvider.getUriForFile( context, getFileProviderAuthorityCached(context), tempFile); context.grantUriPermission(getMiddlewarePackageCached(context), contentUri, @@ -243,22 +320,22 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { } private ArrayList<UriPathPair> generateUrisForPausedFiles(Context context, - DownloadRequest request, List<Uri> pausedFiles) { + FileServiceInfo serviceInfo, List<Uri> pausedFiles) { if (pausedFiles == null) { return new ArrayList<>(0); } ArrayList<UriPathPair> result = new ArrayList<>(pausedFiles.size()); for (Uri fileUri : pausedFiles) { - if (!verifyTempFilePath(context, request, fileUri)) { + if (!verifyTempFilePath(context, serviceInfo, fileUri)) { Log.w(LOG_TAG, "Supplied file " + fileUri + " is not a valid temp file to resume"); - setResultCode(2 /* TODO: define error codes */); + setResultCode(RESULT_TEMP_FILE_GENERATION_ERROR); continue; } File tempFile = new File(fileUri.getSchemeSpecificPart()); if (!tempFile.exists()) { Log.w(LOG_TAG, "Supplied file " + fileUri + " does not exist."); - setResultCode(2 /* TODO: define error codes */); + setResultCode(RESULT_TEMP_FILE_GENERATION_ERROR); continue; } Uri contentUri = MbmsTempFileProvider.getUriForFile( @@ -271,6 +348,38 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { return result; } + private void cleanupTempFiles(Context context, Intent intent) { + FileServiceInfo serviceInfo = + intent.getParcelableExtra(MbmsDownloadManager.EXTRA_SERVICE_INFO); + File tempFileDir = MbmsUtils.getEmbmsTempFileDirForService(context, serviceInfo); + List<Uri> filesInUse = + intent.getParcelableArrayListExtra(MbmsDownloadManager.EXTRA_TEMP_FILES_IN_USE); + File[] filesToDelete = tempFileDir.listFiles(new FileFilter() { + @Override + public boolean accept(File file) { + File canonicalFile; + try { + canonicalFile = file.getCanonicalFile(); + } catch (IOException e) { + Log.w(LOG_TAG, "Got IOException canonicalizing " + file + ", not deleting."); + return false; + } + // Reject all files that don't match what we think a temp file should look like + // e.g. download tokens + if (!canonicalFile.getName().endsWith(TEMP_FILE_SUFFIX)) { + return false; + } + // If any of the files in use match the uri, return false to reject it from the + // list to delete. + Uri fileInUseUri = Uri.fromFile(canonicalFile); + return !filesInUse.contains(fileInUseUri); + } + }); + for (File fileToDelete : filesToDelete) { + fileToDelete.delete(); + } + } + private static String calculateDestinationFileRelativePath(DownloadRequest request, FileInfo info) { List<String> filePathComponents = info.getUri().getPathSegments(); @@ -330,7 +439,7 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { return null; } - private static boolean verifyTempFilePath(Context context, DownloadRequest request, + private static boolean verifyTempFilePath(Context context, FileServiceInfo serviceInfo, Uri filePath) { // TODO: modify pursuant to final decision on temp file path scheme if (!ContentResolver.SCHEME_FILE.equals(filePath.getScheme())) { @@ -345,24 +454,14 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { return false; } - if (!MbmsUtils.isContainedIn(getEmbmsTempFileDirForRequest(context, request), tempFile)) { + if (!MbmsUtils.isContainedIn( + MbmsUtils.getEmbmsTempFileDirForService(context, serviceInfo), tempFile)) { return false; } return true; } - /** - * Returns a File linked to the directory used to store temp files for this request - */ - private static File getEmbmsTempFileDirForRequest(Context context, DownloadRequest request) { - File embmsTempFileDir = MbmsTempFileProvider.getEmbmsTempFileDir(context); - - // TODO: better naming scheme for temp file dirs - String tempFileDirName = String.valueOf(request.getFileServiceInfo().getServiceId()); - return new File(embmsTempFileDir, tempFileDirName); - } - private String getFileProviderAuthorityCached(Context context) { if (mFileProviderAuthorityCache != null) { return mFileProviderAuthorityCache; diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java index 7d4727563eee..b28950ec758f 100644 --- a/telephony/java/android/telephony/mbms/MbmsUtils.java +++ b/telephony/java/android/telephony/mbms/MbmsUtils.java @@ -85,4 +85,14 @@ public class MbmsUtils { context.bindService(bindIntent, serviceConnection, Context.BIND_AUTO_CREATE); } + + /** + * Returns a File linked to the directory used to store temp files for this file service + */ + public static File getEmbmsTempFileDirForService(Context context, FileServiceInfo serviceInfo) { + File embmsTempFileDir = MbmsTempFileProvider.getEmbmsTempFileDir(context); + + String tempFileDirName = String.valueOf(serviceInfo.getServiceId()); + return new File(embmsTempFileDir, tempFileDirName); + } } diff --git a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl index fa43631cee9e..b3fc90db75d3 100644 --- a/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl +++ b/telephony/java/com/android/internal/telephony/euicc/IEuiccController.aidl @@ -40,4 +40,5 @@ interface IEuiccController { oneway void updateSubscriptionNickname(int subscriptionId, String nickname, in PendingIntent callbackIntent); oneway void eraseSubscriptions(in PendingIntent callbackIntent); + oneway void retainSubscriptionsForFactoryReset(in PendingIntent callbackIntent); }
\ No newline at end of file diff --git a/test-runner/src/android/test/ClassPathPackageInfo.java b/test-runner/src/android/test/ClassPathPackageInfo.java deleted file mode 100644 index 2cf76afa1d94..000000000000 --- a/test-runner/src/android/test/ClassPathPackageInfo.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2008 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 android.test; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; - -/** - * The Package object doesn't allow you to iterate over the contained - * classes and subpackages of that package. This is a version that does. - * - * {@hide} Not needed for 1.0 SDK. - */ -@Deprecated -public class ClassPathPackageInfo { - - private final ClassPathPackageInfoSource source; - private final String packageName; - private final Set<String> subpackageNames; - private final Set<Class<?>> topLevelClasses; - - ClassPathPackageInfo(ClassPathPackageInfoSource source, String packageName, - Set<String> subpackageNames, Set<Class<?>> topLevelClasses) { - this.source = source; - this.packageName = packageName; - this.subpackageNames = Collections.unmodifiableSet(subpackageNames); - this.topLevelClasses = Collections.unmodifiableSet(topLevelClasses); - } - - public Set<ClassPathPackageInfo> getSubpackages() { - Set<ClassPathPackageInfo> info = new HashSet<>(); - for (String name : subpackageNames) { - info.add(source.getPackageInfo(name)); - } - return info; - } - - public Set<Class<?>> getTopLevelClassesRecursive() { - Set<Class<?>> set = new HashSet<>(); - addTopLevelClassesTo(set); - return set; - } - - private void addTopLevelClassesTo(Set<Class<?>> set) { - set.addAll(topLevelClasses); - for (ClassPathPackageInfo info : getSubpackages()) { - info.addTopLevelClassesTo(set); - } - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof ClassPathPackageInfo) { - ClassPathPackageInfo that = (ClassPathPackageInfo) obj; - return (this.packageName).equals(that.packageName); - } - return false; - } - - @Override - public int hashCode() { - return packageName.hashCode(); - } -} diff --git a/test-runner/src/android/test/ClassPathPackageInfoSource.java b/test-runner/src/android/test/ClassPathPackageInfoSource.java index 9bcc25adf8d3..755b540cbbb8 100644 --- a/test-runner/src/android/test/ClassPathPackageInfoSource.java +++ b/test-runner/src/android/test/ClassPathPackageInfoSource.java @@ -21,15 +21,12 @@ import dalvik.system.DexFile; import java.io.File; import java.io.IOException; +import java.util.Collections; import java.util.Enumeration; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; import java.util.TreeSet; import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; /** * Generate {@link ClassPathPackageInfo}s by scanning apk paths. @@ -39,11 +36,13 @@ import java.util.zip.ZipFile; @Deprecated public class ClassPathPackageInfoSource { - private static final String CLASS_EXTENSION = ".class"; - private static final ClassLoader CLASS_LOADER = ClassPathPackageInfoSource.class.getClassLoader(); + private static String[] apkPaths; + + private static ClassPathPackageInfoSource classPathSource; + private final SimpleCache<String, ClassPathPackageInfo> cache = new SimpleCache<String, ClassPathPackageInfo>() { @Override @@ -54,23 +53,28 @@ public class ClassPathPackageInfoSource { // The class path of the running application private final String[] classPath; - private static String[] apkPaths; - // A cache of jar file contents - private final Map<File, Set<String>> jarFiles = new HashMap<>(); - private ClassLoader classLoader; + private final ClassLoader classLoader; - ClassPathPackageInfoSource() { + private ClassPathPackageInfoSource(ClassLoader classLoader) { + this.classLoader = classLoader; classPath = getClassPath(); } - - public static void setApkPaths(String[] apkPaths) { + static void setApkPaths(String[] apkPaths) { ClassPathPackageInfoSource.apkPaths = apkPaths; } - public ClassPathPackageInfo getPackageInfo(String pkgName) { - return cache.get(pkgName); + public static ClassPathPackageInfoSource forClassPath(ClassLoader classLoader) { + if (classPathSource == null) { + classPathSource = new ClassPathPackageInfoSource(classLoader); + } + return classPathSource; + } + + public Set<Class<?>> getTopLevelClassesRecursive(String packageName) { + ClassPathPackageInfo packageInfo = cache.get(packageName); + return packageInfo.getTopLevelClassesRecursive(); } private ClassPathPackageInfo createPackageInfo(String packageName) { @@ -96,7 +100,7 @@ public class ClassPathPackageInfoSource { + "'. Message: " + e.getMessage(), e); } } - return new ClassPathPackageInfo(this, packageName, subpackageNames, + return new ClassPathPackageInfo(packageName, subpackageNames, topLevelClasses); } @@ -107,9 +111,6 @@ public class ClassPathPackageInfoSource { */ private void findClasses(String packageName, Set<String> classNames, Set<String> subpackageNames) { - String packagePrefix = packageName + '.'; - String pathPrefix = packagePrefix.replace('.', '/'); - for (String entryName : classPath) { File classPathEntry = new File(entryName); @@ -150,58 +151,6 @@ public class ClassPathPackageInfoSource { /** * Finds all classes and sub packages that are below the packageName and - * add them to the respective sets. Searches the package in a class directory. - */ - private void findClassesInDirectory(File classDir, - String packagePrefix, String pathPrefix, Set<String> classNames, - Set<String> subpackageNames) - throws IOException { - File directory = new File(classDir, pathPrefix); - - if (directory.exists()) { - for (File f : directory.listFiles()) { - String name = f.getName(); - if (name.endsWith(CLASS_EXTENSION) && isToplevelClass(name)) { - classNames.add(packagePrefix + getClassName(name)); - } else if (f.isDirectory()) { - subpackageNames.add(packagePrefix + name); - } - } - } - } - - /** - * Finds all classes and sub packages that are below the packageName and - * add them to the respective sets. Searches the package in a single jar file. - */ - private void findClassesInJar(File jarFile, String pathPrefix, - Set<String> classNames, Set<String> subpackageNames) - throws IOException { - Set<String> entryNames = getJarEntries(jarFile); - // check if the Jar contains the package. - if (!entryNames.contains(pathPrefix)) { - return; - } - int prefixLength = pathPrefix.length(); - for (String entryName : entryNames) { - if (entryName.startsWith(pathPrefix)) { - if (entryName.endsWith(CLASS_EXTENSION)) { - // check if the class is in the package itself or in one of its - // subpackages. - int index = entryName.indexOf('/', prefixLength); - if (index >= 0) { - String p = entryName.substring(0, index).replace('/', '.'); - subpackageNames.add(p); - } else if (isToplevelClass(entryName)) { - classNames.add(getClassName(entryName).replace('/', '.')); - } - } - } - } - } - - /** - * Finds all classes and sub packages that are below the packageName and * add them to the respective sets. Searches the package in a single apk file. */ private void findClassesInApk(String apkPath, String packageName, @@ -242,47 +191,6 @@ public class ClassPathPackageInfoSource { } /** - * Gets the class and package entries from a Jar. - */ - private Set<String> getJarEntries(File jarFile) - throws IOException { - Set<String> entryNames = jarFiles.get(jarFile); - if (entryNames == null) { - entryNames = new HashSet<>(); - ZipFile zipFile = new ZipFile(jarFile); - Enumeration<? extends ZipEntry> entries = zipFile.entries(); - while (entries.hasMoreElements()) { - String entryName = entries.nextElement().getName(); - if (entryName.endsWith(CLASS_EXTENSION)) { - // add the entry name of the class - entryNames.add(entryName); - - // add the entry name of the classes package, i.e. the entry name of - // the directory that the class is in. Used to quickly skip jar files - // if they do not contain a certain package. - // - // Also add parent packages so that a JAR that contains - // pkg1/pkg2/Foo.class will be marked as containing pkg1/ in addition - // to pkg1/pkg2/ and pkg1/pkg2/Foo.class. We're still interested in - // JAR files that contains subpackages of a given package, even if - // an intermediate package contains no direct classes. - // - // Classes in the default package will cause a single package named - // "" to be added instead. - int lastIndex = entryName.lastIndexOf('/'); - do { - String packageName = entryName.substring(0, lastIndex + 1); - entryNames.add(packageName); - lastIndex = entryName.lastIndexOf('/', lastIndex - 1); - } while (lastIndex > 0); - } - } - jarFiles.put(jarFile, entryNames); - } - return entryNames; - } - - /** * Checks if a given file name represents a toplevel class. */ private static boolean isToplevelClass(String fileName) { @@ -290,14 +198,6 @@ public class ClassPathPackageInfoSource { } /** - * Given the absolute path of a class file, return the class name. - */ - private static String getClassName(String className) { - int classNameEnd = className.length() - CLASS_EXTENSION.length(); - return className.substring(0, classNameEnd); - } - - /** * Gets the class path from the System Property "java.class.path" and splits * it up into the individual elements. */ @@ -307,7 +207,56 @@ public class ClassPathPackageInfoSource { return classPath.split(Pattern.quote(separator)); } - public void setClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; + /** + * The Package object doesn't allow you to iterate over the contained + * classes and subpackages of that package. This is a version that does. + */ + private class ClassPathPackageInfo { + + private final String packageName; + private final Set<String> subpackageNames; + private final Set<Class<?>> topLevelClasses; + + private ClassPathPackageInfo(String packageName, + Set<String> subpackageNames, Set<Class<?>> topLevelClasses) { + this.packageName = packageName; + this.subpackageNames = Collections.unmodifiableSet(subpackageNames); + this.topLevelClasses = Collections.unmodifiableSet(topLevelClasses); + } + + private Set<ClassPathPackageInfo> getSubpackages() { + Set<ClassPathPackageInfo> info = new HashSet<>(); + for (String name : subpackageNames) { + info.add(cache.get(name)); + } + return info; + } + + private Set<Class<?>> getTopLevelClassesRecursive() { + Set<Class<?>> set = new HashSet<>(); + addTopLevelClassesTo(set); + return set; + } + + private void addTopLevelClassesTo(Set<Class<?>> set) { + set.addAll(topLevelClasses); + for (ClassPathPackageInfo info : getSubpackages()) { + info.addTopLevelClassesTo(set); + } + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof ClassPathPackageInfo) { + ClassPathPackageInfo that = (ClassPathPackageInfo) obj; + return (this.packageName).equals(that.packageName); + } + return false; + } + + @Override + public int hashCode() { + return packageName.hashCode(); + } } } diff --git a/test-runner/src/android/test/PackageInfoSources.java b/test-runner/src/android/test/PackageInfoSources.java deleted file mode 100644 index 205f86b04d5f..000000000000 --- a/test-runner/src/android/test/PackageInfoSources.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2008 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 android.test; - -/** - * {@hide} Not needed for SDK. - */ -@Deprecated -public class PackageInfoSources { - - private static ClassPathPackageInfoSource classPathSource; - - private PackageInfoSources() { - } - - public static ClassPathPackageInfoSource forClassPath(ClassLoader classLoader) { - if (classPathSource == null) { - classPathSource = new ClassPathPackageInfoSource(); - classPathSource.setClassLoader(classLoader); - } - return classPathSource; - } - -} diff --git a/test-runner/src/android/test/suitebuilder/TestGrouping.java b/test-runner/src/android/test/suitebuilder/TestGrouping.java index 307afb55e47a..030bc426ac19 100644 --- a/test-runner/src/android/test/suitebuilder/TestGrouping.java +++ b/test-runner/src/android/test/suitebuilder/TestGrouping.java @@ -16,9 +16,7 @@ package android.test.suitebuilder; -import android.test.ClassPathPackageInfo; import android.test.ClassPathPackageInfoSource; -import android.test.PackageInfoSources; import android.util.Log; import com.android.internal.util.Predicate; import junit.framework.TestCase; @@ -131,10 +129,9 @@ class TestGrouping { } private List<Class<? extends TestCase>> testCaseClassesInPackage(String packageName) { - ClassPathPackageInfoSource source = PackageInfoSources.forClassPath(classLoader); - ClassPathPackageInfo packageInfo = source.getPackageInfo(packageName); + ClassPathPackageInfoSource source = ClassPathPackageInfoSource.forClassPath(classLoader); - return selectTestClasses(packageInfo.getTopLevelClassesRecursive()); + return selectTestClasses(source.getTopLevelClassesRecursive(packageName)); } @SuppressWarnings("unchecked") diff --git a/test-runner/tests/Android.mk b/test-runner/tests/Android.mk index cc9b01d18fa6..7ee047e47058 100644 --- a/test-runner/tests/Android.mk +++ b/test-runner/tests/Android.mk @@ -18,7 +18,7 @@ include $(CLEAR_VARS) # We only want this apk build for tests. # # Run the tests using the following commands: -# adb -r install ${ANDROID_PRODUCT_OUT}/data/app/FrameworkTestRunnerTests/FrameworkTestRunnerTests.apk +# adb install -r ${ANDROID_PRODUCT_OUT}/data/app/FrameworkTestRunnerTests/FrameworkTestRunnerTests.apk # adb shell am instrument \ -e notAnnotation android.test.suitebuilder.examples.error.RunAsPartOfSeparateTest \ -w com.android.frameworks.testrunner.tests/android.test.InstrumentationTestRunner diff --git a/tests/radio/src/android/hardware/radio/tests/RadioTest.java b/tests/radio/src/android/hardware/radio/tests/RadioTest.java index 82ce4393f44a..b7a5ac4eb19b 100644 --- a/tests/radio/src/android/hardware/radio/tests/RadioTest.java +++ b/tests/radio/src/android/hardware/radio/tests/RadioTest.java @@ -123,10 +123,11 @@ public class RadioTest { // find FM band and build its config mModule = mModules.get(0); for (RadioManager.BandDescriptor band : mModule.getBands()) { - if (band.getType() == RadioManager.BAND_AM) { + int bandType = band.getType(); + if (bandType == RadioManager.BAND_AM || bandType == RadioManager.BAND_AM_HD) { mAmBandDescriptor = (RadioManager.AmBandDescriptor)band; } - if (band.getType() == RadioManager.BAND_FM) { + if (bandType == RadioManager.BAND_FM || bandType == RadioManager.BAND_FM_HD) { mFmBandDescriptor = (RadioManager.FmBandDescriptor)band; } } diff --git a/tests/testables/src/android/testing/TestableInstrumentation.java b/tests/testables/src/android/testing/TestableInstrumentation.java new file mode 100644 index 000000000000..93fed859cf39 --- /dev/null +++ b/tests/testables/src/android/testing/TestableInstrumentation.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2017 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 android.testing; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.os.TestLooperManager; +import android.support.test.runner.AndroidJUnitRunner; +import android.util.Log; + +import java.util.ArrayList; + +/** + * Wrapper around instrumentation that spins up a TestLooperManager around + * the main looper whenever a test is not using it to attempt to stop crashes + * from stopping other tests from running. + */ +public class TestableInstrumentation extends AndroidJUnitRunner { + + private static final String TAG = "TestableInstrumentation"; + + private static final int MAX_CRASHES = 5; + private static MainLooperManager sManager; + + @Override + public void onCreate(Bundle arguments) { + sManager = new MainLooperManager(); + Log.setWtfHandler((tag, what, system) -> { + if (system) { + Log.e(TAG, "WTF!!", what); + } else { + // These normally kill the app, but we don't want that in a test, instead we want + // it to throw. + throw new RuntimeException(what); + } + }); + super.onCreate(arguments); + } + + @Override + public void finish(int resultCode, Bundle results) { + sManager.destroy(); + super.finish(resultCode, results); + } + + public static void acquireMain() { + if (sManager != null) { + sManager.acquireMain(); + } + } + + public static void releaseMain() { + if (sManager != null) { + sManager.releaseMain(); + } + } + + public class MainLooperManager implements Runnable { + + private final ArrayList<Throwable> mExceptions = new ArrayList<>(); + private Message mStopMessage; + private final Handler mMainHandler; + private TestLooperManager mManager; + + public MainLooperManager() { + mMainHandler = new Handler(Looper.getMainLooper()); + startManaging(); + } + + @Override + public void run() { + try { + synchronized (this) { + // Let the thing starting us know we are up and ready to run. + notify(); + } + while (true) { + Message m = mManager.next(); + if (m == mStopMessage) { + mManager.recycle(m); + return; + } + try { + mManager.execute(m); + } catch (Throwable t) { + if (!checkStack(t) || (mExceptions.size() == MAX_CRASHES)) { + throw t; + } + mExceptions.add(t); + Log.d(TAG, "Ignoring exception to run more tests", t); + } + mManager.recycle(m); + } + } finally { + mManager.release(); + synchronized (this) { + // Let the caller know we are done managing the main thread. + notify(); + } + } + } + + private boolean checkStack(Throwable t) { + StackTraceElement topStack = t.getStackTrace()[0]; + String className = topStack.getClassName(); + if (className.equals(TestLooperManager.class.getName())) { + topStack = t.getCause().getStackTrace()[0]; + className = topStack.getClassName(); + } + // Only interested in blocking exceptions from the app itself, not from android + // framework. + return !className.startsWith("android.") + && !className.startsWith("com.android.internal"); + } + + public void destroy() { + mStopMessage.sendToTarget(); + if (mExceptions.size() != 0) { + throw new RuntimeException("Exception caught during tests", mExceptions.get(0)); + } + } + + public void acquireMain() { + synchronized (this) { + mStopMessage.sendToTarget(); + try { + wait(); + } catch (InterruptedException e) { + } + } + } + + public void releaseMain() { + startManaging(); + } + + private void startManaging() { + mStopMessage = mMainHandler.obtainMessage(); + synchronized (this) { + mManager = acquireLooperManager(Looper.getMainLooper()); + // This bit needs to happen on a background thread or it will hang if called + // from the same thread we are looking to block. + new Thread(() -> { + // Post a message to the main handler that will manage executing all future + // messages. + mMainHandler.post(this); + while (!mManager.hasMessages(mMainHandler, null, this)); + // Lastly run the message that executes this so it can manage the main thread. + Message next = mManager.next(); + // Run through messages until we reach ours. + while (next.getCallback() != this) { + mManager.execute(next); + mManager.recycle(next); + next = mManager.next(); + } + mManager.execute(next); + }).start(); + if (Looper.myLooper() != Looper.getMainLooper()) { + try { + wait(); + } catch (InterruptedException e) { + } + } + } + } + } +} diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java index f6c3cb3ec498..f1a70921a469 100644 --- a/tests/testables/src/android/testing/TestableLooper.java +++ b/tests/testables/src/android/testing/TestableLooper.java @@ -29,7 +29,6 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.lang.reflect.Field; import java.util.Map; /** @@ -49,7 +48,7 @@ public class TestableLooper { private TestLooperManager mQueueWrapper; public TestableLooper(Looper l) throws Exception { - this(InstrumentationRegistry.getInstrumentation().acquireLooperManager(l), l); + this(acquireLooperManager(l), l); } private TestableLooper(TestLooperManager wrapper, Looper l) throws Exception { @@ -78,6 +77,9 @@ public class TestableLooper { */ public void destroy() throws NoSuchFieldException, IllegalAccessException { mQueueWrapper.release(); + if (mLooper == Looper.getMainLooper()) { + TestableInstrumentation.releaseMain(); + } } /** @@ -196,6 +198,13 @@ public class TestableLooper { } } + private static TestLooperManager acquireLooperManager(Looper l) { + if (l == Looper.getMainLooper()) { + TestableInstrumentation.acquireMain(); + } + return InstrumentationRegistry.getInstrumentation().acquireLooperManager(l); + } + private static final Map<Object, TestableLooper> sLoopers = new ArrayMap<>(); /** @@ -247,8 +256,7 @@ public class TestableLooper { } boolean set = mTestableLooper.mQueueWrapper == null; if (set) { - mTestableLooper.mQueueWrapper = InstrumentationRegistry.getInstrumentation() - .acquireLooperManager(mLooper); + mTestableLooper.mQueueWrapper = acquireLooperManager(mLooper); } try { Object[] ret = new Object[1]; @@ -283,6 +291,9 @@ public class TestableLooper { if (set) { mTestableLooper.mQueueWrapper.release(); mTestableLooper.mQueueWrapper = null; + if (mLooper == Looper.getMainLooper()) { + TestableInstrumentation.releaseMain(); + } } } } diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp index deeef6ebbcb7..6e6a2ba6fc50 100644 --- a/tools/aapt2/ResourceUtils.cpp +++ b/tools/aapt2/ResourceUtils.cpp @@ -512,7 +512,7 @@ std::unique_ptr<BinaryPrimitive> MakeBool(bool val) { } std::unique_ptr<BinaryPrimitive> TryParseInt(const StringPiece& str) { - std::u16string str16 = util::Utf8ToUtf16(str); + std::u16string str16 = util::Utf8ToUtf16(util::TrimWhitespace(str)); android::Res_value value; if (!android::ResTable::stringToInt(str16.data(), str16.size(), &value)) { return {}; @@ -521,7 +521,7 @@ std::unique_ptr<BinaryPrimitive> TryParseInt(const StringPiece& str) { } std::unique_ptr<BinaryPrimitive> TryParseFloat(const StringPiece& str) { - std::u16string str16 = util::Utf8ToUtf16(str); + std::u16string str16 = util::Utf8ToUtf16(util::TrimWhitespace(str)); android::Res_value value; if (!android::ResTable::stringToFloat(str16.data(), str16.size(), &value)) { return {}; diff --git a/tools/aapt2/ResourceUtils_test.cpp b/tools/aapt2/ResourceUtils_test.cpp index 3a5e685e6b94..e637c3ee2f3c 100644 --- a/tools/aapt2/ResourceUtils_test.cpp +++ b/tools/aapt2/ResourceUtils_test.cpp @@ -36,6 +36,8 @@ TEST(ResourceUtilsTest, ParseBool) { EXPECT_THAT(ResourceUtils::ParseBool("false"), Eq(Maybe<bool>(false))); EXPECT_THAT(ResourceUtils::ParseBool("FALSE"), Eq(Maybe<bool>(false))); EXPECT_THAT(ResourceUtils::ParseBool("False"), Eq(Maybe<bool>(false))); + + EXPECT_THAT(ResourceUtils::ParseBool(" False\n "), Eq(Maybe<bool>(false))); } TEST(ResourceUtilsTest, ParseResourceName) { @@ -199,4 +201,16 @@ TEST(ResourceUtilsTest, EmptyIsBinaryPrimitive) { ASSERT_THAT(ResourceUtils::TryParseNullOrEmpty("@empty"), Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_NULL, Res_value::DATA_NULL_EMPTY)))); } +TEST(ResourceUtilsTest, ItemsWithWhitespaceAreParsedCorrectly) { + EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" 12\n ", ResTable_map::TYPE_INTEGER), + Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_INT_DEC, 12u)))); + EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" true\n ", ResTable_map::TYPE_BOOLEAN), + Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_INT_BOOLEAN, 0xffffffffu)))); + + const float expected_float = 12.0f; + const uint32_t expected_float_flattened = *(uint32_t*)&expected_float; + EXPECT_THAT(ResourceUtils::TryParseItemForAttribute(" 12.0\n ", ResTable_map::TYPE_FLOAT), + Pointee(ValueEq(BinaryPrimitive(Res_value::TYPE_FLOAT, expected_float_flattened)))); +} + } // namespace aapt diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp index 740a401f9b57..e6bf3a6f9f56 100644 --- a/tools/aapt2/cmd/Link.cpp +++ b/tools/aapt2/cmd/Link.cpp @@ -989,7 +989,8 @@ class LinkCommand { manifest_class->GetCommentBuilder()->AppendComment(proper_annotation); } - const std::string& package_utf8 = context_->GetCompilationPackage(); + const std::string package_utf8 = + options_.custom_java_package.value_or_default(context_->GetCompilationPackage()); std::string out_path = options_.generate_java_class_path.value(); file::AppendPath(&out_path, file::PackageToPath(package_utf8)); diff --git a/tools/aapt2/java/ManifestClassGenerator_test.cpp b/tools/aapt2/java/ManifestClassGenerator_test.cpp index 5ebf508807e8..9f6ec210a6a7 100644 --- a/tools/aapt2/java/ManifestClassGenerator_test.cpp +++ b/tools/aapt2/java/ManifestClassGenerator_test.cpp @@ -18,124 +18,115 @@ #include "test/Test.h" -namespace aapt { +using ::testing::HasSubstr; +using ::testing::Not; -static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, - xml::XmlResource* res, - std::string* out_str) { - std::unique_ptr<ClassDefinition> manifest_class = - GenerateManifestClass(context->GetDiagnostics(), res); - if (!manifest_class) { - return ::testing::AssertionFailure() << "manifest_class == nullptr"; - } - - std::stringstream out; - if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true, - &out)) { - return ::testing::AssertionFailure() << "failed to write java file"; - } +namespace aapt { - *out_str = out.str(); - return ::testing::AssertionSuccess(); -} +static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, + std::string* out_str); TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); - std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"EOF( - <manifest xmlns:android="http://schemas.android.com/apk/res/android"> - <permission android:name="android.permission.ACCESS_INTERNET" /> - <permission android:name="android.DO_DANGEROUS_THINGS" /> - <permission android:name="com.test.sample.permission.HUH" /> - <permission-group android:name="foo.bar.PERMISSION" /> - </manifest>)EOF"); + std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"( + <manifest xmlns:android="http://schemas.android.com/apk/res/android"> + <permission android:name="android.permission.ACCESS_INTERNET" /> + <permission android:name="android.DO_DANGEROUS_THINGS" /> + <permission android:name="com.test.sample.permission.HUH" /> + <permission-group android:name="foo.bar.PERMISSION" /> + </manifest>)"); std::string actual; ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); - const size_t permission_class_pos = - actual.find("public static final class permission {"); - const size_t permission_croup_class_pos = + ASSERT_THAT(actual, HasSubstr("public static final class permission {")); + ASSERT_THAT(actual, HasSubstr("public static final class permission_group {")); + + const size_t permission_start_pos = actual.find("public static final class permission {"); + const size_t permission_group_start_pos = actual.find("public static final class permission_group {"); - ASSERT_NE(std::string::npos, permission_class_pos); - ASSERT_NE(std::string::npos, permission_croup_class_pos); // // Make sure these permissions are in the permission class. // - - size_t pos = actual.find( - "public static final String ACCESS_INTERNET=" - "\"android.permission.ACCESS_INTERNET\";"); - EXPECT_GT(pos, permission_class_pos); - EXPECT_LT(pos, permission_croup_class_pos); - - pos = actual.find( - "public static final String DO_DANGEROUS_THINGS=" - "\"android.DO_DANGEROUS_THINGS\";"); - EXPECT_GT(pos, permission_class_pos); - EXPECT_LT(pos, permission_croup_class_pos); - - pos = actual.find( - "public static final String HUH=\"com.test.sample.permission.HUH\";"); - EXPECT_GT(pos, permission_class_pos); - EXPECT_LT(pos, permission_croup_class_pos); + const std::string permission_class = + actual.substr(permission_start_pos, permission_group_start_pos - permission_start_pos); + + EXPECT_THAT( + permission_class, + HasSubstr( + "public static final String ACCESS_INTERNET=\"android.permission.ACCESS_INTERNET\";")); + EXPECT_THAT( + permission_class, + HasSubstr("public static final String DO_DANGEROUS_THINGS=\"android.DO_DANGEROUS_THINGS\";")); + EXPECT_THAT(permission_class, + HasSubstr("public static final String HUH=\"com.test.sample.permission.HUH\";")); // // Make sure these permissions are in the permission_group class // + const std::string permission_group_class = actual.substr(permission_group_start_pos); - pos = actual.find( - "public static final String PERMISSION=" - "\"foo.bar.PERMISSION\";"); - EXPECT_GT(pos, permission_croup_class_pos); - EXPECT_LT(pos, std::string::npos); + EXPECT_THAT(permission_group_class, + HasSubstr("public static final String PERMISSION=\"foo.bar.PERMISSION\";")); } TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); - std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"EOF( - <manifest xmlns:android="http://schemas.android.com/apk/res/android"> - <!-- Required to access the internet. - Added in API 1. --> - <permission android:name="android.permission.ACCESS_INTERNET" /> - <!-- @deprecated This permission is for playing outside. --> - <permission android:name="android.permission.PLAY_OUTSIDE" /> - <!-- This is a private permission for system only! - @hide - @SystemApi --> - <permission android:name="android.permission.SECRET" /> - </manifest>)EOF"); + std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"( + <manifest xmlns:android="http://schemas.android.com/apk/res/android"> + <!-- Required to access the internet. + Added in API 1. --> + <permission android:name="android.permission.ACCESS_INTERNET" /> + <!-- @deprecated This permission is for playing outside. --> + <permission android:name="android.permission.PLAY_OUTSIDE" /> + <!-- This is a private permission for system only! + @hide + @SystemApi --> + <permission android:name="android.permission.SECRET" /> + </manifest>)"); std::string actual; ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); - const char* expected_access_internet = - R"EOF( /** + const char* expected_access_internet = R"( /** * Required to access the internet. * Added in API 1. */ - public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)EOF"; - - EXPECT_NE(std::string::npos, actual.find(expected_access_internet)); + public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)"; + EXPECT_THAT(actual, HasSubstr(expected_access_internet)); - const char* expected_play_outside = - R"EOF( /** + const char* expected_play_outside = R"( /** * @deprecated This permission is for playing outside. */ @Deprecated - public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)EOF"; - - EXPECT_NE(std::string::npos, actual.find(expected_play_outside)); + public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)"; + EXPECT_THAT(actual, HasSubstr(expected_play_outside)); - const char* expected_secret = - R"EOF( /** + const char* expected_secret = R"( /** * This is a private permission for system only! * @hide */ @android.annotation.SystemApi - public static final String SECRET="android.permission.SECRET";)EOF"; + public static final String SECRET="android.permission.SECRET";)"; + EXPECT_THAT(actual, HasSubstr(expected_secret)); +} - EXPECT_NE(std::string::npos, actual.find(expected_secret)); +static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, + std::string* out_str) { + std::unique_ptr<ClassDefinition> manifest_class = + GenerateManifestClass(context->GetDiagnostics(), res); + if (!manifest_class) { + return ::testing::AssertionFailure() << "manifest_class == nullptr"; + } + + std::stringstream out; + if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true, &out)) { + return ::testing::AssertionFailure() << "failed to write java file"; + } + + *out_str = out.str(); + return ::testing::AssertionSuccess(); } } // namespace aapt diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp index 624a559c4dae..5f61faeeebe7 100644 --- a/tools/aapt2/java/ProguardRules.cpp +++ b/tools/aapt2/java/ProguardRules.cpp @@ -85,7 +85,11 @@ class LayoutVisitor : public BaseVisitor { bool check_class = false; bool check_name = false; if (node->namespace_uri.empty()) { - check_class = node->name == "view" || node->name == "fragment"; + if (node->name == "view") { + check_class = true; + } else if (node->name == "fragment") { + check_class = check_name = true; + } } else if (node->namespace_uri == xml::kSchemaAndroid) { check_name = node->name == "fragment"; } @@ -110,6 +114,32 @@ class LayoutVisitor : public BaseVisitor { DISALLOW_COPY_AND_ASSIGN(LayoutVisitor); }; +class MenuVisitor : public BaseVisitor { + public: + MenuVisitor(const Source& source, KeepSet* keep_set) : BaseVisitor(source, keep_set) { + } + + virtual void Visit(xml::Element* node) override { + if (node->namespace_uri.empty() && node->name == "item") { + for (const auto& attr : node->attributes) { + if (attr.namespace_uri == xml::kSchemaAndroid) { + if ((attr.name == "actionViewClass" || attr.name == "actionProviderClass") && + util::IsJavaClassName(attr.value)) { + AddClass(node->line_number, attr.value); + } else if (attr.name == "onClick") { + AddMethod(node->line_number, attr.value); + } + } + } + } + + BaseVisitor::Visit(node); + } + + private: + DISALLOW_COPY_AND_ASSIGN(MenuVisitor); +}; + class XmlResourceVisitor : public BaseVisitor { public: XmlResourceVisitor(const Source& source, KeepSet* keep_set) @@ -267,6 +297,12 @@ bool CollectProguardRules(const Source& source, xml::XmlResource* res, break; } + case ResourceType::kMenu: { + MenuVisitor visitor(source, keep_set); + res->root->Accept(&visitor); + break; + } + default: break; } diff --git a/tools/aapt2/java/ProguardRules_test.cpp b/tools/aapt2/java/ProguardRules_test.cpp new file mode 100644 index 000000000000..900b07339715 --- /dev/null +++ b/tools/aapt2/java/ProguardRules_test.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2017 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. + */ + +#include "java/ProguardRules.h" + +#include "test/Test.h" + +using ::testing::HasSubstr; +using ::testing::Not; + +namespace aapt { + +TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"( + <fragment xmlns:android="http://schemas.android.com/apk/res/android" + android:name="com.foo.Bar"/>)"); + layout->file.name = test::ParseNameOrDie("layout/foo"); + + proguard::KeepSet set; + ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("com.foo.Bar")); +} + +TEST(ProguardRulesTest, FragmentClassRuleIsEmitted) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> layout = + test::BuildXmlDom(R"(<fragment class="com.foo.Bar"/>)"); + layout->file.name = test::ParseNameOrDie("layout/foo"); + + proguard::KeepSet set; + ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("com.foo.Bar")); +} + +TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"( + <fragment xmlns:android="http://schemas.android.com/apk/res/android" + android:name="com.foo.Baz" + class="com.foo.Bar"/>)"); + layout->file.name = test::ParseNameOrDie("layout/foo"); + + proguard::KeepSet set; + ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("com.foo.Bar")); + EXPECT_THAT(actual, HasSubstr("com.foo.Baz")); +} + +TEST(ProguardRulesTest, ViewOnClickRuleIsEmitted) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"( + <View xmlns:android="http://schemas.android.com/apk/res/android" + android:onClick="bar_method" />)"); + layout->file.name = test::ParseNameOrDie("layout/foo"); + + proguard::KeepSet set; + ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("bar_method")); +} + +TEST(ProguardRulesTest, MenuRulesAreEmitted) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> menu = test::BuildXmlDom(R"( + <menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:onClick="on_click" + android:actionViewClass="com.foo.Bar" + android:actionProviderClass="com.foo.Baz" + android:name="com.foo.Bat" /> + </menu>)"); + menu->file.name = test::ParseNameOrDie("menu/foo"); + + proguard::KeepSet set; + ASSERT_TRUE(proguard::CollectProguardRules({}, menu.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("on_click")); + EXPECT_THAT(actual, HasSubstr("com.foo.Bar")); + EXPECT_THAT(actual, HasSubstr("com.foo.Baz")); + EXPECT_THAT(actual, Not(HasSubstr("com.foo.Bat"))); +} + +} // namespace aapt diff --git a/tools/aapt2/link/ManifestFixer.cpp b/tools/aapt2/link/ManifestFixer.cpp index 99fd95be2571..a0ffefad1e1c 100644 --- a/tools/aapt2/link/ManifestFixer.cpp +++ b/tools/aapt2/link/ManifestFixer.cpp @@ -309,6 +309,9 @@ bool ManifestFixer::BuildRules(xml::XmlActionExecutor* executor, manifest_action["meta-data"] = meta_data_action; manifest_action["uses-split"].Action(RequiredNameIsJavaPackage); + manifest_action["key-sets"]["key-set"]["public-key"]; + manifest_action["key-sets"]["upgrade-key-set"]; + // Application actions. xml::XmlNodeAction& application_action = manifest_action["application"]; application_action.Action(OptionalNameIsJavaClassName); diff --git a/tools/aapt2/link/ManifestFixer_test.cpp b/tools/aapt2/link/ManifestFixer_test.cpp index 064d3650065d..80edb352f42c 100644 --- a/tools/aapt2/link/ManifestFixer_test.cpp +++ b/tools/aapt2/link/ManifestFixer_test.cpp @@ -18,7 +18,8 @@ #include "test/Test.h" -using android::StringPiece; +using ::android::StringPiece; +using ::testing::NotNull; namespace aapt { @@ -420,4 +421,22 @@ TEST_F(ManifestFixerTest, DoNotIgnoreNonNamespacedElements) { EXPECT_EQ(nullptr, Verify(input)); } +TEST_F(ManifestFixerTest, SupportKeySets) { + std::string input = R"( + <manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="android"> + <key-sets> + <key-set android:name="old-set"> + <public-key android:name="old-key" android:value="some+old+key" /> + </key-set> + <key-set android:name="new-set"> + <public-key android:name="new-key" android:value="some+new+key" /> + </key-set> + <upgrade-key-set android:name="old-set" /> + <upgrade-key-set android:name="new-set" /> + </key-sets> + </manifest>)"; + EXPECT_THAT(Verify(input), NotNull()); +} + } // namespace aapt diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md index 62945b1aea8d..ebcd4698d8d5 100644 --- a/tools/aapt2/readme.md +++ b/tools/aapt2/readme.md @@ -3,6 +3,12 @@ ## Version 2.18 ### `aapt2 ...` - Fixed issue where enum values were interpreted as integers and range checked. (bug 62358540) +- Fixed issue where ints and floats with trailing whitespace would not be parsed. (bug 62902869) +- Fixed issue where `--custom-package` was not honored when writing Manifest.java. (bug 62826426) +- Add `<key-sets>` and its nested tags to the allowed set of XML tags in AndroidManifest.xml. + (bug 62839863) +- Fixed issue where Java classes referenced from fragments and menus were not added to + the set of Proguard keep rules. (bug 62216174) ## Version 2.17 ### `aapt2 ...` |