diff options
116 files changed, 1187 insertions, 114 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 3a70a4cd4b99..0ab238e99749 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -57,6 +57,11 @@ public abstract class ActivityManagerInternal { */ public static final int APP_TRANSITION_TIMEOUT = 3; + /** + * Verify that calling app has access to the given provider. + */ + public abstract String checkContentProviderAccess(String authority, int userId); + // Called by the power manager. public abstract void onWakefulnessChanged(int wakefulness); diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java index b826584009c1..a280e594525e 100644 --- a/core/java/android/provider/Downloads.java +++ b/core/java/android/provider/Downloads.java @@ -41,6 +41,8 @@ public final class Downloads { public static final class Impl implements BaseColumns { private Impl() {} + public static final String AUTHORITY = "downloads"; + /** * The permission to access the download manager */ diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 42ac76bf84c0..19dc408b4f26 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -8196,6 +8196,13 @@ public final class Settings { public static final String CALL_AUTO_RETRY = "call_auto_retry"; /** + * A setting that can be read whether the emergency affordance is currently needed. + * The value is a boolean (1 or 0). + * @hide + */ + public static final String EMERGENCY_AFFORDANCE_NEEDED = "emergency_affordance_needed"; + + /** * See RIL_PreferredNetworkType in ril.h * @hide */ diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java index cfeed51da86f..08316590e2d1 100644 --- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java +++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java @@ -79,6 +79,9 @@ public class PersistentDataBlockManager { * Returns the number of bytes written or -1 on error. If the block is too big * to fit on the partition, returns -MAX_BLOCK_SIZE. * + * {@link #wipe} will block any further {@link #write} operation until reboot, + * in which case -1 will be returned. + * * @param data the data to write */ public int write(byte[] data) { @@ -129,6 +132,8 @@ public class PersistentDataBlockManager { /** * Zeroes the previously written block in its entirety. Calling this method * will erase all data written to the persistent data partition. + * It will also prevent any further {@link #write} operation until reboot, + * in order to prevent a potential race condition. See b/30352311. */ public void wipe() { try { diff --git a/core/java/android/util/MemoryIntArray.java b/core/java/android/util/MemoryIntArray.java index 83e693c49c14..0d62054825e8 100644 --- a/core/java/android/util/MemoryIntArray.java +++ b/core/java/android/util/MemoryIntArray.java @@ -35,13 +35,13 @@ import java.util.UUID; * each other. * <p> * The data structure is designed to have one owner process that can - * read/write. There may be multiple client processes that can only read or - * read/write depending how the data structure was configured when - * instantiated. The owner process is the process that created the array. - * The shared memory is pinned (not reclaimed by the system) until the - * owning process dies or the data structure is closed. This class - * is <strong>not</strong> thread safe. You should not interact with - * an instance of this class once it is closed. + * read/write. There may be multiple client processes that can only read. + * The owner process is the process that created the array. The shared + * memory is pinned (not reclaimed by the system) until the owning process + * dies or the data structure is closed. This class is <strong>not</strong> + * thread safe. You should not interact with an instance of this class + * once it is closed. If you pass back to the owner process an instance + * it will be read only even in the owning process. * </p> * * @hide @@ -51,8 +51,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { private static final int MAX_SIZE = 1024; - private final int mOwnerPid; - private final boolean mClientWritable; + private final boolean mIsOwner; private final long mMemoryAddr; private int mFd; @@ -64,31 +63,24 @@ public final class MemoryIntArray implements Parcelable, Closeable { * @param clientWritable Whether other processes can write to the array. * @throws IOException If an error occurs while accessing the shared memory. */ - public MemoryIntArray(int size, boolean clientWritable) throws IOException { + public MemoryIntArray(int size) throws IOException { if (size > MAX_SIZE) { throw new IllegalArgumentException("Max size is " + MAX_SIZE); } - mOwnerPid = Process.myPid(); - mClientWritable = clientWritable; + mIsOwner = true; final String name = UUID.randomUUID().toString(); mFd = nativeCreate(name, size); - mMemoryAddr = nativeOpen(mFd, true, clientWritable); + mMemoryAddr = nativeOpen(mFd, mIsOwner); } private MemoryIntArray(Parcel parcel) throws IOException { - mOwnerPid = parcel.readInt(); - mClientWritable = (parcel.readInt() == 1); + mIsOwner = false; ParcelFileDescriptor pfd = parcel.readParcelable(null); if (pfd == null) { throw new IOException("No backing file descriptor"); } mFd = pfd.detachFd(); - final long memoryAddress = parcel.readLong(); - if (isOwner()) { - mMemoryAddr = memoryAddress; - } else { - mMemoryAddr = nativeOpen(mFd, false, mClientWritable); - } + mMemoryAddr = nativeOpen(mFd, mIsOwner); } /** @@ -96,7 +88,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { */ public boolean isWritable() { enforceNotClosed(); - return isOwner() || mClientWritable; + return mIsOwner; } /** @@ -109,7 +101,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { public int get(int index) throws IOException { enforceNotClosed(); enforceValidIndex(index); - return nativeGet(mFd, mMemoryAddr, index, isOwner()); + return nativeGet(mFd, mMemoryAddr, index); } /** @@ -125,7 +117,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { enforceNotClosed(); enforceWritable(); enforceValidIndex(index); - nativeSet(mFd, mMemoryAddr, index, value, isOwner()); + nativeSet(mFd, mMemoryAddr, index, value); } /** @@ -146,7 +138,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { @Override public void close() throws IOException { if (!isClosed()) { - nativeClose(mFd, mMemoryAddr, isOwner()); + nativeClose(mFd, mMemoryAddr, mIsOwner); mFd = -1; } } @@ -173,10 +165,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { public void writeToParcel(Parcel parcel, int flags) { ParcelFileDescriptor pfd = ParcelFileDescriptor.adoptFd(mFd); try { - parcel.writeInt(mOwnerPid); - parcel.writeInt(mClientWritable ? 1 : 0); parcel.writeParcelable(pfd, flags & ~Parcelable.PARCELABLE_WRITE_RETURN_VALUE); - parcel.writeLong(mMemoryAddr); } finally { pfd.detachFd(); } @@ -202,10 +191,6 @@ public final class MemoryIntArray implements Parcelable, Closeable { return mFd; } - private boolean isOwner() { - return mOwnerPid == Process.myPid(); - } - private void enforceNotClosed() { if (isClosed()) { throw new IllegalStateException("cannot interact with a closed instance"); @@ -227,10 +212,10 @@ public final class MemoryIntArray implements Parcelable, Closeable { } private native int nativeCreate(String name, int size); - private native long nativeOpen(int fd, boolean owner, boolean writable); + private native long nativeOpen(int fd, boolean owner); private native void nativeClose(int fd, long memoryAddr, boolean owner); - private native int nativeGet(int fd, long memoryAddr, int index, boolean owner); - private native void nativeSet(int fd, long memoryAddr, int index, int value, boolean owner); + private native int nativeGet(int fd, long memoryAddr, int index); + private native void nativeSet(int fd, long memoryAddr, int index, int value); private native int nativeSize(int fd); /** @@ -247,8 +232,7 @@ public final class MemoryIntArray implements Parcelable, Closeable { try { return new MemoryIntArray(parcel); } catch (IOException ioe) { - Log.e(TAG, "Error unparceling MemoryIntArray"); - return null; + throw new IllegalArgumentException("Error unparceling MemoryIntArray"); } } diff --git a/core/java/com/android/internal/policy/EmergencyAffordanceManager.java b/core/java/com/android/internal/policy/EmergencyAffordanceManager.java new file mode 100644 index 000000000000..bed7c1ba4ed3 --- /dev/null +++ b/core/java/com/android/internal/policy/EmergencyAffordanceManager.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.internal.policy; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; + +/** + * A class that manages emergency affordances and enables immediate calling to emergency services + */ +public class EmergencyAffordanceManager { + + public static final boolean ENABLED = true; + + /** + * Global setting override with the number to call with the emergency affordance. + * @hide + */ + private static final String EMERGENCY_CALL_NUMBER_SETTING = "emergency_affordance_number"; + + /** + * Global setting, whether the emergency affordance should be shown regardless of device state. + * The value is a boolean (1 or 0). + * @hide + */ + private static final String FORCE_EMERGENCY_AFFORDANCE_SETTING = "force_emergency_affordance"; + + private final Context mContext; + + public EmergencyAffordanceManager(Context context) { + mContext = context; + } + + /** + * perform an emergency call. + */ + public final void performEmergencyCall() { + performEmergencyCall(mContext); + } + + private static Uri getPhoneUri(Context context) { + String number = context.getResources().getString( + com.android.internal.R.string.config_emergency_call_number); + if (Build.IS_DEBUGGABLE) { + String override = Settings.Global.getString( + context.getContentResolver(), EMERGENCY_CALL_NUMBER_SETTING); + if (override != null) { + number = override; + } + } + return Uri.fromParts("tel", number, null); + } + + private static void performEmergencyCall(Context context) { + Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY); + intent.setData(getPhoneUri(context)); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } + + /** + * @return whether emergency affordance should be active. + */ + public boolean needsEmergencyAffordance() { + if (!ENABLED) { + return false; + } + if (forceShowing()) { + return true; + } + return isEmergencyAffordanceNeeded(); + } + + private boolean isEmergencyAffordanceNeeded() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.EMERGENCY_AFFORDANCE_NEEDED, 0) != 0; + } + + + private boolean forceShowing() { + return Settings.Global.getInt(mContext.getContentResolver(), + FORCE_EMERGENCY_AFFORDANCE_SETTING, 0) != 0; + } +} diff --git a/core/jni/android_util_MemoryIntArray.cpp b/core/jni/android_util_MemoryIntArray.cpp index d0c0f2f3e6d4..a8e14523e5dc 100644 --- a/core/jni/android_util_MemoryIntArray.cpp +++ b/core/jni/android_util_MemoryIntArray.cpp @@ -54,7 +54,7 @@ static jint android_util_MemoryIntArray_create(JNIEnv* env, jobject clazz, jstri } static jlong android_util_MemoryIntArray_open(JNIEnv* env, jobject clazz, jint fd, - jboolean owner, jboolean writable) + jboolean owner) { if (fd < 0) { jniThrowException(env, "java/io/IOException", "bad file descriptor"); @@ -67,19 +67,35 @@ static jlong android_util_MemoryIntArray_open(JNIEnv* env, jobject clazz, jint f return -1; } - int protMode = (owner || writable) ? (PROT_READ | PROT_WRITE) : PROT_READ; + // IMPORTANT: Ashmem allows the caller to change its size until + // it is memory mapped for the first time which lazily creates + // the underlying VFS file. So the size we get above may not + // reflect the size of the underlying shared memory region. Therefore, + // we first memory map to set the size in stone an verify if + // the underlying ashmem region has the same size as the one we + // memory mapped. This is critical as we use the underlying + // ashmem size for boundary checks and memory unmapping. + int protMode = owner ? (PROT_READ | PROT_WRITE) : PROT_READ; void* ashmemAddr = mmap(NULL, ashmemSize, protMode, MAP_SHARED, fd, 0); if (ashmemAddr == MAP_FAILED) { jniThrowException(env, "java/io/IOException", "cannot mmap ashmem"); return -1; } + // Check if the mapped size is the same as the ashmem region. + int mmapedSize = ashmem_get_size_region(fd); + if (mmapedSize != ashmemSize) { + munmap(reinterpret_cast<void *>(ashmemAddr), ashmemSize); + jniThrowException(env, "java/io/IOException", "bad file descriptor"); + return -1; + } + if (owner) { int size = ashmemSize / sizeof(std::atomic_int); new (ashmemAddr) std::atomic_int[size]; } - if (owner && !writable) { + if (owner) { int setProtResult = ashmem_set_prot_region(fd, PROT_READ); if (setProtResult < 0) { jniThrowException(env, "java/io/IOException", "cannot set ashmem prot mode"); @@ -121,7 +137,7 @@ static void android_util_MemoryIntArray_close(JNIEnv* env, jobject clazz, jint f } static jint android_util_MemoryIntArray_get(JNIEnv* env, jobject clazz, - jint fd, jlong address, jint index, jboolean owner) + jint fd, jlong address, jint index) { if (fd < 0) { jniThrowException(env, "java/io/IOException", "bad file descriptor"); @@ -138,7 +154,7 @@ static jint android_util_MemoryIntArray_get(JNIEnv* env, jobject clazz, } static void android_util_MemoryIntArray_set(JNIEnv* env, jobject clazz, - jint fd, jlong address, jint index, jint newValue, jboolean owner) + jint fd, jlong address, jint index, jint newValue) { if (fd < 0) { jniThrowException(env, "java/io/IOException", "bad file descriptor"); @@ -171,10 +187,10 @@ static jint android_util_MemoryIntArray_size(JNIEnv* env, jobject clazz, jint fd static const JNINativeMethod methods[] = { {"nativeCreate", "(Ljava/lang/String;I)I", (void*)android_util_MemoryIntArray_create}, - {"nativeOpen", "(IZZ)J", (void*)android_util_MemoryIntArray_open}, + {"nativeOpen", "(IZ)J", (void*)android_util_MemoryIntArray_open}, {"nativeClose", "(IJZ)V", (void*)android_util_MemoryIntArray_close}, - {"nativeGet", "(IJIZ)I", (void*)android_util_MemoryIntArray_get}, - {"nativeSet", "(IJIIZ)V", (void*) android_util_MemoryIntArray_set}, + {"nativeGet", "(IJI)I", (void*)android_util_MemoryIntArray_get}, + {"nativeSet", "(IJII)V", (void*) android_util_MemoryIntArray_set}, {"nativeSize", "(I)I", (void*) android_util_MemoryIntArray_size}, }; diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 9bec6a36b5e3..2fdabcd9fa69 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -452,6 +452,20 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra SetForkLoad(true); #endif + sigset_t sigchld; + sigemptyset(&sigchld); + sigaddset(&sigchld, SIGCHLD); + + // Temporarily block SIGCHLD during forks. The SIGCHLD handler might + // log, which would result in the logging FDs we close being reopened. + // This would cause failures because the FDs are not whitelisted. + // + // Note that the zygote process is single threaded at this point. + if (sigprocmask(SIG_BLOCK, &sigchld, nullptr) == -1) { + ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); + RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_BLOCK, { SIGCHLD }) failed."); + } + // Close any logging related FDs before we start evaluating the list of // file descriptors. __android_log_close(); @@ -483,6 +497,11 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra RuntimeAbort(env, __LINE__, "Unable to reopen whitelisted descriptors."); } + if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) { + ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); + RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed."); + } + // Keep capabilities across UID change, unless we're staying root. if (uid != 0) { EnableKeepCapabilities(env); @@ -616,6 +635,11 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra SetForkLoad(false); #endif + // We blocked SIGCHLD prior to a fork, we unblock it here. + if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) { + ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno)); + RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed."); + } } return pid; } diff --git a/core/jni/fd_utils-inl.h b/core/jni/fd_utils-inl.h index db56c320e4f2..eecbd9d98ba4 100644 --- a/core/jni/fd_utils-inl.h +++ b/core/jni/fd_utils-inl.h @@ -240,9 +240,22 @@ class FileDescriptorInfo { is_sock(false) { } + static bool StartsWith(const std::string& str, const std::string& prefix) { + return str.compare(0, prefix.size(), prefix) == 0; + } + + static bool EndsWith(const std::string& str, const std::string& suffix) { + if (suffix.size() > str.size()) { + return false; + } + + return str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; + } + // Returns true iff. a given path is whitelisted. A path is whitelisted // if it belongs to the whitelist (see kPathWhitelist) or if it's a path - // under /system/framework that ends with ".jar". + // under /system/framework that ends with ".jar" or if it is a system + // framework overlay. static bool IsWhitelisted(const std::string& path) { for (size_t i = 0; i < (sizeof(kPathWhitelist) / sizeof(kPathWhitelist[0])); ++i) { if (kPathWhitelist[i] == path) { @@ -252,10 +265,41 @@ class FileDescriptorInfo { static const std::string kFrameworksPrefix = "/system/framework/"; static const std::string kJarSuffix = ".jar"; - if (path.compare(0, kFrameworksPrefix.size(), kFrameworksPrefix) == 0 && - path.compare(path.size() - kJarSuffix.size(), kJarSuffix.size(), kJarSuffix) == 0) { + if (StartsWith(path, kFrameworksPrefix) && EndsWith(path, kJarSuffix)) { return true; } + + // Whitelist files needed for Runtime Resource Overlay, like these: + // /system/vendor/overlay/framework-res.apk + // /system/vendor/overlay-subdir/pg/framework-res.apk + // /data/resource-cache/system@vendor@overlay@framework-res.apk@idmap + // /data/resource-cache/system@vendor@overlay-subdir@pg@framework-res.apk@idmap + // See AssetManager.cpp for more details on overlay-subdir. + static const std::string kOverlayDir = "/system/vendor/overlay/"; + static const std::string kVendorOverlayDir = "/vendor/overlay"; + static const std::string kOverlaySubdir = "/system/vendor/overlay-subdir/"; + static const std::string kApkSuffix = ".apk"; + + if ((StartsWith(path, kOverlayDir) || StartsWith(path, kOverlaySubdir) + || StartsWith(path, kVendorOverlayDir)) + && EndsWith(path, kApkSuffix) + && path.find("/../") == std::string::npos) { + return true; + } + + static const std::string kOverlayIdmapPrefix = "/data/resource-cache/"; + static const std::string kOverlayIdmapSuffix = ".apk@idmap"; + if (StartsWith(path, kOverlayIdmapPrefix) && EndsWith(path, kOverlayIdmapSuffix) + && path.find("/../") == std::string::npos) { + return true; + } + + // All regular files that are placed under this path are whitelisted automatically. + static const std::string kZygoteWhitelistPath = "/vendor/zygote_whitelist/"; + if (StartsWith(path, kZygoteWhitelistPath) && path.find("/../") == std::string::npos) { + return true; + } + return false; } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index e9a3409be6ab..84a9ed366314 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -699,6 +699,7 @@ android:priority="400" /> <!-- Allows an app to access precise location. + Alternatively, you might want {@link #ACCESS_COARSE_LOCATION}. <p>Protection level: dangerous --> <permission android:name="android.permission.ACCESS_FINE_LOCATION" @@ -708,6 +709,7 @@ android:protectionLevel="dangerous" /> <!-- Allows an app to access approximate location. + Alternatively, you might want {@link #ACCESS_FINE_LOCATION}. <p>Protection level: dangerous --> <permission android:name="android.permission.ACCESS_COARSE_LOCATION" diff --git a/core/res/res/drawable/emergency_icon.xml b/core/res/res/drawable/emergency_icon.xml new file mode 100644 index 000000000000..8e460d786643 --- /dev/null +++ b/core/res/res/drawable/emergency_icon.xml @@ -0,0 +1,34 @@ +<!-- +Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24.0dp" + android:height="24.0dp" + android:viewportWidth="68.0" + android:viewportHeight="68.0" + android:tint="?attr/colorControlNormal"> + <path + android:fillColor="#FF000000" + android:pathData="M55.2,58.3l-6.3,-7.8C54.0,46.3 57.0,40.1 57.0,33.4c0.0,-6.2 -2.6,-12.1 -7.2,-16.3l6.7,-7.4C63.2,15.8 67.0,24.4 67.0,33.4C67.0,43.1 62.7,52.2 55.2,58.3z"/> + <path + android:fillColor="#FF000000" + android:pathData="M12.9,58.3C5.3,52.2 1.0,43.1 1.0,33.4c0.0,-9.0 3.8,-17.6 10.5,-23.7l6.7,7.4C13.6,21.3 11.0,27.2 11.0,33.4c0.0,6.7 3.0,12.9 8.2,17.1L12.9,58.3z"/> + <path + android:fillColor="#FF000000" + android:pathData="M29.0,11.4l10.0,0.0l0.0,29.0l-10.0,0.0z"/> + <path + android:fillColor="#FF000000" + android:pathData="M29.0,48.4l10.0,0.0l0.0,9.0l-10.0,0.0z"/> +</vector> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 9c16f7eb5848..bb1aaadb5671 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Foonopsies"</string> <string name="global_action_lock" msgid="2844945191792119712">"Skermslot"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Sit af"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Noodgeval"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Foutverslag"</string> <string name="bugreport_title" msgid="2667494803742548533">"Neem foutverslag"</string> <string name="bugreport_message" msgid="398447048750350456">"Dit sal inligting oor die huidige toestand van jou toestel insamel om as \'n e-posboodskap te stuur. Dit sal \'n tydjie neem vandat die foutverslag begin is totdat dit reg is om gestuur te word; wees asseblief geduldig."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index a3c18acc684b..7ec2cd2f4568 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"የስልክ አማራጮች"</string> <string name="global_action_lock" msgid="2844945191792119712">"ማያ ቆልፍ"</string> <string name="global_action_power_off" msgid="4471879440839879722">"ኃይል አጥፋ"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"ድንገተኛ አደጋ"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"የሳንካ ሪፖርት"</string> <string name="bugreport_title" msgid="2667494803742548533">"የሳንካ ሪፖርት ውሰድ"</string> <string name="bugreport_message" msgid="398447048750350456">"ይሄ እንደ የኢሜይል መልዕክት አድርጎ የሚልከውን ስለመሣሪያዎ የአሁኑ ሁኔታ መረጃ ይሰበስባል። የሳንካ ሪፖርቱን ከመጀመር ጀምሮ እስኪላክ ድረስ ትንሽ ጊዜ ይወስዳል፤ እባክዎ ይታገሱ።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 2db0e15fd40d..d7eee91ca4b9 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -222,6 +222,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"خيارات الهاتف"</string> <string name="global_action_lock" msgid="2844945191792119712">"تأمين الشاشة"</string> <string name="global_action_power_off" msgid="4471879440839879722">"إيقاف التشغيل"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"الطوارئ"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"تقرير الأخطاء"</string> <string name="bugreport_title" msgid="2667494803742548533">"إعداد تقرير بالأخطاء"</string> <string name="bugreport_message" msgid="398447048750350456">"سيجمع هذا معلومات حول حالة جهازك الحالي لإرسالها كرسالة إلكترونية، ولكنه سيستغرق وقتًا قليلاً من بدء عرض تقرير بالأخطاء. وحتى يكون جاهزًا للإرسال، الرجاء الانتظار."</string> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index 7f55ba12ad1a..6be13230b5bb 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefon seçimləri"</string> <string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Söndür"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Təcili"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Baq hesabatı"</string> <string name="bugreport_title" msgid="2667494803742548533">"Baqı xəbər verin"</string> <string name="bugreport_message" msgid="398447048750350456">"Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index ec8f5f3e279d..ffcbfb556cba 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -216,6 +216,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opcije telefona"</string> <string name="global_action_lock" msgid="2844945191792119712">"Zaključaj ekran"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Isključi"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Hitni poziv"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Izveštaj o grešci"</string> <string name="bugreport_title" msgid="2667494803742548533">"Napravi izveštaj o grešci"</string> <string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupiti informacije o trenutnom stanju uređaja kako bi bile poslate u poruci e-pošte. Od započinjanja izveštaja o grešci do trenutka za njegovo slanje proći će neko vreme; budite strpljivi."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index a70d9dc099c7..46b5df061c90 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Опции на телефона"</string> <string name="global_action_lock" msgid="2844945191792119712">"Заключване на екрана"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Изключване"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Спешно обаждане"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Сигнал за програмна грешка"</string> <string name="bugreport_title" msgid="2667494803742548533">"Сигнал за програмна грешка"</string> <string name="bugreport_message" msgid="398447048750350456">"По този начин ще се събере информация за текущото състояние на устройството ви, която да се изпрати като имейл съобщение. След стартирането на процеса ще мине известно време, докато сигналът за програмна грешка бъде готов за подаване. Моля, имайте търпение."</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index 2d88a1d7a33a..33bce252fd4d 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ফোন বিকল্পগুলি"</string> <string name="global_action_lock" msgid="2844945191792119712">"স্ক্রীণ লক"</string> <string name="global_action_power_off" msgid="4471879440839879722">"পাওয়ার বন্ধ করুন"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"জরুরী"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"ত্রুটির প্রতিবেদন"</string> <string name="bugreport_title" msgid="2667494803742548533">"ত্রুটির প্রতিবেদন করুন"</string> <string name="bugreport_message" msgid="398447048750350456">"এটি একটি ই-মেল বার্তা পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; দয়া করে ধৈর্য রাখুন৷"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index e5a815d805ef..32460547fcfa 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opcions del telèfon"</string> <string name="global_action_lock" msgid="2844945191792119712">"Bloqueig de pantalla"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Apaga"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergències"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Informe d\'error"</string> <string name="bugreport_title" msgid="2667494803742548533">"Crea informe d\'errors"</string> <string name="bugreport_message" msgid="398447048750350456">"Es recopilarà informació sobre l\'estat actual del dispositiu i se t\'enviarà per correu electrònic. Passaran uns quants minuts des de l\'inici de l\'informe d\'errors fins al seu enviament, per la qual cosa et recomanem que tinguis paciència."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 4a142a2506f9..1a0b7bb5d141 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Možnosti telefonu"</string> <string name="global_action_lock" msgid="2844945191792119712">"Zámek obrazovky"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Vypnout"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Stav nouze"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Hlášení chyb"</string> <string name="bugreport_title" msgid="2667494803742548533">"Vytvořit chybové hlášení"</string> <string name="bugreport_message" msgid="398447048750350456">"Shromažďuje informace o aktuálním stavu zařízení. Tyto informace je následně možné poslat v e-mailové zprávě, chvíli však potrvá, než bude hlášení o chybě připraveno k odeslání. Buďte prosím trpěliví."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 762c173e3238..f37764bf3d3a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Indstillinger for telefon"</string> <string name="global_action_lock" msgid="2844945191792119712">"Skærmlås"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Sluk"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Nødopkald"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Fejlrapport"</string> <string name="bugreport_title" msgid="2667494803742548533">"Lav fejlrapport"</string> <string name="bugreport_message" msgid="398447048750350456">"Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en e-mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index b163d3567496..61b14119d012 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoptionen"</string> <string name="global_action_lock" msgid="2844945191792119712">"Displaysperre"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Ausschalten"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Notfall"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Fehlerbericht"</string> <string name="bugreport_title" msgid="2667494803742548533">"Fehlerbericht abrufen"</string> <string name="bugreport_message" msgid="398447048750350456">"Bei diesem Fehlerbericht werden Daten zum aktuellen Status deines Geräts erfasst und als E-Mail versandt. Vom Start des Berichts bis zu seinem Versand kann es eine Weile dauern. Bitte habe etwas Geduld."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 100ee8162e76..df3a23a8e235 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Επιλογές τηλεφώνου"</string> <string name="global_action_lock" msgid="2844945191792119712">"Κλείδωμα οθόνης"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Απενεργοποίηση"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Κλήση έκτακτης ανάγκης"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Αναφορά σφαλμάτων"</string> <string name="bugreport_title" msgid="2667494803742548533">"Λήψη αναφοράς σφάλματος"</string> <string name="bugreport_message" msgid="398447048750350456">"Θα συλλέξει πληροφορίες σχετικά με την τρέχουσα κατάσταση της συσκευής σας και θα τις στείλει μέσω μηνύματος ηλεκτρονικού ταχυδρομείου. Απαιτείται λίγος χρόνος για τη σύνταξη της αναφοράς σφάλματος και την αποστολή της. Κάντε λίγη υπομονή."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 0522882ff7eb..cf7f14a4ec24 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Phone options"</string> <string name="global_action_lock" msgid="2844945191792119712">"Screen lock"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Power off"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergency"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string> <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string> <string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 0522882ff7eb..cf7f14a4ec24 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Phone options"</string> <string name="global_action_lock" msgid="2844945191792119712">"Screen lock"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Power off"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergency"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string> <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string> <string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 0522882ff7eb..cf7f14a4ec24 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Phone options"</string> <string name="global_action_lock" msgid="2844945191792119712">"Screen lock"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Power off"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergency"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string> <string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string> <string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 0786b1a3a2e9..2af1c7a3e744 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opciones de dispositivo"</string> <string name="global_action_lock" msgid="2844945191792119712">"Bloqueo de pantalla"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergencias"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Informe de errores"</string> <string name="bugreport_title" msgid="2667494803742548533">"Iniciar informe de errores"</string> <string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo, que se enviará por correo. Pasarán unos minutos desde que se inicie el informe de errores hasta que se envíe, por lo que te recomendamos que tengas paciencia."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 1909e544a7bf..d052e14e302d 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opciones del teléfono"</string> <string name="global_action_lock" msgid="2844945191792119712">"Bloqueo de pantalla"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergencia"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Informe de error"</string> <string name="bugreport_title" msgid="2667494803742548533">"Crear informe de errores"</string> <string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo y se enviará por correo electrónico. Pasarán unos minutos desde que empiece a generarse el informe de errores hasta que se envíe."</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 14695e381a50..2bc2d0b9f9a1 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefonivalikud"</string> <string name="global_action_lock" msgid="2844945191792119712">"Ekraanilukk"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Lülita välja"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Hädaabi"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Veaaruanne"</string> <string name="bugreport_title" msgid="2667494803742548533">"Veaaruande võtmine"</string> <string name="bugreport_message" msgid="398447048750350456">"Nii kogutakse teavet teie seadme praeguse oleku kohta, et saata see meilisõnumina. Enne kui saate veaaruande ära saata, võtab selle loomine natuke aega; varuge kannatust."</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 98adc8624b27..94f6b48d3f76 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefonoaren aukerak"</string> <string name="global_action_lock" msgid="2844945191792119712">"Pantailaren blokeoa"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Itzali"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Larrialdiak"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Akatsen txostena"</string> <string name="bugreport_title" msgid="2667494803742548533">"Sortu akatsen txostena"</string> <string name="bugreport_message" msgid="398447048750350456">"Gailuaren uneko egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 36ba8e79fa2a..1581e9dd5975 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"گزینههای تلفن"</string> <string name="global_action_lock" msgid="2844945191792119712">"قفل صفحه"</string> <string name="global_action_power_off" msgid="4471879440839879722">"خاموش کردن"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"اضطراری"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"گزارش اشکال"</string> <string name="bugreport_title" msgid="2667494803742548533">"گرفتن گزارش اشکال"</string> <string name="bugreport_message" msgid="398447048750350456">"این گزارش اطلاعات مربوط به وضعیت دستگاه کنونی شما را جمعآوری میکند تا به صورت یک پیام رایانامه ارسال شود. از زمان شروع گزارش اشکال تا آماده شدن برای ارسال اندکی زمان میبرد؛ لطفاً شکیبا باشید."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index ac827a164ebe..2b4baf9a2e5c 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Puhelimen asetukset"</string> <string name="global_action_lock" msgid="2844945191792119712">"Näytön lukitus"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Katkaise virta"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Hätäpuhelu"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Virheraportti"</string> <string name="bugreport_title" msgid="2667494803742548533">"Luo virheraportti"</string> <string name="bugreport_message" msgid="398447048750350456">"Toiminto kerää tietoja laitteen tilasta ja lähettää ne sähköpostitse. Virheraportti on valmis lähetettäväksi hetken kuluttua - kiitos kärsivällisyydestäsi."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 57119dae338c..b4d34ebc0415 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Options du téléphone"</string> <string name="global_action_lock" msgid="2844945191792119712">"Verrouillage de l\'écran"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Éteindre"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Urgence"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Rapport de bogue"</string> <string name="bugreport_title" msgid="2667494803742548533">"Créer un rapport de bogue"</string> <string name="bugreport_message" msgid="398447048750350456">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme de courriel. Merci de patienter pendant la préparation du rapport de bogue. Cette opération peut prendre quelques instants."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index b08999100cc3..39d8ebf3cd67 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Options du téléphone"</string> <string name="global_action_lock" msgid="2844945191792119712">"Verrouillage de l\'écran"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Éteindre"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Urgences"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Rapport de bug"</string> <string name="bugreport_title" msgid="2667494803742548533">"Créer un rapport de bug"</string> <string name="bugreport_message" msgid="398447048750350456">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme d\'e-mail. Merci de patienter pendant la préparation du rapport de bug. Cette opération peut prendre quelques instants."</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 23669d4dc09c..a6024dc65b31 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opcións de teléfono"</string> <string name="global_action_lock" msgid="2844945191792119712">"Bloqueo da pantalla"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Apagar"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emerxencia"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Informe de erros"</string> <string name="bugreport_title" msgid="2667494803742548533">"Crear informe de erros"</string> <string name="bugreport_message" msgid="398447048750350456">"Este informe recompilará información acerca do estado actual do teu dispositivo para enviala en forma de mensaxe de correo electrónico. O informe de erros tardará un pouco en completarse desde o seu inicio ata que estea preparado para enviarse, polo que che recomendamos que teñas paciencia."</string> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 656061dd340d..d8ccfc209185 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ફોન વિકલ્પો"</string> <string name="global_action_lock" msgid="2844945191792119712">"સ્ક્રીન લૉક"</string> <string name="global_action_power_off" msgid="4471879440839879722">"પાવર બંધ"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"કટોકટી"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"બગ રિપોર્ટ"</string> <string name="bugreport_title" msgid="2667494803742548533">"બગ રિપોર્ટ લો"</string> <string name="bugreport_message" msgid="398447048750350456">"આ, એક ઇ-મેઇલ સંદેશ તરીકે મોકલવા માટે, તમારા વર્તમાન ઉપકરણ સ્થિતિ વિશેની માહિતી એકત્રિત કરશે. એક બગ રિપોર્ટ પ્રારંભ કરીને તે મોકલવા માટે તૈયાર ન થઈ જાય ત્યાં સુધી તેમાં થોડો સમય લાગશે; કૃપા કરીને ધીરજ રાખો."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index b52ff253ad2c..3bb5e0047543 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"फ़ोन विकल्प"</string> <string name="global_action_lock" msgid="2844945191792119712">"स्क्रीन लॉक"</string> <string name="global_action_power_off" msgid="4471879440839879722">"पावर बंद"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"आपातकाल"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोर्ट"</string> <string name="bugreport_title" msgid="2667494803742548533">"बग रिपोर्ट प्राप्त करें"</string> <string name="bugreport_message" msgid="398447048750350456">"ईमेल संदेश के रूप में भेजने के लिए, इसके द्वारा आपके डिवाइस की वर्तमान स्थिति के बारे में जानकारी एकत्र की जाएगी. बग रिपोर्ट प्रारंभ करने से लेकर भेजने के लिए तैयार होने तक कुछ समय लगेगा; कृपया धैर्य रखें."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index b90f9dd3248f..07d50dc68e32 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -216,6 +216,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opcije telefona"</string> <string name="global_action_lock" msgid="2844945191792119712">"Zaključavanje zaslona"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Isključi"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Hitno"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Izvješće o bugovima"</string> <string name="bugreport_title" msgid="2667494803742548533">"Izvješće o programskoj pogrešci"</string> <string name="bugreport_message" msgid="398447048750350456">"Time će se prikupiti podaci o trenutačnom stanju vašeg uređaja koje ćete nam poslati u e-poruci. Za pripremu izvješća o programskoj pogrešci potrebno je nešto vremena pa vas molimo za strpljenje."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 8187e438872e..858604084a5c 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefonbeállítások"</string> <string name="global_action_lock" msgid="2844945191792119712">"Képernyő lezárása"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Kikapcsolás"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Vészhívás"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Programhiba bejelentése"</string> <string name="bugreport_title" msgid="2667494803742548533">"Hibajelentés készítése"</string> <string name="bugreport_message" msgid="398447048750350456">"Ezzel információt fog gyűjteni az eszköz jelenlegi állapotáról, amelyet a rendszer e-mailben fog elküldeni. Kérjük, legyen türelemmel, amíg a hibajelentés elkészül, és küldhető állapotba kerül."</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 2e557d1816b1..a6f10f5c674c 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Հեռախոսի ընտրանքներ"</string> <string name="global_action_lock" msgid="2844945191792119712">"Էկրանի փական"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Անջատել"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Արտակարգ իրավիճակ"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Վրիպակի զեկույց"</string> <string name="bugreport_title" msgid="2667494803742548533">"Գրել սխալի զեկույց"</string> <string name="bugreport_message" msgid="398447048750350456">"Սա տեղեկություններ կհավաքագրի ձեր սարքի առկա կարգավիճակի մասին և կուղարկի այն էլեկտրոնային նամակով: Որոշակի ժամանակ կպահանջվի վրիպակի մասին զեկուցելու պահից սկսած մինչ ուղարկելը: Խնդրում ենք փոքր-ինչ համբերատար լինել:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index bd172604d4b1..3f98718710c2 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opsi telepon"</string> <string name="global_action_lock" msgid="2844945191792119712">"Kunci layar"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Matikan daya"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Darurat"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Laporan bug"</string> <string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan bug"</string> <string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpulkan informasi status perangkat Anda saat ini, untuk dikirimkan sebagai pesan email. Harap bersabar, mungkin perlu waktu untuk memulai laporan bug hingga siap dikirim."</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index b575e791c666..a0578b04b07c 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Valkostir síma"</string> <string name="global_action_lock" msgid="2844945191792119712">"Skjálás"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Slökkva"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Neyðarsímtal"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Villutilkynning"</string> <string name="bugreport_title" msgid="2667494803742548533">"Útbúa villutilkynningu"</string> <string name="bugreport_message" msgid="398447048750350456">"Þetta safnar upplýsingum um núverandi stöðu tækisins til að senda með tölvupósti. Það tekur smástund frá því villutilkynningin er ræst og þar til hún er tilbúin til sendingar – sýndu biðlund."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index bfadb9df2b23..c0ea60d15452 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opzioni telefono"</string> <string name="global_action_lock" msgid="2844945191792119712">"Blocco schermo"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Spegni"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergenza"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Segnalazione di bug"</string> <string name="bugreport_title" msgid="2667494803742548533">"Apri segnalazione bug"</string> <string name="bugreport_message" msgid="398447048750350456">"Verranno raccolte informazioni sullo stato corrente del dispositivo che saranno inviate sotto forma di messaggio email. Passerà un po\' di tempo prima che la segnalazione di bug aperta sia pronta per essere inviata; ti preghiamo di avere pazienza."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index c2ba6f30e121..12b2860ff692 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"אפשרויות טלפון"</string> <string name="global_action_lock" msgid="2844945191792119712">"נעילת מסך"</string> <string name="global_action_power_off" msgid="4471879440839879722">"כיבוי"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"חירום"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"דיווח על באג"</string> <string name="bugreport_title" msgid="2667494803742548533">"שלח דיווח על באג"</string> <string name="bugreport_message" msgid="398447048750350456">"פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index c7c404e300b1..c06d8f8f5753 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"携帯電話オプション"</string> <string name="global_action_lock" msgid="2844945191792119712">"画面ロック"</string> <string name="global_action_power_off" msgid="4471879440839879722">"電源を切る"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"緊急通報"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"バグレポート"</string> <string name="bugreport_title" msgid="2667494803742548533">"バグレポートを取得"</string> <string name="bugreport_message" msgid="398447048750350456">"現在の端末の状態に関する情報が収集され、その内容がメールで送信されます。バグレポートが開始してから送信可能な状態となるまでには多少の時間がかかりますのでご了承ください。"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 0d27ea59c968..11dcebf1ac0e 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ტელეფონის პარამეტრები"</string> <string name="global_action_lock" msgid="2844945191792119712">"ეკრანის დაბლოკვა"</string> <string name="global_action_power_off" msgid="4471879440839879722">"კვების გამორთვა"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"საგანგებო სამსახურები"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"ხარვეზის შესახებ ანგარიში"</string> <string name="bugreport_title" msgid="2667494803742548533">"შექმენით შეცდომის ანგარიში"</string> <string name="bugreport_message" msgid="398447048750350456">"იგი შეაგროვებს ინფორმაციას თქვენი მოწყობილობის ამჟამინდელი მდგომარეობის შესახებ, რათა ის ელფოსტის შეტყობინების სახით გააგზავნოს. ხარვეზის ანგარიშის მომზადებასა და შეტყობინების გაგზავნას გარკვეული დრო სჭირდება. გთხოვთ, მოითმინოთ."</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index c9756750c59d..0476f70ce668 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Телефон опциялары"</string> <string name="global_action_lock" msgid="2844945191792119712">"Экранды құлыптау"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Өшіру"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Төтенше жағдай"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Вирус туралы хабарлау"</string> <string name="bugreport_title" msgid="2667494803742548533">"Қате туралы есеп құру"</string> <string name="bugreport_message" msgid="398447048750350456">"Құрылғының қазіргі күйі туралы ақпаратты жинап, электрондық хабармен жібереді. Есеп әзір болғанша біраз уақыт кетеді, шыдай тұрыңыз."</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 0c99e16c8ce1..0765c6725ab7 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ជម្រើសទូរស័ព្ទ"</string> <string name="global_action_lock" msgid="2844945191792119712">"ចាក់សោអេក្រង់"</string> <string name="global_action_power_off" msgid="4471879440839879722">"បិទ"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"អាសន្ន"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"របាយការណ៍កំហុស"</string> <string name="bugreport_title" msgid="2667494803742548533">"យករបាយការណ៍កំហុស"</string> <string name="bugreport_message" msgid="398447048750350456">"វានឹងប្រមូលព័ត៌មានអំពីស្ថានភាពឧបករណ៍របស់អ្នក ដើម្បីផ្ញើជាសារអ៊ីមែល។ វានឹងចំណាយពេលតិចពីពេលចាប់ផ្ដើមរបាយការណ៍រហូតដល់ពេលវារួចរាល់ដើម្បីផ្ញើ សូមអត់ធ្មត់។"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index c172e912743f..2984afdac4e2 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ಫೋನ್ ಆಯ್ಕೆಗಳು"</string> <string name="global_action_lock" msgid="2844945191792119712">"ಸ್ಕ್ರೀನ್ ಲಾಕ್"</string> <string name="global_action_power_off" msgid="4471879440839879722">"ಪವರ್ ಆಫ್ ಮಾಡು"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"ತುರ್ತು"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"ದೋಷದ ವರದಿ"</string> <string name="bugreport_title" msgid="2667494803742548533">"ದೋಷ ವರದಿ ರಚಿಸಿ"</string> <string name="bugreport_message" msgid="398447048750350456">"ನಿಮ್ಮ ಸಾಧನದ ಪ್ರಸ್ತುತ ಸ್ಥಿತಿಯ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಕೊಳ್ಳುವುದರ ಜೊತೆ ಇ-ಮೇಲ್ ರೂಪದಲ್ಲಿ ನಿಮಗೆ ರವಾನಿಸುತ್ತದೆ. ಇದು ದೋಷ ವರದಿಯನ್ನು ಪ್ರಾರಂಭಿಸಿದ ಸಮಯದಿಂದ ಅದನ್ನು ಕಳುಹಿಸುವವರೆಗೆ ಸ್ವಲ್ಪ ಸಮಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ; ದಯವಿಟ್ಟು ತಾಳ್ಮೆಯಿಂದಿರಿ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 254adc8276e6..97afc5608158 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"휴대전화 옵션"</string> <string name="global_action_lock" msgid="2844945191792119712">"화면 잠금"</string> <string name="global_action_power_off" msgid="4471879440839879722">"종료"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"긴급 전화"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"버그 신고"</string> <string name="bugreport_title" msgid="2667494803742548533">"버그 신고"</string> <string name="bugreport_message" msgid="398447048750350456">"현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다."</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 50340d4d3b75..6ffd5f6672da 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Телефон мүмкүнчүлүктөрү"</string> <string name="global_action_lock" msgid="2844945191792119712">"Экран кулпусу"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Кубатын өчүрүү"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Тез жардам"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Ката тууралуу билдирүү"</string> <string name="bugreport_title" msgid="2667494803742548533">"Ката тууралуу билдирүү түзүү"</string> <string name="bugreport_message" msgid="398447048750350456">"Бул сиздин түзмөгүңүздүн учурдагы абалын эмейл билдирүүсү катары жөнөтүш максатында маалымат чогултат. Ката тууралуу билдирүү түзүлүп башталып, жөнөтүлгөнгө чейин бир аз убакыт керек болот; сураныч, бир аз күтө туруңуз."</string> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index 1ef76222c2ba..0f6eabc48585 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ໂຕເລືອກໂທລະສັບ"</string> <string name="global_action_lock" msgid="2844945191792119712">"ລັອກໜ້າຈໍ"</string> <string name="global_action_power_off" msgid="4471879440839879722">"ປິດ"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"ສຸກເສີນ"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"ລາຍງານຂໍ້ຜິດພາດ"</string> <string name="bugreport_title" msgid="2667494803742548533">"ໃຊ້ລາຍງານຂໍ້ບົກພ່ອງ"</string> <string name="bugreport_message" msgid="398447048750350456">"ນີ້ຈະເປັນການເກັບກຳຂໍ້ມູນກ່ຽວກັບ ສະຖານະປັດຈຸບັນຂອງອຸປະກອນທ່ານ ເພື່ອສົ່ງເປັນຂໍ້ຄວາມທາງອີເມວ. ມັນຈະໃຊ້ເວລາໜ້ອຍນຶ່ງ ໃນການເລີ່ມຕົ້ນການລາຍງານຂໍ້ຜິດພາດ ຈົນກວ່າຈະພ້ອມທີ່ຈະສົ່ງໄດ້, ກະລຸນາລໍຖ້າ."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 80ff67eaf3a9..80cd4529142f 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefono parinktys"</string> <string name="global_action_lock" msgid="2844945191792119712">"Ekrano užraktas"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Išjungiamas maitinimas"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Skambutis pagalbos numeriu"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Pranešimas apie riktą"</string> <string name="bugreport_title" msgid="2667494803742548533">"Pranešti apie riktą"</string> <string name="bugreport_message" msgid="398447048750350456">"Bus surinkta informacija apie dabartinę įrenginio būseną ir išsiųsta el. pašto pranešimu. Šiek tiek užtruks, kol pranešimas apie riktą bus paruoštas siųsti; būkite kantrūs."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 210d05b41fcc..1fd282eea65c 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -216,6 +216,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Tālruņa opcijas"</string> <string name="global_action_lock" msgid="2844945191792119712">"Ekrāna bloķētājs"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Strāvas padeve ir izslēgta."</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Ārkārtas"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Kļūdu ziņojums"</string> <string name="bugreport_title" msgid="2667494803742548533">"Kļūdu ziņojuma sagatavošana"</string> <string name="bugreport_message" msgid="398447048750350456">"Veicot šo darbību, tiks apkopota informācija par jūsu ierīces pašreizējo stāvokli un nosūtīta e-pasta ziņojuma veidā. Kļūdu ziņojuma pabeigšanai un nosūtīšanai var būt nepieciešams laiks. Lūdzu, esiet pacietīgs."</string> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index a24ad5711e11..a9db0f7f2932 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Опции на телефон"</string> <string name="global_action_lock" msgid="2844945191792119712">"Заклучи екран"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Исклучи"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Итен случај"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Извештај за грешка"</string> <string name="bugreport_title" msgid="2667494803742548533">"Земи извештај за грешки"</string> <string name="bugreport_message" msgid="398447048750350456">"Ова ќе собира информации за моменталната состојба на вашиот уред, за да ги испрати како порака по е-пошта. Тоа ќе одземе малку време почнувајќи од извештајот за грешки додека не се подготви за праќање; бидете трпеливи."</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index f91db2d1a495..6d77ebb66b95 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ഫോൺ ഓപ്ഷനുകൾ"</string> <string name="global_action_lock" msgid="2844945191792119712">"സ്ക്രീൻ ലോക്ക്"</string> <string name="global_action_power_off" msgid="4471879440839879722">"പവർ ഓഫാക്കുക"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"അടിയന്തിരാവശ്യം"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"ബഗ് റിപ്പോർട്ട്"</string> <string name="bugreport_title" msgid="2667494803742548533">"ബഗ് റിപ്പോർട്ട് എടുക്കുക"</string> <string name="bugreport_message" msgid="398447048750350456">"ഒരു ഇമെയിൽ സന്ദേശമായി അയയ്ക്കുന്നതിന്, ഇത് നിങ്ങളുടെ നിലവിലെ ഉപകരണ നിലയെക്കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കും. ബഗ് റിപ്പോർട്ട് ആരംഭിക്കുന്നതിൽ നിന്ന് ഇത് അയയ്ക്കാനായി തയ്യാറാകുന്നതുവരെ അൽപ്പസമയമെടുക്കും; ക്ഷമയോടെ കാത്തിരിക്കുക."</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index f54a485768df..4f579f8b28f6 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Утасны сонголтууд"</string> <string name="global_action_lock" msgid="2844945191792119712">"Дэлгэцний түгжээ"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Унтраах"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Яаралтай тусламж"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Алдаа мэдээллэх"</string> <string name="bugreport_title" msgid="2667494803742548533">"Согог репорт авах"</string> <string name="bugreport_message" msgid="398447048750350456">"Энэ таны төхөөрөмжийн одоогийн статусын талаарх мэдээллийг цуглуулах ба имэйл мессеж болгон илгээнэ. Алдааны мэдэгдлээс эхэлж илгээхэд бэлэн болоход хэсэг хугацаа зарцуулагдана тэвчээртэй байна уу."</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index c7d219133d8a..e4121bf109c1 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"फोन पर्याय"</string> <string name="global_action_lock" msgid="2844945191792119712">"स्क्रीन लॉक"</string> <string name="global_action_power_off" msgid="4471879440839879722">"बंद"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"आणीबाणी"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"दोष अहवाल"</string> <string name="bugreport_title" msgid="2667494803742548533">"दोष अहवाल घ्या"</string> <string name="bugreport_message" msgid="398447048750350456">"ई-मेल संदेश म्हणून पाठविण्यासाठी, हे आपल्या वर्तमान डिव्हाइस स्थितीविषयी माहिती संकलित करेल. दोष अहवाल प्रारंभ करण्यापासून तो पाठविण्यापर्यंत थोडा वेळ लागेल; कृपया धीर धरा."</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index c4123ab539ed..d0ca602c4f28 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Pilihan telefon"</string> <string name="global_action_lock" msgid="2844945191792119712">"Kunci skrin"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Matikan kuasa"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Kecemasan"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Laporan pepijat"</string> <string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan pepijat"</string> <string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpul maklumat tentang keadaan peranti semasa anda untuk dihantarkan sebagai mesej e-mel. Harap bersabar, mungkin perlu sedikit masa untuk memulakan laporan sehingga siap untuk dihantar."</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index 5cd077b6aa11..f6016d4aae69 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ဖုန်းဆိုင်ရာရွေးချယ်မှုများ"</string> <string name="global_action_lock" msgid="2844945191792119712">"ဖုန်းမျက်နှာပြင်အား သော့ချရန်"</string> <string name="global_action_power_off" msgid="4471879440839879722">"ပါဝါပိတ်ရန်"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"အရေးပေါ်"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်း"</string> <string name="bugreport_title" msgid="2667494803742548533">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းအား ယူရန်"</string> <string name="bugreport_message" msgid="398447048750350456">"သင့်ရဲ့ လက်ရှိ စက်အခြေအနေ အချက်အလက်များကို အီးမေးလ် အနေဖြင့် ပေးပို့ရန် စုဆောင်းပါမည်။ အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းမှ ပေးပို့ရန် အသင့်ဖြစ်သည်အထိ အချိန် အနည်းငယ်ကြာမြင့်မှာ ဖြစ်သဖြင့် သည်းခံပြီး စောင့်ပါရန်"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 54d496aa7544..022a851240f0 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefoninnstillinger"</string> <string name="global_action_lock" msgid="2844945191792119712">"Lås skjermen"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Slå av"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Nødssituasjon"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Feilrapport"</string> <string name="bugreport_title" msgid="2667494803742548533">"Utfør feilrapport"</string> <string name="bugreport_message" msgid="398447048750350456">"Informasjon om tilstanden til enheten din samles inn og sendes som en e-post. Det tar litt tid fra du starter feilrapporten til e-posten er klar, så vær tålmodig."</string> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 138c67f3bab9..74db0f164c86 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"फोन विकल्पहरू"</string> <string name="global_action_lock" msgid="2844945191792119712">"स्क्रिन बन्द"</string> <string name="global_action_power_off" msgid="4471879440839879722">"बन्द गर्नुहोस्"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"आपतकालीन"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोर्ट"</string> <string name="bugreport_title" msgid="2667494803742548533">"बग रिपोर्ट लिनुहोस्"</string> <string name="bugreport_message" msgid="398447048750350456">"एउटा इमेल सन्देशको रूपमा पठाउनलाई यसले तपाईँको हालैको उपकरणको अवस्थाको बारेमा सूचना जम्मा गर्ने छ। बग रिपोर्ट सुरु गरेदेखि पठाउन तयार नभएसम्म यसले केही समय लिन्छ; कृपया धैर्य गर्नुहोस्।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index c8a804bdedf0..f0be632da2da 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefoonopties"</string> <string name="global_action_lock" msgid="2844945191792119712">"Schermvergrendeling"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Uitschakelen"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Noodgeval"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Foutenrapport"</string> <string name="bugreport_title" msgid="2667494803742548533">"Foutenrapport genereren"</string> <string name="bugreport_message" msgid="398447048750350456">"Hiermee worden gegevens over de huidige status van je apparaat verzameld en als e-mail verzonden. Wanneer u een foutenrapport start, duurt het even voordat het kan worden verzonden. Even geduld alstublieft."</string> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index a4e5b89d30bb..3e03487049d3 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ਫੋਨ ਚੋਣਾਂ"</string> <string name="global_action_lock" msgid="2844945191792119712">"ਸਕ੍ਰੀਨ ਲੌਕ"</string> <string name="global_action_power_off" msgid="4471879440839879722">"ਪਾਵਰ ਬੰਦ"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"ਸੰਕਟਕਾਲ"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"ਬਗ ਰਿਪੋਰਟ"</string> <string name="bugreport_title" msgid="2667494803742548533">"ਬਗ ਰਿਪੋਰਟ ਲਓ"</string> <string name="bugreport_message" msgid="398447048750350456">"ਇਹ ਇੱਕ ਈ-ਮੇਲ ਸੁਨੇਹਾ ਭੇਜਣ ਲਈ, ਤੁਹਾਡੀ ਵਰਤਮਾਨ ਡੀਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਤਰ ਕਰੇਗਾ। ਬਗ ਰਿਪੋਰਟ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਥੋੜ੍ਹਾ ਸਮਾਂ ਲੱਗੇਗਾ ਜਦੋਂ ਤੱਕ ਇਹ ਭੇਜੇ ਜਾਣ ਲਈ ਤਿਆਰ ਨਾ ਹੋਵੇ, ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ।"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index ade4bdc67940..d2ea263adde6 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opcje telefonu"</string> <string name="global_action_lock" msgid="2844945191792119712">"Blokada ekranu"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Wyłącz"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Alarmowe"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Zgłoszenie błędu"</string> <string name="bugreport_title" msgid="2667494803742548533">"Zgłoś błąd"</string> <string name="bugreport_message" msgid="398447048750350456">"Informacje o bieżącym stanie urządzenia zostaną zebrane i wysłane e-mailem. Przygotowanie zgłoszenia błędu do wysłania chwilę potrwa, więc zachowaj cierpliwość."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index c05931ec394a..98fe172002af 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opções do telefone"</string> <string name="global_action_lock" msgid="2844945191792119712">"Bloquear tela"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Desligar"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergência"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string> <string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string> <string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 398193e311b6..01ac4e114cb6 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opções do telefone"</string> <string name="global_action_lock" msgid="2844945191792119712">"Bloqueio de ecrã"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Desligar"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergência"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de erros"</string> <string name="bugreport_title" msgid="2667494803742548533">"Criar relatório de erros"</string> <string name="bugreport_message" msgid="398447048750350456">"Será recolhida informação sobre o estado atual do seu dispositivo a enviar através de uma mensagem de email. Demorará algum tempo até que o relatório de erro esteja pronto para ser enviado. Aguarde um pouco."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index c05931ec394a..98fe172002af 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opções do telefone"</string> <string name="global_action_lock" msgid="2844945191792119712">"Bloquear tela"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Desligar"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergência"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string> <string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string> <string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index c61b41a7b801..4181014fda16 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -216,6 +216,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opțiuni telefon"</string> <string name="global_action_lock" msgid="2844945191792119712">"Blocați ecranul"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Opriți alimentarea"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Urgență"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Raport despre erori"</string> <string name="bugreport_title" msgid="2667494803742548533">"Executați un raport despre erori"</string> <string name="bugreport_message" msgid="398447048750350456">"Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 686e3c2e1b7d..350954ec921e 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Параметры телефона"</string> <string name="global_action_lock" msgid="2844945191792119712">"Блокировка экрана"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Отключить питание"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Экстренный вызов"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Отчет об ошибке"</string> <string name="bugreport_title" msgid="2667494803742548533">"Отчет об ошибке"</string> <string name="bugreport_message" msgid="398447048750350456">"Информация о текущем состоянии вашего устройства будет собрана и отправлена по электронной почте. Подготовка отчета займет некоторое время."</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index f5878cee23f8..18fd240c2ad0 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"දුරකථන විකල්ප"</string> <string name="global_action_lock" msgid="2844945191792119712">"තිර අගුල"</string> <string name="global_action_power_off" msgid="4471879440839879722">"බලය අක්රිය කරන්න"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"හදිසි"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"දෝෂ වර්තාව"</string> <string name="bugreport_title" msgid="2667494803742548533">"දෝෂ වාර්තාවක් ගන්න"</string> <string name="bugreport_message" msgid="398447048750350456">"ඊ-තැපැල් පණිවිඩයක් ලෙස යැවීමට මෙය ඔබගේ වත්මන් උපාංග තත්වය ගැන තොරතුරු එකතු කරනු ඇත. දෝෂ වාර්තාව ආරම්භ කර එය යැවීමට සූදානම් කරන තෙක් එයට කිසියම් කාලයක් ගතවනු ඇත; කරුණාකර ඉවසන්න."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 2cb7ecd02a12..f1a1174a634d 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Možnosti telefónu"</string> <string name="global_action_lock" msgid="2844945191792119712">"Zámka obrazovky"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Vypnúť"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Tiesňové volanie"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Hlásenie o chybách"</string> <string name="bugreport_title" msgid="2667494803742548533">"Vytvoriť hlásenie chyby"</string> <string name="bugreport_message" msgid="398447048750350456">"Týmto zhromaždíte informácie o aktuálnom stave zariadenia. Informácie je potom možné odoslať e-mailom, chvíľu však potrvá, kým bude hlásenie chyby pripravené na odoslanie. Prosíme vás preto o trpezlivosť."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 9ece9eba333a..08ce1ce4da88 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Možnosti telefona"</string> <string name="global_action_lock" msgid="2844945191792119712">"Zaklep zaslona"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Izklopi"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Klic v sili"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Poročilo o napakah"</string> <string name="bugreport_title" msgid="2667494803742548533">"Ustvari poročilo o napakah"</string> <string name="bugreport_message" msgid="398447048750350456">"S tem bodo zbrani podatki o trenutnem stanju naprave, ki bodo poslani v e-poštnem sporočilu. Izvedba poročila o napakah in priprava trajata nekaj časa, zato bodite potrpežljivi."</string> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 9dcd8e6cc0c8..4bd567887937 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Opsionet e telefonit"</string> <string name="global_action_lock" msgid="2844945191792119712">"Kyçja e ekranit"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Fik"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Urgjenca"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Raporti i defekteve në kod"</string> <string name="bugreport_title" msgid="2667494803742548533">"Merr raportin e defekteve në kod"</string> <string name="bugreport_message" msgid="398447048750350456">"Ky funksion mundëson mbledhjen e informacioneve mbi gjendjen aktuale të pajisjes për ta dërguar si mesazh mail-i. Do të duhet pak kohë nga nisja e raportit të defekteve në kod. Faleminderit për durimin."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 4eb13f5ab4b0..3a68c842bcba 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -216,6 +216,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Опције телефона"</string> <string name="global_action_lock" msgid="2844945191792119712">"Закључај екран"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Искључи"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Хитни позив"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Извештај о грешци"</string> <string name="bugreport_title" msgid="2667494803742548533">"Направи извештај о грешци"</string> <string name="bugreport_message" msgid="398447048750350456">"Овим ће се прикупити информације о тренутном стању уређаја како би биле послате у поруци е-поште. Од започињања извештаја о грешци до тренутка за његово слање проћи ће неко време; будите стрпљиви."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 21016d6d30fc..a92975685c00 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefonalternativ"</string> <string name="global_action_lock" msgid="2844945191792119712">"Skärmlås"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Stäng av"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Nödsituation"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Felrapport"</string> <string name="bugreport_title" msgid="2667494803742548533">"Skapa felrapport"</string> <string name="bugreport_message" msgid="398447048750350456">"Nu hämtas information om aktuell status för enheten, som sedan skickas i ett e-postmeddelade. Det tar en liten stund innan felrapporten är färdig och kan skickas, så vi ber dig ha tålamod."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 8d9b151fd243..327ffed52b2d 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -212,6 +212,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Chaguo za simu"</string> <string name="global_action_lock" msgid="2844945191792119712">"Funga skrini"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Zima"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Dharura"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Ripoti ya hitilafu"</string> <string name="bugreport_title" msgid="2667494803742548533">"Chukua ripoti ya hitilafu"</string> <string name="bugreport_message" msgid="398447048750350456">"Hii itakusanya maelezo kuhusu hali ya kifaa chako kwa sasa, na itume kama barua pepe. Itachukua muda mfupi tangu ripoti ya hitilafu ianze kuzalishwa hadi iwe tayari kutumwa; vumilia."</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index c4c5bc321bef..94145dfa8df9 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"தொலைபேசி விருப்பங்கள்"</string> <string name="global_action_lock" msgid="2844945191792119712">"திரைப் பூட்டு"</string> <string name="global_action_power_off" msgid="4471879440839879722">"முடக்கு"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"அவசர அழைப்பு"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"பிழை அறிக்கை"</string> <string name="bugreport_title" msgid="2667494803742548533">"பிழை அறிக்கையை எடு"</string> <string name="bugreport_message" msgid="398447048750350456">"உங்கள் நடப்புச் சாதன நிலையை மின்னஞ்சல் செய்தியாக அனுப்ப, அது குறித்த தகவலை இது சேகரிக்கும். பிழை அறிக்கையைத் தொடங்குவதில் இருந்து, அது அனுப்புவதற்குத் தயாராகும் வரை, இதற்குச் சிறிது நேரம் ஆகும்; பொறுமையாகக் காத்திருக்கவும்."</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 1cfab6e68770..aff7d0e4b0ed 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ఫోన్ ఎంపికలు"</string> <string name="global_action_lock" msgid="2844945191792119712">"స్క్రీన్ లాక్"</string> <string name="global_action_power_off" msgid="4471879440839879722">"పవర్ ఆఫ్ చేయి"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"అత్యవసరం"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"బగ్ నివేదిక"</string> <string name="bugreport_title" msgid="2667494803742548533">"బగ్ నివేదికను సిద్ధం చేయి"</string> <string name="bugreport_message" msgid="398447048750350456">"ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ నివేదికను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 581bb8135a51..e470e86ff431 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"ตัวเลือกโทรศัพท์"</string> <string name="global_action_lock" msgid="2844945191792119712">"ล็อกหน้าจอ"</string> <string name="global_action_power_off" msgid="4471879440839879722">"ปิดเครื่อง"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"เหตุฉุกเฉิน"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"รายงานข้อบกพร่อง"</string> <string name="bugreport_title" msgid="2667494803742548533">"ใช้รายงานข้อบกพร่อง"</string> <string name="bugreport_message" msgid="398447048750350456">"การดำเนินการนี้จะรวบรวมข้อมูลเกี่ยวกับสถานะปัจจุบันของอุปกรณ์ของคุณ โดยจะส่งไปในรูปแบบข้อความอีเมล อาจใช้เวลาสักครู่ตั้งแต่เริ่มการสร้างรายงานข้อบกพร่องจนกระทั่งเสร็จสมบูรณ์ โปรดอดทนรอ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index df4dd9b8d5f0..4bc1ace8423b 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Pagpipilian sa telepono"</string> <string name="global_action_lock" msgid="2844945191792119712">"Pag-lock sa screen"</string> <string name="global_action_power_off" msgid="4471879440839879722">"I-off"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Emergency"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Ulat sa bug"</string> <string name="bugreport_title" msgid="2667494803742548533">"Kunin ang ulat sa bug"</string> <string name="bugreport_message" msgid="398447048750350456">"Mangongolekta ito ng impormasyon tungkol sa kasalukuyang katayuan ng iyong device, na ipapadala bilang mensaheng e-mail. Gugugol ito ng kaunting oras mula sa pagsisimula ng ulat sa bug hanggang sa handa na itong maipadala; mangyaring magpasensya."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index a1f6f6491515..4a3d219c9b7a 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefon seçenekleri"</string> <string name="global_action_lock" msgid="2844945191792119712">"Ekran kilidi"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Kapat"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Acil durum"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Hata raporu"</string> <string name="bugreport_title" msgid="2667494803742548533">"Hata raporu al"</string> <string name="bugreport_message" msgid="398447048750350456">"Bu rapor, e-posta iletisi olarak göndermek üzere cihazınızın şu anki durumuyla ilgili bilgi toplar. Hata raporu başlatıldıktan sonra hazır olması biraz zaman alabilir, lütfen sabırlı olun."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index c8b37545dd01..b53c1b6c1243 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -218,6 +218,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Параметри телеф."</string> <string name="global_action_lock" msgid="2844945191792119712">"Заблок. екран"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Вимкнути"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Екстрений виклик"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Звіт про помилки"</string> <string name="bugreport_title" msgid="2667494803742548533">"Звіт про помилку"</string> <string name="bugreport_message" msgid="398447048750350456">"Інформація про поточний стан вашого пристрою буде зібрана й надіслана електронною поштою. Підготовка звіту триватиме певний час."</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index 91a8c06e3a08..4e5f58501b52 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"فون کے اختیارات"</string> <string name="global_action_lock" msgid="2844945191792119712">"اسکرین لاک"</string> <string name="global_action_power_off" msgid="4471879440839879722">"پاور آف"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"ایمرجنسی"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"بگ کی اطلاع"</string> <string name="bugreport_title" msgid="2667494803742548533">"بگ کی اطلاع لیں"</string> <string name="bugreport_message" msgid="398447048750350456">"ایک ای میل پیغام کے بطور بھیجنے کیلئے، یہ آپ کے موجودہ آلہ کی حالت کے بارے میں معلومات جمع کرے گا۔ بگ کی اطلاع شروع کرنے سے لے کر بھیجنے کیلئے تیار ہونے تک اس میں تھوڑا وقت لگے گا؛ براہ کرم تحمل سے کام لیں۔"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 32a1328ba5c8..43514f210624 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Telefon sozlamalari"</string> <string name="global_action_lock" msgid="2844945191792119712">"Ekran qulfi"</string> <string name="global_action_power_off" msgid="4471879440839879722">"O‘chirish"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Favqulodda chaqiruv"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Nosozlik haqida ma’lumot berish"</string> <string name="bugreport_title" msgid="2667494803742548533">"Xatoliklar hisoboti"</string> <string name="bugreport_message" msgid="398447048750350456">"Qurilmangiz holati haqidagi ma’lumotlar to‘planib, e-pochta orqali yuboriladi. Hisobotni tayyorlash biroz vaqt olishi mumkin."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 3b86a379f8ce..505d685f0107 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Tùy chọn điện thoại"</string> <string name="global_action_lock" msgid="2844945191792119712">"Khoá màn hình"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Tắt nguồn"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Khẩn cấp"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Báo cáo lỗi"</string> <string name="bugreport_title" msgid="2667494803742548533">"Nhận báo cáo lỗi"</string> <string name="bugreport_message" msgid="398447048750350456">"Báo cáo này sẽ thu thập thông tin về tình trạng thiết bị hiện tại của bạn, để gửi dưới dạng thông báo qua email. Sẽ mất một chút thời gian kể từ khi bắt đầu báo cáo lỗi cho tới khi báo cáo sẵn sàng để gửi; xin vui lòng kiên nhẫn."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index d7490c57f2e0..0472726d5a0b 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"手机选项"</string> <string name="global_action_lock" msgid="2844945191792119712">"屏幕锁定"</string> <string name="global_action_power_off" msgid="4471879440839879722">"关机"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"紧急呼救"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"错误报告"</string> <string name="bugreport_title" msgid="2667494803742548533">"提交错误报告"</string> <string name="bugreport_message" msgid="398447048750350456">"这会收集有关当前设备状态的信息,并以电子邮件的形式进行发送。从开始生成错误报告到准备好发送需要一点时间,请耐心等待。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 6c896b2534ef..a313caad3f75 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"手機選項"</string> <string name="global_action_lock" msgid="2844945191792119712">"螢幕鎖定"</string> <string name="global_action_power_off" msgid="4471879440839879722">"關閉"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"緊急"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string> <string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string> <string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,並以電郵傳送給您。從開始建立錯誤報告到準備傳送需要一段時間,請耐心等候。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index f3691cd74198..c669d4bfc5bf 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"電話選項"</string> <string name="global_action_lock" msgid="2844945191792119712">"螢幕鎖定"</string> <string name="global_action_power_off" msgid="4471879440839879722">"關機"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"緊急電話"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string> <string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string> <string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index a2f5c13bb1b0..80d24fd44bf9 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -214,6 +214,7 @@ <string name="global_actions" product="default" msgid="2406416831541615258">"Okukhethwa kukho kwefoni"</string> <string name="global_action_lock" msgid="2844945191792119712">"Ukuvala isikrini"</string> <string name="global_action_power_off" msgid="4471879440839879722">"Vala amandla"</string> + <string name="global_action_emergency" msgid="7112311161137421166">"Isimo esiphuthumayo"</string> <string name="global_action_bug_report" msgid="7934010578922304799">"Umbiko wephutha"</string> <string name="bugreport_title" msgid="2667494803742548533">"Thatha umbiko wesiphazamiso"</string> <string name="bugreport_message" msgid="398447048750350456">"Lokhu kuzoqoqa ulwazi mayelana nesimo samanje sedivayisi yakho, ukuthumela imilayezo ye-imeyili. Kuzothatha isikhathi esincane kusuka ekuqaleni umbiko wesiphazamiso uze ulungele ukuthunyelwa; sicela ubekezele."</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index d0fd36ad269e..48af3cc65f08 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2486,4 +2486,14 @@ <string-array translatable="false" name="config_defaultPinnerServiceFiles"> </string-array> + <!-- emergency call number for the emergency affordance --> + <string name="config_emergency_call_number" translatable="false">112</string> + + <!-- Do not translate. Mcc codes whose existence trigger the presence of emergency + affordances--> + <integer-array name="config_emergency_mcc_codes" translatable="false"> + <item>404</item> + <item>405</item> + </integer-array> + </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index b55a9b22118b..ceb79edd04bf 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -482,6 +482,9 @@ <!-- label for item that turns off power in phone options dialog --> <string name="global_action_power_off">Power off</string> + <!-- label for item that starts emergency call --> + <string name="global_action_emergency">Emergency</string> + <!-- label for item that generates a bug report in the phone options dialog --> <string name="global_action_bug_report">Bug report</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index d154b034e058..d5db4252fd6d 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2612,4 +2612,9 @@ <java-symbol type="layout" name="unsupported_display_size_dialog_content" /> <java-symbol type="string" name="unsupported_display_size_message" /> + <java-symbol type="string" name="global_action_emergency" /> + <java-symbol type="string" name="config_emergency_call_number" /> + <java-symbol type="array" name="config_emergency_mcc_codes" /> + + <java-symbol type="drawable" name="emergency_icon" /> </resources> diff --git a/core/tests/utiltests/Android.mk b/core/tests/utiltests/Android.mk index 6d1ebb4a6f58..4013c4ce4248 100644 --- a/core/tests/utiltests/Android.mk +++ b/core/tests/utiltests/Android.mk @@ -12,6 +12,8 @@ LOCAL_MODULE_TAGS := tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_SRC_FILES += src/android/util/IRemoteMemoryIntArray.aidl +LOCAL_JNI_SHARED_LIBRARIES := libmemoryintarraytest libcutils libc++ + LOCAL_STATIC_JAVA_LIBRARIES := \ android-support-test \ mockito-target @@ -23,3 +25,5 @@ LOCAL_PACKAGE_NAME := FrameworksUtilTests LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/core/tests/utiltests/jni/Android.mk b/core/tests/utiltests/jni/Android.mk new file mode 100644 index 000000000000..d0b611cee7a1 --- /dev/null +++ b/core/tests/utiltests/jni/Android.mk @@ -0,0 +1,32 @@ +# Copyright 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License..
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libmemoryintarraytest
+
+LOCAL_SRC_FILES := \
+ registration.cpp \
+ android_util_MemoryIntArrayTest.cpp
+
+LOCAL_CFLAGS += -include bionic/libc/kernel/uapi/linux/types.h
+
+LOCAL_SHARED_LIBRARIES := libcutils
+
+LOCAL_CLANG := true
+
+LOCAL_CPPFLAGS := -Werror
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp b/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp new file mode 100644 index 000000000000..57ee2d5f6cbb --- /dev/null +++ b/core/tests/utiltests/jni/android_util_MemoryIntArrayTest.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <atomic> +#include <jni.h> +#include <cutils/ashmem.h> +#include <linux/ashmem.h> +#include <sys/ioctl.h> +#include <sys/mman.h> + +jint android_util_MemoryIntArrayTest_createAshmem(__attribute__((unused)) JNIEnv* env, + __attribute__((unused)) jobject clazz, + jstring name, jint size) +{ + + if (name == NULL) { + return -1; + } + + if (size < 0) { + return -1; + } + + const char* nameStr = env->GetStringUTFChars(name, NULL); + const int ashmemSize = sizeof(std::atomic_int) * size; + int fd = ashmem_create_region(nameStr, ashmemSize); + env->ReleaseStringUTFChars(name, nameStr); + + if (fd < 0) { + return -1; + } + + int setProtResult = ashmem_set_prot_region(fd, PROT_READ | PROT_WRITE); + if (setProtResult < 0) { + return -1; + } + + return fd; +} + +void android_util_MemoryIntArrayTest_setAshmemSize(__attribute__((unused)) JNIEnv* env, + __attribute__((unused)) jobject clazz, jint fd, jint size) +{ + if (fd < 0) { + return; + } + + if (size < 0) { + return; + } + + ioctl(fd, ASHMEM_SET_SIZE, size); +} diff --git a/core/tests/utiltests/jni/registration.cpp b/core/tests/utiltests/jni/registration.cpp new file mode 100644 index 000000000000..0c84d98e9de9 --- /dev/null +++ b/core/tests/utiltests/jni/registration.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <jni.h> + +extern jint android_util_MemoryIntArrayTest_createAshmem(JNIEnv* env, + jobject clazz, jstring name, jint size); +extern void android_util_MemoryIntArrayTest_setAshmemSize(JNIEnv* env, + jobject clazz, jint fd, jint size); + +extern "C" { + JNIEXPORT jint JNICALL Java_android_util_MemoryIntArrayTest_nativeCreateAshmem( + JNIEnv * env, jobject obj, jstring name, jint size); + JNIEXPORT void JNICALL Java_android_util_MemoryIntArrayTest_nativeSetAshmemSize( + JNIEnv * env, jobject obj, jint fd, jint size); +}; + +JNIEXPORT jint JNICALL Java_android_util_MemoryIntArrayTest_nativeCreateAshmem( + __attribute__((unused)) JNIEnv * env,__attribute__((unused)) jobject obj, + jstring name, jint size) +{ + return android_util_MemoryIntArrayTest_createAshmem(env, obj, name, size); +} + +JNIEXPORT void JNICALL Java_android_util_MemoryIntArrayTest_nativeSetAshmemSize( + __attribute__((unused)) JNIEnv * env,__attribute__((unused)) jobject obj, + jint fd, jint size) +{ + android_util_MemoryIntArrayTest_setAshmemSize(env, obj, fd, size); +} diff --git a/core/tests/utiltests/src/android/util/IRemoteMemoryIntArray.aidl b/core/tests/utiltests/src/android/util/IRemoteMemoryIntArray.aidl index 0a65fff2c38c..10d14f1c3266 100644 --- a/core/tests/utiltests/src/android/util/IRemoteMemoryIntArray.aidl +++ b/core/tests/utiltests/src/android/util/IRemoteMemoryIntArray.aidl @@ -20,11 +20,12 @@ import android.util.MemoryIntArray; interface IRemoteMemoryIntArray { MemoryIntArray peekInstance(); - void create(int size, boolean clientWritable); + void create(int size); boolean isWritable(); int get(int index); void set(int index, int value); int size(); void close(); boolean isClosed(); + void accessLastElementInRemoteProcess(in MemoryIntArray array); } diff --git a/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java b/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java index 129e6b7cbc03..85817bbde1bb 100644 --- a/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java +++ b/core/tests/utiltests/src/android/util/MemoryIntArrayTest.java @@ -28,14 +28,22 @@ import libcore.io.IoUtils; import org.junit.Test; import org.junit.runner.RunWith; +import java.lang.reflect.Field; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + @RunWith(AndroidJUnit4.class) public class MemoryIntArrayTest { + static { + System.loadLibrary("cutils"); + System.loadLibrary("memoryintarraytest"); + } @Test public void testSize() throws Exception { MemoryIntArray array = null; try { - array = new MemoryIntArray(3, false); + array = new MemoryIntArray(3); assertEquals("size must be three", 3, array.size()); } finally { IoUtils.closeQuietly(array); @@ -46,7 +54,7 @@ public class MemoryIntArrayTest { public void testGetSet() throws Exception { MemoryIntArray array = null; try { - array = new MemoryIntArray(3, false); + array = new MemoryIntArray(3); array.set(0, 1); array.set(1, 2); @@ -64,7 +72,7 @@ public class MemoryIntArrayTest { public void testWritable() throws Exception { MemoryIntArray array = null; try { - array = new MemoryIntArray(3, true); + array = new MemoryIntArray(3); assertTrue("Must be mutable", array.isWritable()); } finally { IoUtils.closeQuietly(array); @@ -75,7 +83,7 @@ public class MemoryIntArrayTest { public void testClose() throws Exception { MemoryIntArray array = null; try { - array = new MemoryIntArray(3, false); + array = new MemoryIntArray(3); array.close(); assertTrue("Must be closed", array.isClosed()); } finally { @@ -90,7 +98,7 @@ public class MemoryIntArrayTest { MemoryIntArray firstArray = null; MemoryIntArray secondArray = null; try { - firstArray = new MemoryIntArray(3, false); + firstArray = new MemoryIntArray(3); firstArray.set(0, 1); firstArray.set(1, 2); @@ -117,7 +125,7 @@ public class MemoryIntArrayTest { public void testInteractOnceClosed() throws Exception { MemoryIntArray array = null; try { - array = new MemoryIntArray(3, false); + array = new MemoryIntArray(3); array.close(); array.close(); @@ -160,7 +168,7 @@ public class MemoryIntArrayTest { public void testInteractPutOfBounds() throws Exception { MemoryIntArray array = null; try { - array = new MemoryIntArray(3, false); + array = new MemoryIntArray(3); try { array.get(-1); @@ -198,7 +206,7 @@ public class MemoryIntArrayTest { public void testOverMaxSize() throws Exception { MemoryIntArray array = null; try { - array = new MemoryIntArray(MemoryIntArray.getMaxSize() + 1, false); + array = new MemoryIntArray(MemoryIntArray.getMaxSize() + 1); fail("Cannot use over max size"); } catch (IllegalArgumentException e) { /* expected */ @@ -209,7 +217,7 @@ public class MemoryIntArrayTest { @Test public void testNotMutableByUnprivilegedClients() throws Exception { - RemoteIntArray remoteIntArray = new RemoteIntArray(1, false); + RemoteIntArray remoteIntArray = new RemoteIntArray(1); try { assertNotNull("Couldn't get remote instance", remoteIntArray); MemoryIntArray localIntArray = remoteIntArray.peekInstance(); @@ -230,4 +238,64 @@ public class MemoryIntArrayTest { remoteIntArray.destroy(); } } + + @Test + public void testAshmemSizeMatchesMemoryIntArraySize() throws Exception { + boolean success = false; + + // Get a handle to a remote process to send the fd + RemoteIntArray remoteIntArray = new RemoteIntArray(1); + try { + // Let us try 100 times + for (int i = 0; i < 100; i++) { + // Create a MemoryIntArray to muck with + MemoryIntArray array = new MemoryIntArray(1); + + // Create the fd to stuff in the MemoryIntArray + final int fd = nativeCreateAshmem("foo", 1); + + // Replace the fd with our ahsmem region + Field fdFiled = MemoryIntArray.class.getDeclaredField("mFd"); + fdFiled.setAccessible(true); + fdFiled.set(array, fd); + + CountDownLatch countDownLatch = new CountDownLatch(2); + + new Thread() { + @Override + public void run() { + for (int i = 2; i < Integer.MAX_VALUE; i++) { + if (countDownLatch.getCount() == 1) { + countDownLatch.countDown(); + return; + } + nativeSetAshmemSize(fd, i); + } + } + }.start(); + + try { + remoteIntArray.accessLastElementInRemoteProcess(array); + } catch (IllegalArgumentException e) { + success = true; + } + + countDownLatch.countDown(); + countDownLatch.await(1000, TimeUnit.MILLISECONDS); + + if (success) { + break; + } + } + } finally { + remoteIntArray.destroy(); + } + + if (!success) { + fail("MemoryIntArray should catch ahshmem size changing under it"); + } + } + + private native int nativeCreateAshmem(String name, int size); + private native void nativeSetAshmemSize(int fd, int size); } diff --git a/core/tests/utiltests/src/android/util/RemoteIntArray.java b/core/tests/utiltests/src/android/util/RemoteIntArray.java index 10c325fcc1fb..7dc3400779b0 100644 --- a/core/tests/utiltests/src/android/util/RemoteIntArray.java +++ b/core/tests/utiltests/src/android/util/RemoteIntArray.java @@ -40,7 +40,7 @@ final class RemoteIntArray implements ServiceConnection, Closeable { private android.util.IRemoteMemoryIntArray mRemoteInstance; - public RemoteIntArray(int size, boolean clientWritable) throws IOException, TimeoutException { + public RemoteIntArray(int size) throws IOException, TimeoutException { mIntent.setComponent(new ComponentName(InstrumentationRegistry.getContext(), RemoteMemoryIntArrayService.class)); synchronized (mLock) { @@ -48,7 +48,7 @@ final class RemoteIntArray implements ServiceConnection, Closeable { bindLocked(); } try { - mRemoteInstance.create(size, clientWritable); + mRemoteInstance.create(size); } catch (RemoteException e) { throw new IOException(e); } @@ -148,6 +148,14 @@ final class RemoteIntArray implements ServiceConnection, Closeable { } } + public void accessLastElementInRemoteProcess(MemoryIntArray array) { + try { + mRemoteInstance.accessLastElementInRemoteProcess(array); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } + @Override public void onServiceConnected(ComponentName name, IBinder service) { synchronized (mLock) { diff --git a/core/tests/utiltests/src/android/util/RemoteMemoryIntArrayService.java b/core/tests/utiltests/src/android/util/RemoteMemoryIntArrayService.java index 35ae9a777bcb..9264c6c86c3f 100644 --- a/core/tests/utiltests/src/android/util/RemoteMemoryIntArrayService.java +++ b/core/tests/utiltests/src/android/util/RemoteMemoryIntArrayService.java @@ -35,10 +35,10 @@ public class RemoteMemoryIntArrayService extends Service { return new android.util.IRemoteMemoryIntArray.Stub() { @Override - public void create(int size, boolean clientWritable) { + public void create(int size) { synchronized (mLock) { try { - mArray = new MemoryIntArray(size, clientWritable); + mArray = new MemoryIntArray(size); } catch (IOException e) { throw new IllegalStateException(e); } @@ -109,6 +109,15 @@ public class RemoteMemoryIntArrayService extends Service { return mArray.isClosed(); } } + + @Override + public void accessLastElementInRemoteProcess(MemoryIntArray array) { + try { + array.get(array.size() - 1); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } }; } } diff --git a/docs/__DEPRECATED__DO_NOT_EDIT__.txt b/docs/__DEPRECATED__DO_NOT_EDIT__.txt new file mode 100644 index 000000000000..3f8fc80c3b0b --- /dev/null +++ b/docs/__DEPRECATED__DO_NOT_EDIT__.txt @@ -0,0 +1,16 @@ +### DEPRECATED: DO NOT EDIT ### + +The source files for developer.android.com are NO LONGER MAINTAINED HERE, as +of 12/2016. Migration of content was completed on 10/16/2016. + +All authoring of content has been moved to Piper (go/dac-source). + +Exceptions and Caveats: + +- Reference documentation is still maintained via building of .java source files, + so you may continue to update JavaDoc comments to update documentation. + +- Sample code documentation is not maintained in Piper, but is published from + a separate code repository. + +For answers to further questions, please email: android-writers@google.com diff --git a/docs/html/__DEPRECATED__DO_NOT_EDIT__.txt b/docs/html/__DEPRECATED__DO_NOT_EDIT__.txt new file mode 100644 index 000000000000..3f8fc80c3b0b --- /dev/null +++ b/docs/html/__DEPRECATED__DO_NOT_EDIT__.txt @@ -0,0 +1,16 @@ +### DEPRECATED: DO NOT EDIT ### + +The source files for developer.android.com are NO LONGER MAINTAINED HERE, as +of 12/2016. Migration of content was completed on 10/16/2016. + +All authoring of content has been moved to Piper (go/dac-source). + +Exceptions and Caveats: + +- Reference documentation is still maintained via building of .java source files, + so you may continue to update JavaDoc comments to update documentation. + +- Sample code documentation is not maintained in Piper, but is published from + a separate code repository. + +For answers to further questions, please email: android-writers@google.com diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd index 80a989a57e28..99aeb4379eeb 100644 --- a/docs/html/guide/topics/resources/providing-resources.jd +++ b/docs/html/guide/topics/resources/providing-resources.jd @@ -905,20 +905,25 @@ PNG file and two small XML files that point to it. (An example XML file is shown <h4>Drawable</h4> -<p>To create an alias to an existing drawable, use the {@code <bitmap>} element. -For example:</p> +<p> + To create an alias to an existing drawable, use the {@code <drawable>} + element. For example: +</p> <pre> <?xml version="1.0" encoding="utf-8"?> -<bitmap xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/icon_ca" /> +<resources> + <drawable name="icon">@drawable/icon_ca</drawable> +</resources> </pre> -<p>If you save this file as {@code icon.xml} (in an alternative resource directory, such as -{@code res/drawable-en-rCA/}), it is compiled into a resource that you -can reference as {@code R.drawable.icon}, but is actually an alias for the {@code -R.drawable.icon_ca} resource (which is saved in {@code res/drawable/}).</p> - +<p> + If you save this file as {@code drawables.xml} (in an alternative resource + directory, such as {@code res/values-en-rCA/}), it is compiled into a + resource that you can reference as {@code R.drawable.icon}, but is actually + an alias for the {@code R.drawable.icon_ca} resource (which is saved in + {@code res/drawable/}). +</p> <h4>Layout</h4> diff --git a/libs/androidfw/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index f50cff4387d2..1bc4c244dac9 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -795,6 +795,7 @@ void AssetManager::addSystemOverlays(const char* pathOverlaysList, sharedRes->add(oass, oidmap, offset + 1, false); const_cast<AssetManager*>(this)->mAssetPaths.add(oap); const_cast<AssetManager*>(this)->mZipSet.addOverlay(targetPackagePath, oap); + delete oidmap; } } fclose(fin); diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index 62f33bf490a8..740042c2e1bd 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -161,7 +161,8 @@ public class ExternalStorageProvider extends DocumentsProvider { final VolumeInfo privateVol = mStorageManager.findPrivateForEmulated(volume); title = mStorageManager.getBestVolumeDescription(privateVol); } - } else if (volume.getType() == VolumeInfo.TYPE_PUBLIC) { + } else if (volume.getType() == VolumeInfo.TYPE_PUBLIC + && volume.getMountUserId() == userId) { rootId = volume.getFsUuid(); title = mStorageManager.getBestVolumeDescription(volume); } else { diff --git a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java index 8d411453b5ae..725684332fe9 100644 --- a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java +++ b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java @@ -28,13 +28,16 @@ import android.os.UserHandle; import android.telecom.TelecomManager; import android.util.AttributeSet; import android.util.Slog; +import android.view.MotionEvent; import android.view.View; +import android.view.ViewConfiguration; import android.widget.Button; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.widget.LockPatternUtils; +import com.android.internal.policy.EmergencyAffordanceManager; /** * This class implements a smart emergency button that updates itself based @@ -51,7 +54,10 @@ public class EmergencyButton extends Button { | Intent.FLAG_ACTIVITY_CLEAR_TOP); private static final String LOG_TAG = "EmergencyButton"; + private final EmergencyAffordanceManager mEmergencyAffordanceManager; + private int mDownX; + private int mDownY; KeyguardUpdateMonitorCallback mInfoCallback = new KeyguardUpdateMonitorCallback() { @Override @@ -64,6 +70,7 @@ public class EmergencyButton extends Button { updateEmergencyCallButton(); } }; + private boolean mLongPressWasDragged; public interface EmergencyButtonCallback { public void onEmergencyButtonClickedWhenInCall(); @@ -86,6 +93,7 @@ public class EmergencyButton extends Button { com.android.internal.R.bool.config_voice_capable); mEnableEmergencyCallWhileSimLocked = mContext.getResources().getBoolean( com.android.internal.R.bool.config_enable_emergency_call_while_sim_locked); + mEmergencyAffordanceManager = new EmergencyAffordanceManager(context); } @Override @@ -110,10 +118,40 @@ public class EmergencyButton extends Button { takeEmergencyCallAction(); } }); + setOnLongClickListener(new OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + if (!mLongPressWasDragged + && mEmergencyAffordanceManager.needsEmergencyAffordance()) { + mEmergencyAffordanceManager.performEmergencyCall(); + return true; + } + return false; + } + }); updateEmergencyCallButton(); } @Override + public boolean onTouchEvent(MotionEvent event) { + final int x = (int) event.getX(); + final int y = (int) event.getY(); + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { + mDownX = x; + mDownY = y; + mLongPressWasDragged = false; + } else { + final int xDiff = Math.abs(x - mDownX); + final int yDiff = Math.abs(y - mDownY); + int touchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); + if (Math.abs(yDiff) > touchSlop || Math.abs(xDiff) > touchSlop) { + mLongPressWasDragged = true; + } + } + return super.onTouchEvent(event); + } + + @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); updateEmergencyCallButton(); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java b/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java index f4f7986a753d..6e291c789b28 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/GenerationRegistry.java @@ -119,7 +119,7 @@ final class GenerationRegistry { // and twice max user count for system and secure. final int size = 1 + 2 + 10 + 2 * UserManager.getMaxSupportedUsers(); try { - mBackingStore = new MemoryIntArray(size, false); + mBackingStore = new MemoryIntArray(size); } catch (IOException e) { Slog.e(LOG_TAG, "Error creating generation tracker", e); } diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 64ca2e3eb3de..c9b59adeb2da 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -87,6 +87,8 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.WorkSource; import android.provider.Settings; +import android.text.TextUtils; +import android.util.EventLog; import android.util.Log; import android.util.Slog; @@ -2552,9 +2554,22 @@ public class LocationManagerService extends ILocationManager.Stub { if (mockProvider == null) { throw new IllegalArgumentException("Provider \"" + provider + "\" unknown"); } + + // Ensure that the location is marked as being mock. There's some logic to do this in + // handleLocationChanged(), but it fails if loc has the wrong provider (bug 33091107). + Location mock = new Location(loc); + mock.setIsFromMockProvider(true); + + if (!TextUtils.isEmpty(loc.getProvider()) && !provider.equals(loc.getProvider())) { + // The location has an explicit provider that is different from the mock provider + // name. The caller may be trying to fool us via bug 33091107. + EventLog.writeEvent(0x534e4554, "33091107", Binder.getCallingUid(), + provider + "!=" + loc.getProvider()); + } + // clear calling identity so INSTALL_LOCATION_PROVIDER permission is not required long identity = Binder.clearCallingIdentity(); - mockProvider.setLocation(loc); + mockProvider.setLocation(mock); Binder.restoreCallingIdentity(identity); } } diff --git a/services/core/java/com/android/server/PersistentDataBlockService.java b/services/core/java/com/android/server/PersistentDataBlockService.java index 680547ab9365..c8a259616bad 100644 --- a/services/core/java/com/android/server/PersistentDataBlockService.java +++ b/services/core/java/com/android/server/PersistentDataBlockService.java @@ -31,6 +31,7 @@ import android.service.persistentdata.PersistentDataBlockManager; import android.util.Slog; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import libcore.io.IoUtils; @@ -52,15 +53,14 @@ import java.util.Arrays; * This data will live across factory resets not initiated via the Settings UI. * When a device is factory reset through Settings this data is wiped. * - * Allows writing one block at a time. Namely, each time - * {@link android.service.persistentdata.IPersistentDataBlockService}.write(byte[] data) - * is called, it will overwite the data that was previously written on the block. + * Allows writing one block at a time. Namely, each time {@link IPersistentDataBlockService#write} + * is called, it will overwrite the data that was previously written on the block. * * Clients can query the size of the currently written block via - * {@link android.service.persistentdata.IPersistentDataBlockService}.getTotalDataSize(). + * {@link IPersistentDataBlockService#getDataBlockSize} * - * Clients can any number of bytes from the currently written block up to its total size by invoking - * {@link android.service.persistentdata.IPersistentDataBlockService}.read(byte[] data) + * Clients can read any number of bytes from the currently written block up to its total size by + * invoking {@link IPersistentDataBlockService#read} */ public class PersistentDataBlockService extends SystemService { private static final String TAG = PersistentDataBlockService.class.getSimpleName(); @@ -84,6 +84,9 @@ public class PersistentDataBlockService extends SystemService { private int mAllowedUid = -1; private long mBlockDeviceSize; + @GuardedBy("mLock") + private boolean mIsWritable = true; + public PersistentDataBlockService(Context context) { super(context); mContext = context; @@ -368,6 +371,11 @@ public class PersistentDataBlockService extends SystemService { headerAndData.put(data); synchronized (mLock) { + if (!mIsWritable) { + IoUtils.closeQuietly(outputStream); + return -1; + } + try { byte[] checksum = new byte[DIGEST_SIZE_BYTES]; outputStream.write(checksum, 0, DIGEST_SIZE_BYTES); @@ -442,6 +450,9 @@ public class PersistentDataBlockService extends SystemService { if (ret < 0) { Slog.e(TAG, "failed to wipe persistent partition"); + } else { + mIsWritable = false; + Slog.i(TAG, "persistent partition now wiped and unwritable"); } } } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5807a354e8c0..b779fd9bdeeb 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -189,6 +189,7 @@ import android.os.UpdateLock; import android.os.UserHandle; import android.os.UserManager; import android.os.WorkSource; +import android.provider.Downloads; import android.os.storage.IMountService; import android.os.storage.MountServiceInternal; import android.os.storage.StorageManager; @@ -8510,6 +8511,12 @@ public final class ActivityManagerService extends ActivityManagerNative // Only inspect grants matching package if (packageName == null || perm.sourcePkg.equals(packageName) || perm.targetPkg.equals(packageName)) { + // Hacky solution as part of fixing a security bug; ignore + // grants associated with DownloadManager so we don't have + // to immediately launch it to regrant the permissions + if (Downloads.Impl.AUTHORITY.equals(perm.uri.uri.getAuthority()) + && !persistable) continue; + persistChanged |= perm.revokeModes(persistable ? ~0 : ~Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION, true); @@ -10356,6 +10363,46 @@ public final class ActivityManagerService extends ActivityManagerNative } /** + * Check if the calling UID has a possible chance at accessing the provider + * at the given authority and user. + */ + public String checkContentProviderAccess(String authority, int userId) { + if (userId == UserHandle.USER_ALL) { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.INTERACT_ACROSS_USERS_FULL, TAG); + userId = UserHandle.getCallingUserId(); + } + + ProviderInfo cpi = null; + try { + cpi = AppGlobals.getPackageManager().resolveContentProvider(authority, + STOCK_PM_FLAGS | PackageManager.GET_URI_PERMISSION_PATTERNS + | PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, + userId); + } catch (RemoteException ignored) { + } + if (cpi == null) { + // TODO: make this an outright failure in a future platform release; + // until then anonymous content notifications are unprotected + //return "Failed to find provider " + authority + " for user " + userId; + return null; + } + + ProcessRecord r = null; + synchronized (mPidsSelfLocked) { + r = mPidsSelfLocked.get(Binder.getCallingPid()); + } + if (r == null) { + return "Failed to find PID " + Binder.getCallingPid(); + } + + synchronized (this) { + return checkContentProviderPermissionLocked(cpi, r, userId, true); + } + } + + /** * Check if {@link ProcessRecord} has a possible chance at accessing the * given {@link ProviderInfo}. Final permission checking is always done * in {@link ContentProvider}. @@ -21545,6 +21592,11 @@ public final class ActivityManagerService extends ActivityManagerNative private final class LocalService extends ActivityManagerInternal { @Override + public String checkContentProviderAccess(String authority, int userId) { + return ActivityManagerService.this.checkContentProviderAccess(authority, userId); + } + + @Override public void onWakefulnessChanged(int wakefulness) { ActivityManagerService.this.onWakefulnessChanged(wakefulness); } diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 01b23939815c..5d371dc8a13c 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -20,12 +20,12 @@ import android.Manifest; import android.accounts.Account; import android.annotation.Nullable; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.ActivityManagerNative; import android.app.AppOpsManager; import android.app.job.JobInfo; import android.content.BroadcastReceiver; import android.content.ComponentName; -import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Context; import android.content.IContentService; @@ -66,7 +66,6 @@ import com.android.server.SystemService; import java.io.FileDescriptor; import java.io.PrintWriter; -import java.security.InvalidParameterException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -296,24 +295,15 @@ public final class ContentService extends IContentService.Stub { final int uid = Binder.getCallingUid(); final int pid = Binder.getCallingPid(); - final int callingUserHandle = UserHandle.getCallingUserId(); - // Registering an observer for any user other than the calling user requires uri grant or - // cross user permission - if (callingUserHandle != userHandle) { - if (checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_READ_URI_PERMISSION, userHandle) - != PackageManager.PERMISSION_GRANTED) { - enforceCrossUserPermission(userHandle, - "no permission to observe other users' provider view"); - } - } - if (userHandle < 0) { - if (userHandle == UserHandle.USER_CURRENT) { - userHandle = ActivityManager.getCurrentUser(); - } else if (userHandle != UserHandle.USER_ALL) { - throw new InvalidParameterException("Bad user handle for registerContentObserver: " - + userHandle); - } + userHandle = handleIncomingUser(uri, pid, uid, + Intent.FLAG_GRANT_READ_URI_PERMISSION, userHandle); + + final String msg = LocalServices.getService(ActivityManagerInternal.class) + .checkContentProviderAccess(uri.getAuthority(), userHandle); + if (msg != null) { + Log.w(TAG, "Ignoring content changes for " + uri + " from " + uid + ": " + msg); + return; } synchronized (mRootNode) { @@ -363,22 +353,15 @@ public final class ContentService extends IContentService.Stub { final int uid = Binder.getCallingUid(); final int pid = Binder.getCallingPid(); final int callingUserHandle = UserHandle.getCallingUserId(); - // Notify for any user other than the caller requires uri grant or cross user permission - if (callingUserHandle != userHandle) { - if (checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, - userHandle) != PackageManager.PERMISSION_GRANTED) { - enforceCrossUserPermission(userHandle, "no permission to notify other users"); - } - } - // We passed the permission check; resolve pseudouser targets as appropriate - if (userHandle < 0) { - if (userHandle == UserHandle.USER_CURRENT) { - userHandle = ActivityManager.getCurrentUser(); - } else if (userHandle != UserHandle.USER_ALL) { - throw new InvalidParameterException("Bad user handle for notifyChange: " - + userHandle); - } + userHandle = handleIncomingUser(uri, pid, uid, + Intent.FLAG_GRANT_WRITE_URI_PERMISSION, userHandle); + + final String msg = LocalServices.getService(ActivityManagerInternal.class) + .checkContentProviderAccess(uri.getAuthority(), userHandle); + if (msg != null) { + Log.w(TAG, "Ignoring notify for " + uri + " from " + uid + ": " + msg); + return; } // This makes it so that future permission checks will be in the context of this @@ -1145,6 +1128,27 @@ public final class ContentService extends IContentService.Stub { } } + private int handleIncomingUser(Uri uri, int pid, int uid, int modeFlags, int userId) { + if (userId == UserHandle.USER_CURRENT) { + userId = ActivityManager.getCurrentUser(); + } + + if (userId == UserHandle.USER_ALL) { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.INTERACT_ACROSS_USERS_FULL, TAG); + } else if (userId < 0) { + throw new IllegalArgumentException("Invalid user: " + userId); + } else if (userId != UserHandle.getCallingUserId()) { + if (checkUriPermission(uri, pid, uid, modeFlags, + userId) != PackageManager.PERMISSION_GRANTED) { + mContext.enforceCallingOrSelfPermission( + Manifest.permission.INTERACT_ACROSS_USERS_FULL, TAG); + } + } + + return userId; + } + /** * Checks if the request is from the system or an app that has INTERACT_ACROSS_USERS_FULL * permission, if the userHandle is not for the caller. diff --git a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java new file mode 100644 index 000000000000..353f4506e1e9 --- /dev/null +++ b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java @@ -0,0 +1,318 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.server.emergency; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Looper; +import android.os.Message; +import android.provider.Settings; +import android.telephony.CellInfo; +import android.telephony.CellInfoGsm; +import android.telephony.CellInfoLte; +import android.telephony.CellInfoWcdma; +import android.telephony.CellLocation; +import android.telephony.PhoneStateListener; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; + +import com.android.server.SystemService; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * A service that listens to connectivity and SIM card changes and determines if the emergency mode + * should be enabled + */ +public class EmergencyAffordanceService extends SystemService { + + private static final String TAG = "EmergencyAffordanceService"; + + private static final int NUM_SCANS_UNTIL_ABORT = 4; + + private static final int INITIALIZE_STATE = 1; + private static final int CELL_INFO_STATE_CHANGED = 2; + private static final int SUBSCRIPTION_CHANGED = 3; + + /** + * Global setting, whether the last scan of the sim cards reveal that a sim was inserted that + * requires the emergency affordance. The value is a boolean (1 or 0). + * @hide + */ + private static final String EMERGENCY_SIM_INSERTED_SETTING = "emergency_sim_inserted_before"; + + private final Context mContext; + private final ArrayList<Integer> mEmergencyCallMccNumbers; + + private final Object mLock = new Object(); + + private TelephonyManager mTelephonyManager; + private SubscriptionManager mSubscriptionManager; + private boolean mEmergencyAffordanceNeeded; + private MyHandler mHandler; + private int mScansCompleted; + private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { + @Override + public void onCellInfoChanged(List<CellInfo> cellInfo) { + if (!isEmergencyAffordanceNeeded()) { + requestCellScan(); + } + } + + @Override + public void onCellLocationChanged(CellLocation location) { + if (!isEmergencyAffordanceNeeded()) { + requestCellScan(); + } + } + }; + private BroadcastReceiver mAirplaneModeReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (Settings.Global.getInt(context.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) == 0) { + startScanning(); + requestCellScan(); + } + } + }; + private boolean mSimNeedsEmergencyAffordance; + private boolean mNetworkNeedsEmergencyAffordance; + private boolean mVoiceCapable; + + private void requestCellScan() { + mHandler.obtainMessage(CELL_INFO_STATE_CHANGED).sendToTarget(); + } + + private SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionChangedListener + = new SubscriptionManager.OnSubscriptionsChangedListener() { + @Override + public void onSubscriptionsChanged() { + mHandler.obtainMessage(SUBSCRIPTION_CHANGED).sendToTarget(); + } + }; + + public EmergencyAffordanceService(Context context) { + super(context); + mContext = context; + int[] numbers = context.getResources().getIntArray( + com.android.internal.R.array.config_emergency_mcc_codes); + mEmergencyCallMccNumbers = new ArrayList<>(numbers.length); + for (int i = 0; i < numbers.length; i++) { + mEmergencyCallMccNumbers.add(numbers[i]); + } + } + + private void updateEmergencyAffordanceNeeded() { + synchronized (mLock) { + mEmergencyAffordanceNeeded = mVoiceCapable && (mSimNeedsEmergencyAffordance || + mNetworkNeedsEmergencyAffordance); + Settings.Global.putInt(mContext.getContentResolver(), + Settings.Global.EMERGENCY_AFFORDANCE_NEEDED, + mEmergencyAffordanceNeeded ? 1 : 0); + if (mEmergencyAffordanceNeeded) { + stopScanning(); + } + } + } + + private void stopScanning() { + synchronized (mLock) { + mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); + mScansCompleted = 0; + } + } + + private boolean isEmergencyAffordanceNeeded() { + synchronized (mLock) { + return mEmergencyAffordanceNeeded; + } + } + + @Override + public void onStart() { + } + + @Override + public void onBootPhase(int phase) { + if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) { + mTelephonyManager = mContext.getSystemService(TelephonyManager.class); + mVoiceCapable = mTelephonyManager.isVoiceCapable(); + if (!mVoiceCapable) { + updateEmergencyAffordanceNeeded(); + return; + } + mSubscriptionManager = SubscriptionManager.from(mContext); + HandlerThread thread = new HandlerThread(TAG); + thread.start(); + mHandler = new MyHandler(thread.getLooper()); + mHandler.obtainMessage(INITIALIZE_STATE).sendToTarget(); + startScanning(); + IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED); + mContext.registerReceiver(mAirplaneModeReceiver, filter); + mSubscriptionManager.addOnSubscriptionsChangedListener(mSubscriptionChangedListener); + } + } + + private void startScanning() { + mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CELL_INFO + | PhoneStateListener.LISTEN_CELL_LOCATION); + } + + /** Handler to do the heavier work on */ + private class MyHandler extends Handler { + + public MyHandler(Looper l) { + super(l); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case INITIALIZE_STATE: + handleInitializeState(); + break; + case CELL_INFO_STATE_CHANGED: + handleUpdateCellInfo(); + break; + case SUBSCRIPTION_CHANGED: + handleUpdateSimSubscriptionInfo(); + break; + } + } + } + + private void handleInitializeState() { + if (handleUpdateSimSubscriptionInfo()) { + return; + } + if (handleUpdateCellInfo()) { + return; + } + updateEmergencyAffordanceNeeded(); + } + + private boolean handleUpdateSimSubscriptionInfo() { + boolean neededBefore = simNeededAffordanceBefore(); + boolean neededNow = neededBefore; + List<SubscriptionInfo> activeSubscriptionInfoList = + mSubscriptionManager.getActiveSubscriptionInfoList(); + if (activeSubscriptionInfoList == null) { + return neededNow; + } + for (SubscriptionInfo info : activeSubscriptionInfoList) { + int mcc = info.getMcc(); + if (mccRequiresEmergencyAffordance(mcc)) { + neededNow = true; + break; + } else if (mcc != 0 && mcc != Integer.MAX_VALUE){ + // a Sim with a different mcc code was found + neededNow = false; + } + String simOperator = mTelephonyManager.getSimOperator(info.getSubscriptionId()); + mcc = 0; + if (simOperator != null && simOperator.length() >= 3) { + mcc = Integer.parseInt(simOperator.substring(0, 3)); + } + if (mcc != 0) { + if (mccRequiresEmergencyAffordance(mcc)) { + neededNow = true; + break; + } else { + // a Sim with a different mcc code was found + neededNow = false; + } + } + } + if (neededNow != neededBefore) { + setSimNeedsEmergencyAffordance(neededNow); + } + return neededNow; + } + + private void setSimNeedsEmergencyAffordance(boolean simNeedsEmergencyAffordance) { + mSimNeedsEmergencyAffordance = simNeedsEmergencyAffordance; + Settings.Global.putInt(mContext.getContentResolver(), + EMERGENCY_SIM_INSERTED_SETTING, + simNeedsEmergencyAffordance ? 1 : 0); + updateEmergencyAffordanceNeeded(); + } + + private boolean simNeededAffordanceBefore() { + return Settings.Global.getInt(mContext.getContentResolver(), + "emergency_sim_inserted_before", 0) != 0; + } + + private boolean handleUpdateCellInfo() { + List<CellInfo> cellInfos = mTelephonyManager.getAllCellInfo(); + if (cellInfos == null) { + return false; + } + boolean stopScanningAfterScan = false; + for (CellInfo cellInfo : cellInfos) { + int mcc = 0; + if (cellInfo instanceof CellInfoGsm) { + mcc = ((CellInfoGsm) cellInfo).getCellIdentity().getMcc(); + } else if (cellInfo instanceof CellInfoLte) { + mcc = ((CellInfoLte) cellInfo).getCellIdentity().getMcc(); + } else if (cellInfo instanceof CellInfoWcdma) { + mcc = ((CellInfoWcdma) cellInfo).getCellIdentity().getMcc(); + } + if (mccRequiresEmergencyAffordance(mcc)) { + setNetworkNeedsEmergencyAffordance(true); + return true; + } else if (mcc != 0 && mcc != Integer.MAX_VALUE) { + // we found an mcc that isn't in the list, abort + stopScanningAfterScan = true; + } + } + if (stopScanningAfterScan) { + stopScanning(); + } else { + onCellScanFinishedUnsuccessful(); + } + setNetworkNeedsEmergencyAffordance(false); + return false; + } + + private void setNetworkNeedsEmergencyAffordance(boolean needsAffordance) { + synchronized (mLock) { + mNetworkNeedsEmergencyAffordance = needsAffordance; + updateEmergencyAffordanceNeeded(); + } + } + + private void onCellScanFinishedUnsuccessful() { + synchronized (mLock) { + mScansCompleted++; + if (mScansCompleted >= NUM_SCANS_UNTIL_ABORT) { + stopScanning(); + } + } + } + + private boolean mccRequiresEmergencyAffordance(int mcc) { + return mEmergencyCallMccNumbers.contains(mcc); + } +} diff --git a/services/core/java/com/android/server/policy/GlobalActions.java b/services/core/java/com/android/server/policy/GlobalActions.java index 5ef518e21c58..6e2fb10d306c 100644 --- a/services/core/java/com/android/server/policy/GlobalActions.java +++ b/services/core/java/com/android/server/policy/GlobalActions.java @@ -20,6 +20,7 @@ import com.android.internal.app.AlertController; import com.android.internal.app.AlertController.AlertParams; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; +import com.android.internal.policy.EmergencyAffordanceManager; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyProperties; import com.android.internal.R; @@ -124,6 +125,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac private boolean mHasTelephony; private boolean mHasVibrator; private final boolean mShowSilentToggle; + private final EmergencyAffordanceManager mEmergencyAffordanceManager; /** * @param context everything needs a context :( @@ -158,6 +160,8 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac mShowSilentToggle = SHOW_SILENT_TOGGLE && !mContext.getResources().getBoolean( com.android.internal.R.bool.config_useFixedVolume); + + mEmergencyAffordanceManager = new EmergencyAffordanceManager(context); } /** @@ -305,6 +309,10 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac addedKeys.add(actionKey); } + if (mEmergencyAffordanceManager.needsEmergencyAffordance()) { + mItems.add(getEmergencyAction()); + } + mAdapter = new MyAdapter(); AlertParams params = new AlertParams(mContext); @@ -458,6 +466,26 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac }; } + private Action getEmergencyAction() { + return new SinglePressAction(com.android.internal.R.drawable.emergency_icon, + R.string.global_action_emergency) { + @Override + public void onPress() { + mEmergencyAffordanceManager.performEmergencyCall(); + } + + @Override + public boolean showDuringKeyguard() { + return true; + } + + @Override + public boolean showBeforeProvisioning() { + return true; + } + }; + } + private Action getAssistAction() { return new SinglePressAction(com.android.internal.R.drawable.ic_action_assist_focused, R.string.global_action_assist) { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index f59b2ff16482..b1836443190c 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -52,6 +52,7 @@ import com.android.internal.R; import com.android.internal.os.BinderInternal; import com.android.internal.os.SamplingProfilerIntegration; import com.android.internal.os.ZygoteInit; +import com.android.internal.policy.EmergencyAffordanceManager; import com.android.internal.widget.ILockSettings; import com.android.server.accessibility.AccessibilityManagerService; import com.android.server.am.ActivityManagerService; @@ -62,6 +63,7 @@ import com.android.server.connectivity.MetricsLoggerService; import com.android.server.devicepolicy.DevicePolicyManagerService; import com.android.server.display.DisplayManagerService; import com.android.server.dreams.DreamManagerService; +import com.android.server.emergency.EmergencyAffordanceService; import com.android.server.fingerprint.FingerprintService; import com.android.server.hdmi.HdmiControlService; import com.android.server.input.InputManagerService; @@ -1077,6 +1079,11 @@ public final class SystemServer { Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } + if (!disableNetwork && !disableNonCoreServices && EmergencyAffordanceManager.ENABLED) { + // EmergencyMode sevice + mSystemServiceManager.startService(EmergencyAffordanceService.class); + } + if (!disableNonCoreServices) { // Dreams (interactive idle-time views, a/k/a screen savers, and doze mode) mSystemServiceManager.startService(DreamManagerService.class); diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java index 96c852bf55f5..97677ffb65ed 100644 --- a/services/net/java/android/net/dhcp/DhcpClient.java +++ b/services/net/java/android/net/dhcp/DhcpClient.java @@ -39,6 +39,7 @@ import android.os.SystemClock; import android.system.ErrnoException; import android.system.Os; import android.system.PacketSocketAddress; +import android.util.EventLog; import android.util.Log; import android.util.SparseArray; import android.util.TimeUtils; @@ -364,6 +365,14 @@ public class DhcpClient extends StateMachine { Log.d(TAG, HexDump.dumpHexString(mPacket, 0, length)); } DhcpErrorEvent.logParseError(mIfaceName, e.errorCode); + } catch (Exception e) { + // SafetyNet logging for b/31850211 + int snetTagId = 0x534e4554; + String bugId = "31850211"; + int uid = -1; + String data = e.getClass().getName(); + EventLog.writeEvent(snetTagId, bugId, uid, data); + Log.e(TAG, "Failed to parse DHCP packet", e); } } if (DBG) Log.d(TAG, "Receive thread stopped"); |