diff options
113 files changed, 1688 insertions, 673 deletions
diff --git a/api/current.txt b/api/current.txt index 34187618c5de..c1caaf2f157c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6061,8 +6061,6 @@ package android.content { field public static final java.lang.String ACTION_GTALK_SERVICE_CONNECTED = "android.intent.action.GTALK_CONNECTED"; field public static final java.lang.String ACTION_GTALK_SERVICE_DISCONNECTED = "android.intent.action.GTALK_DISCONNECTED"; field public static final java.lang.String ACTION_HEADSET_PLUG = "android.intent.action.HEADSET_PLUG"; - field public static final java.lang.String ACTION_IDLE_MAINTENANCE_END = "android.intent.action.ACTION_IDLE_MAINTENANCE_END"; - field public static final java.lang.String ACTION_IDLE_MAINTENANCE_START = "android.intent.action.ACTION_IDLE_MAINTENANCE_START"; field public static final java.lang.String ACTION_INPUT_METHOD_CHANGED = "android.intent.action.INPUT_METHOD_CHANGED"; field public static final java.lang.String ACTION_INSERT = "android.intent.action.INSERT"; field public static final java.lang.String ACTION_INSERT_OR_EDIT = "android.intent.action.INSERT_OR_EDIT"; @@ -11497,6 +11495,10 @@ package android.media { field public static final int QUALITY_MEDIUM = 1; // 0x1 } + public final class DeniedByServerException extends android.media.MediaDrmException { + ctor public DeniedByServerException(java.lang.String); + } + public class ExifInterface { ctor public ExifInterface(java.lang.String) throws java.io.IOException; method public double getAltitude(double); @@ -11818,18 +11820,18 @@ package android.media { } public final class MediaDrm { - ctor public MediaDrm(java.util.UUID) throws android.media.MediaDrmException; + ctor public MediaDrm(java.util.UUID) throws android.media.UnsupportedSchemeException; method public void closeSession(byte[]); method public android.media.MediaDrm.CryptoSession getCryptoSession(byte[], java.lang.String, java.lang.String); - method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>); + method public android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.HashMap<java.lang.String, java.lang.String>) throws android.media.NotProvisionedException; method public byte[] getPropertyByteArray(java.lang.String); method public java.lang.String getPropertyString(java.lang.String); method public android.media.MediaDrm.ProvisionRequest getProvisionRequest(); method public java.util.List<byte[]> getSecureStops(); method public static final boolean isCryptoSchemeSupported(java.util.UUID); - method public byte[] openSession(); - method public byte[] provideKeyResponse(byte[], byte[]); - method public void provideProvisionResponse(byte[]); + method public byte[] openSession() throws android.media.NotProvisionedException; + method public byte[] provideKeyResponse(byte[], byte[]) throws android.media.DeniedByServerException, android.media.NotProvisionedException; + method public void provideProvisionResponse(byte[]) throws android.media.DeniedByServerException; method public java.util.HashMap<java.lang.String, java.lang.String> queryKeyStatus(byte[]); method public final void release(); method public void releaseSecureStops(byte[]); @@ -11873,7 +11875,7 @@ package android.media { method public java.lang.String getDefaultUrl(); } - public final class MediaDrmException extends java.lang.Exception { + public class MediaDrmException extends java.lang.Exception { ctor public MediaDrmException(java.lang.String); } @@ -12339,6 +12341,10 @@ package android.media { field public static final int SYNC_EVENT_PRESENTATION_COMPLETE = 1; // 0x1 } + public final class NotProvisionedException extends android.media.MediaDrmException { + ctor public NotProvisionedException(java.lang.String); + } + public class RemoteControlClient { ctor public RemoteControlClient(android.app.PendingIntent); ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper); @@ -12581,6 +12587,10 @@ package android.media { field public static final int TONE_SUP_RINGTONE = 23; // 0x17 } + public final class UnsupportedSchemeException extends android.media.MediaDrmException { + ctor public UnsupportedSchemeException(java.lang.String); + } + } package android.media.audiofx { @@ -14550,7 +14560,6 @@ package android.opengl { method public static int eglGetError(); method public static boolean eglInitialize(android.opengl.EGLDisplay, int[], int, int[], int); method public static boolean eglMakeCurrent(android.opengl.EGLDisplay, android.opengl.EGLSurface, android.opengl.EGLSurface, android.opengl.EGLContext); - method public static boolean eglPresentationTimeANDROID(android.opengl.EGLDisplay, android.opengl.EGLSurface, long); method public static int eglQueryAPI(); method public static boolean eglQueryContext(android.opengl.EGLDisplay, android.opengl.EGLContext, int, int[], int); method public static java.lang.String eglQueryString(android.opengl.EGLDisplay, int); @@ -14689,6 +14698,15 @@ package android.opengl { public class EGLDisplay extends android.opengl.EGLObjectHandle { } + public class EGLExt { + ctor public EGLExt(); + method public static boolean eglPresentationTimeANDROID(android.opengl.EGLDisplay, android.opengl.EGLSurface, long); + field public static final int EGL_CONTEXT_FLAGS_KHR = 12540; // 0x30fc + field public static final int EGL_CONTEXT_MAJOR_VERSION_KHR = 12440; // 0x3098 + field public static final int EGL_CONTEXT_MINOR_VERSION_KHR = 12539; // 0x30fb + field public static final int EGL_OPENGL_ES3_BIT_KHR = 64; // 0x40 + } + public abstract class EGLObjectHandle { ctor protected EGLObjectHandle(int); method public int getHandle(); diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index ccb9e1fd09b2..61fe34028a51 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -31,6 +31,7 @@ import android.content.Intent; import android.content.pm.IPackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; +import android.os.Binder; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.RemoteException; @@ -94,6 +95,7 @@ public class Am extends BaseCommand { " am set-debug-app [-w] [--persistent] <PACKAGE>\n" + " am clear-debug-app\n" + " am monitor [--gdb <port>]\n" + + " am hang [--allow-restart]\n" + " am screen-compat [on|off] <PACKAGE>\n" + " am to-uri [INTENT]\n" + " am to-intent-uri [INTENT]\n" + @@ -169,6 +171,9 @@ public class Am extends BaseCommand { "am monitor: start monitoring for crashes or ANRs.\n" + " --gdb: start gdbserv on the given port at crash/ANR\n" + "\n" + + "am hang: hang the system.\n" + + " --allow-restart: allow watchdog to perform normal system restart\n" + + "\n" + "am screen-compat: control screen compatibility mode of <PACKAGE>.\n" + "\n" + "am to-uri: print the given Intent specification as a URI.\n" + @@ -249,6 +254,8 @@ public class Am extends BaseCommand { runBugReport(); } else if (op.equals("monitor")) { runMonitor(); + } else if (op.equals("hang")) { + runHang(); } else if (op.equals("screen-compat")) { runScreenCompat(); } else if (op.equals("to-uri")) { @@ -1093,6 +1100,18 @@ public class Am extends BaseCommand { } } + @Override + public int systemNotResponding(String message) + throws RemoteException { + synchronized (this) { + System.out.println("** ERROR: PROCESS NOT RESPONDING"); + System.out.println("message: " + message); + System.out.println("#"); + System.out.println("Allowing system to die."); + return -1; + } + } + void killGdbLocked() { mGotGdbPrint = false; if (mGdbProcess != null) { @@ -1292,6 +1311,22 @@ public class Am extends BaseCommand { controller.run(); } + private void runHang() throws Exception { + String opt; + boolean allowRestart = false; + while ((opt=nextOption()) != null) { + if (opt.equals("--allow-restart")) { + allowRestart = true; + } else { + System.err.println("Error: Unknown option: " + opt); + return; + } + } + + System.out.println("Hanging the system..."); + mAm.hang(new Binder(), allowRestart); + } + private void runScreenCompat() throws Exception { String mode = nextArgRequired(); boolean enabled; diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 98baa0ebb631..d4478bf046d6 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1870,6 +1870,15 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case HANG_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + IBinder who = data.readStrongBinder(); + boolean allowRestart = data.readInt() != 0; + hang(who, allowRestart); + reply.writeNoException(); + return true; + } + } return super.onTransact(code, data, reply, flags); @@ -4270,5 +4279,17 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } + public void hang(IBinder who, boolean allowRestart) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(who); + data.writeInt(allowRestart ? 1 : 0); + mRemote.transact(HANG_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } + private IBinder mRemote; } diff --git a/core/java/android/app/IActivityController.aidl b/core/java/android/app/IActivityController.aidl index aca8305c8245..952c900d02b4 100644 --- a/core/java/android/app/IActivityController.aidl +++ b/core/java/android/app/IActivityController.aidl @@ -58,4 +58,11 @@ interface IActivityController * immediately. */ int appNotResponding(String processName, int pid, String processStats); + + /** + * The system process watchdog has detected that the system seems to be + * hung. Return 1 to continue waiting, or -1 to let it continue with its + * normal kill. + */ + int systemNotResponding(String msg); } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 33a27709b039..a21caee7f092 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -377,6 +377,8 @@ public interface IActivityManager extends IInterface { public void killUid(int uid, String reason) throws RemoteException; + public void hang(IBinder who, boolean allowRestart) throws RemoteException; + /* * Private non-Binder interfaces */ @@ -638,4 +640,5 @@ public interface IActivityManager extends IInterface { int GET_LAUNCHED_FROM_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+163; int KILL_UID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+164; int SET_USER_IS_MONKEY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+165; + int HANG_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+166; } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 67bd952c3534..bfc7bf5dff85 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2356,6 +2356,8 @@ public class Intent implements Parcelable, Cloneable { * </p> * * @see #ACTION_IDLE_MAINTENANCE_END + * + * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_IDLE_MAINTENANCE_START = @@ -2383,6 +2385,8 @@ public class Intent implements Parcelable, Cloneable { * by the system. * * @see #ACTION_IDLE_MAINTENANCE_START + * + * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public static final String ACTION_IDLE_MAINTENANCE_END = diff --git a/core/java/android/content/RestrictionEntry.java b/core/java/android/content/RestrictionEntry.java index 217cf763b9a1..283a09776ce8 100644 --- a/core/java/android/content/RestrictionEntry.java +++ b/core/java/android/content/RestrictionEntry.java @@ -109,6 +109,7 @@ public class RestrictionEntry implements Parcelable { */ public RestrictionEntry(String key, String selectedString) { this.key = key; + this.type = TYPE_CHOICE; this.currentValue = selectedString; } @@ -119,6 +120,7 @@ public class RestrictionEntry implements Parcelable { */ public RestrictionEntry(String key, boolean selectedState) { this.key = key; + this.type = TYPE_BOOLEAN; setSelectedState(selectedState); } @@ -129,6 +131,7 @@ public class RestrictionEntry implements Parcelable { */ public RestrictionEntry(String key, String[] selectedStrings) { this.key = key; + this.type = TYPE_MULTI_SELECT; this.currentValues = selectedStrings; } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index acb3725b6cf2..34e0c124bb96 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -287,7 +287,10 @@ public class PackageParser { pi.sharedUserLabel = p.mSharedUserLabel; pi.applicationInfo = generateApplicationInfo(p, flags, state, userId); pi.installLocation = p.installLocation; - pi.requiredForAllUsers = p.mRequiredForAllUsers; + if ((pi.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0 + || (pi.applicationInfo.flags&ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { + pi.requiredForAllUsers = p.mRequiredForAllUsers; + } pi.restrictedAccountType = p.mRestrictedAccountType; pi.requiredAccountType = p.mRequiredAccountType; pi.firstInstallTime = firstInstallTime; @@ -1812,11 +1815,12 @@ public class PackageParser { false)) { ai.flags |= ApplicationInfo.FLAG_PERSISTENT; } - if (sa.getBoolean( - com.android.internal.R.styleable.AndroidManifestApplication_requiredForAllUsers, - false)) { - owner.mRequiredForAllUsers = true; - } + } + + if (sa.getBoolean( + com.android.internal.R.styleable.AndroidManifestApplication_requiredForAllUsers, + false)) { + owner.mRequiredForAllUsers = true; } String restrictedAccountType = sa.getString(com.android.internal.R.styleable diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java index 0017c46a7a16..4f59e8e7ceec 100644 --- a/core/java/android/database/sqlite/SQLiteConnection.java +++ b/core/java/android/database/sqlite/SQLiteConnection.java @@ -1077,7 +1077,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen printer.println(" isPrimaryConnection: " + mIsPrimaryConnection); printer.println(" onlyAllowReadOnlyOperations: " + mOnlyAllowReadOnlyOperations); - mRecentOperations.dump(printer); + mRecentOperations.dump(printer, verbose); if (verbose) { mPreparedStatementCache.dump(printer); @@ -1376,7 +1376,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen private void logOperationLocked(int cookie, String detail) { final Operation operation = getOperationLocked(cookie); StringBuilder msg = new StringBuilder(); - operation.describe(msg); + operation.describe(msg, false); if (detail != null) { msg.append(", ").append(detail); } @@ -1399,14 +1399,14 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen final Operation operation = mOperations[mIndex]; if (operation != null && !operation.mFinished) { StringBuilder msg = new StringBuilder(); - operation.describe(msg); + operation.describe(msg, false); return msg.toString(); } return null; } } - public void dump(Printer printer) { + public void dump(Printer printer, boolean verbose) { synchronized (mOperations) { printer.println(" Most recently executed operations:"); int index = mIndex; @@ -1418,7 +1418,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen msg.append(" ").append(n).append(": ["); msg.append(operation.getFormattedStartTime()); msg.append("] "); - operation.describe(msg); + operation.describe(msg, verbose); printer.println(msg.toString()); if (index > 0) { @@ -1449,7 +1449,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen public Exception mException; public int mCookie; - public void describe(StringBuilder msg) { + public void describe(StringBuilder msg, boolean verbose) { msg.append(mKind); if (mFinished) { msg.append(" took ").append(mEndTime - mStartTime).append("ms"); @@ -1461,7 +1461,7 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen if (mSql != null) { msg.append(", sql=\"").append(trimSqlForDisplay(mSql)).append("\""); } - if (mBindArgs != null && mBindArgs.size() != 0) { + if (verbose && mBindArgs != null && mBindArgs.size() != 0) { msg.append(", bindArgs=["); final int count = mBindArgs.size(); for (int i = 0; i < count; i++) { diff --git a/core/java/android/net/nsd/NsdManager.java b/core/java/android/net/nsd/NsdManager.java index 08ba728f65a4..9c3e405f44b7 100644 --- a/core/java/android/net/nsd/NsdManager.java +++ b/core/java/android/net/nsd/NsdManager.java @@ -306,10 +306,9 @@ public final class NsdManager { switch (message.what) { case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION); - mConnected.countDown(); break; case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED: - // Ignore + mConnected.countDown(); break; case AsyncChannel.CMD_CHANNEL_DISCONNECTED: Log.e(TAG, "Channel lost"); diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index e9e755141b18..7ffd30b0c3b1 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -49,6 +49,11 @@ public class Binder implements IBinder { private static final boolean FIND_POTENTIAL_LEAKS = false; private static final String TAG = "Binder"; + /** + * Control whether dump() calls are allowed. + */ + private static String sDumpDisabled = null; + /* mObject is used by native code, do not remove or rename */ private int mObject; private IInterface mOwner; @@ -224,7 +229,23 @@ public class Binder implements IBinder { } return null; } - + + /** + * Control disabling of dump calls in this process. This is used by the system + * process watchdog to disable incoming dump calls while it has detecting the system + * is hung and is reporting that back to the activity controller. This is to + * prevent the controller from getting hung up on bug reports at this point. + * @hide + * + * @param msg The message to show instead of the dump; if null, dumps are + * re-enabled. + */ + public static void setDumpDisabled(String msg) { + synchronized (Binder.class) { + sDumpDisabled = msg; + } + } + /** * Default implementation is a stub that returns false. You will want * to override this to do the appropriate unmarshalling of transactions. @@ -269,7 +290,15 @@ public class Binder implements IBinder { FileOutputStream fout = new FileOutputStream(fd); PrintWriter pw = new PrintWriter(fout); try { - dump(fd, pw, args); + final String disabled; + synchronized (Binder.class) { + disabled = sDumpDisabled; + } + if (disabled == null) { + dump(fd, pw, args); + } else { + pw.println(sDumpDisabled); + } } finally { pw.flush(); } diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 4989c3a318e9..ae4005bfeea7 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -34,19 +34,21 @@ public class Surface implements Parcelable { private static native int nativeCreateFromSurfaceTexture(SurfaceTexture surfaceTexture) throws OutOfResourcesException; + private static native int nativeCreateFromSurfaceControl(int surfaceControlNativeObject); - private native Canvas nativeLockCanvas(int nativeObject, Rect dirty); - private native void nativeUnlockCanvasAndPost(int nativeObject, Canvas canvas); + private static native void nativeLockCanvas(int nativeObject, Canvas canvas, Rect dirty) + throws OutOfResourcesException; + private static native void nativeUnlockCanvasAndPost(int nativeObject, Canvas canvas); private static native void nativeRelease(int nativeObject); private static native boolean nativeIsValid(int nativeObject); private static native boolean nativeIsConsumerRunningBehind(int nativeObject); - private static native int nativeCopyFrom(int nativeObject, int surfaceControlNativeObject); private static native int nativeReadFromParcel(int nativeObject, Parcel source); private static native void nativeWriteToParcel(int nativeObject, Parcel dest); public static final Parcelable.Creator<Surface> CREATOR = new Parcelable.Creator<Surface>() { + @Override public Surface createFromParcel(Parcel source) { try { Surface s = new Surface(); @@ -57,26 +59,20 @@ public class Surface implements Parcelable { return null; } } + + @Override public Surface[] newArray(int size) { return new Surface[size]; } }; private final CloseGuard mCloseGuard = CloseGuard.get(); - private String mName; - - // Note: These fields are accessed by native code. - // The mSurfaceControl will only be present for Surfaces used by the window - // server or system processes. When this class is parceled we defer to the - // mSurfaceControl to do the parceling. Otherwise we parcel the - // mNativeSurface. - int mNativeObject; // package scope only for SurfaceControl access - - // protects the native state - private final Object mNativeObjectLock = new Object(); + // Guarded state. + final Object mLock = new Object(); // protects the native state + private String mName; + int mNativeSurface; // package scope only for SurfaceControl access private int mGenerationId; // incremented each time mNativeSurface changes - @SuppressWarnings("UnusedDeclaration") private final Canvas mCanvas = new CompatibleCanvas(); // A matrix to scale the matrix set by application. This is set to null for @@ -125,21 +121,22 @@ public class Surface implements Parcelable { throw new IllegalArgumentException("surfaceTexture must not be null"); } - mName = surfaceTexture.toString(); - try { - mNativeObject = nativeCreateFromSurfaceTexture(surfaceTexture); - } catch (OutOfResourcesException ex) { - // We can't throw OutOfResourcesException because it would be an API change. - throw new RuntimeException(ex); + synchronized (mLock) { + mName = surfaceTexture.toString(); + try { + setNativeObjectLocked(nativeCreateFromSurfaceTexture(surfaceTexture)); + } catch (OutOfResourcesException ex) { + // We can't throw OutOfResourcesException because it would be an API change. + throw new RuntimeException(ex); + } } - - mCloseGuard.open("release"); } /* called from android_view_Surface_createFromIGraphicBufferProducer() */ private Surface(int nativeObject) { - mNativeObject = nativeObject; - mCloseGuard.open("release"); + synchronized (mLock) { + setNativeObjectLocked(nativeObject); + } } @Override @@ -160,13 +157,11 @@ public class Surface implements Parcelable { * This will make the surface invalid. */ public void release() { - synchronized (mNativeObjectLock) { - if (mNativeObject != 0) { - nativeRelease(mNativeObject); - mNativeObject = 0; - mGenerationId++; + synchronized (mLock) { + if (mNativeSurface != 0) { + nativeRelease(mNativeSurface); + setNativeObjectLocked(0); } - mCloseGuard.close(); } } @@ -187,9 +182,9 @@ public class Surface implements Parcelable { * Otherwise returns false. */ public boolean isValid() { - synchronized (mNativeObjectLock) { - if (mNativeObject == 0) return false; - return nativeIsValid(mNativeObject); + synchronized (mLock) { + if (mNativeSurface == 0) return false; + return nativeIsValid(mNativeSurface); } } @@ -201,7 +196,9 @@ public class Surface implements Parcelable { * @hide */ public int getGenerationId() { - return mGenerationId; + synchronized (mLock) { + return mGenerationId; + } } /** @@ -211,9 +208,9 @@ public class Surface implements Parcelable { * @hide */ public boolean isConsumerRunningBehind() { - synchronized (mNativeObjectLock) { + synchronized (mLock) { checkNotReleasedLocked(); - return nativeIsConsumerRunningBehind(mNativeObject); + return nativeIsConsumerRunningBehind(mNativeSurface); } } @@ -234,9 +231,10 @@ public class Surface implements Parcelable { */ public Canvas lockCanvas(Rect inOutDirty) throws OutOfResourcesException, IllegalArgumentException { - synchronized (mNativeObjectLock) { + synchronized (mLock) { checkNotReleasedLocked(); - return nativeLockCanvas(mNativeObject, inOutDirty); + nativeLockCanvas(mNativeSurface, mCanvas, inOutDirty); + return mCanvas; } } @@ -247,9 +245,14 @@ public class Surface implements Parcelable { * @param canvas The canvas previously obtained from {@link #lockCanvas}. */ public void unlockCanvasAndPost(Canvas canvas) { - synchronized (mNativeObjectLock) { + if (canvas != mCanvas) { + throw new IllegalArgumentException("canvas object must be the same instance that " + + "was previously returned by lockCanvas"); + } + + synchronized (mLock) { checkNotReleasedLocked(); - nativeUnlockCanvasAndPost(mNativeObject, canvas); + nativeUnlockCanvasAndPost(mNativeSurface, canvas); } } @@ -273,7 +276,6 @@ public class Surface implements Parcelable { } } - /** * Copy another surface to this one. This surface now holds a reference * to the same data as the original surface, and is -not- the owner. @@ -287,22 +289,24 @@ public class Surface implements Parcelable { if (other == null) { throw new IllegalArgumentException("other must not be null"); } - if (other.mNativeObject == 0) { + + int surfaceControlPtr = other.mNativeObject; + if (surfaceControlPtr == 0) { throw new NullPointerException( "SurfaceControl native object is null. Are you using a released SurfaceControl?"); } - synchronized (mNativeObjectLock) { - mNativeObject = nativeCopyFrom(mNativeObject, other.mNativeObject); - if (mNativeObject == 0) { - // nativeCopyFrom released our reference - mCloseGuard.close(); + int newNativeObject = nativeCreateFromSurfaceControl(surfaceControlPtr); + + synchronized (mLock) { + if (mNativeSurface != 0) { + nativeRelease(mNativeSurface); } - mGenerationId++; + setNativeObjectLocked(newNativeObject); } } /** - * This is intended to be used by {@link SurfaceView.updateWindow} only. + * This is intended to be used by {@link SurfaceView#updateWindow} only. * @param other access is not thread safe * @hide * @deprecated @@ -313,21 +317,18 @@ public class Surface implements Parcelable { throw new IllegalArgumentException("other must not be null"); } if (other != this) { - synchronized (mNativeObjectLock) { - if (mNativeObject != 0) { - // release our reference to our native object - nativeRelease(mNativeObject); - } - // transfer the reference from other to us - if (other.mNativeObject != 0 && mNativeObject == 0) { - mCloseGuard.open("release"); + final int newPtr; + synchronized (other.mLock) { + newPtr = other.mNativeSurface; + other.setNativeObjectLocked(0); + } + + synchronized (mLock) { + if (mNativeSurface != 0) { + nativeRelease(mNativeSurface); } - mNativeObject = other.mNativeObject; - mGenerationId++; + setNativeObjectLocked(newPtr); } - other.mNativeObject = 0; - other.mGenerationId++; - other.mCloseGuard.close(); } } @@ -340,14 +341,10 @@ public class Surface implements Parcelable { if (source == null) { throw new IllegalArgumentException("source must not be null"); } - synchronized (mNativeObjectLock) { + + synchronized (mLock) { mName = source.readString(); - int nativeObject = nativeReadFromParcel(mNativeObject, source); - if (nativeObject !=0 && mNativeObject == 0) { - mCloseGuard.open("release"); - } - mNativeObject = nativeObject; - mGenerationId++; + setNativeObjectLocked(nativeReadFromParcel(mNativeSurface, source)); } } @@ -356,9 +353,9 @@ public class Surface implements Parcelable { if (dest == null) { throw new IllegalArgumentException("dest must not be null"); } - synchronized (mNativeObjectLock) { + synchronized (mLock) { dest.writeString(mName); - nativeWriteToParcel(mNativeObject, dest); + nativeWriteToParcel(mNativeSurface, dest); } if ((flags & Parcelable.PARCELABLE_WRITE_RETURN_VALUE) != 0) { release(); @@ -367,7 +364,27 @@ public class Surface implements Parcelable { @Override public String toString() { - return "Surface(name=" + mName + ")"; + synchronized (mLock) { + return "Surface(name=" + mName + ")"; + } + } + + private void setNativeObjectLocked(int ptr) { + if (mNativeSurface != ptr) { + if (mNativeSurface == 0 && ptr != 0) { + mCloseGuard.open("release"); + } else if (mNativeSurface != 0 && ptr == 0) { + mCloseGuard.close(); + } + mNativeSurface = ptr; + mGenerationId += 1; + } + } + + private void checkNotReleasedLocked() { + if (mNativeSurface == 0) { + throw new IllegalStateException("Surface has already been released."); + } } /** @@ -451,9 +468,4 @@ public class Surface implements Parcelable { mOrigMatrix.set(m); } } - - private void checkNotReleasedLocked() { - if (mNativeObject == 0) throw new NullPointerException( - "mNativeObject is null. Have you called release() already?"); - } } diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index e869d09adaa7..c6da84fffd39 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -496,8 +496,14 @@ public class SurfaceControl { if (displayToken == null) { throw new IllegalArgumentException("displayToken must not be null"); } - int nativeSurface = surface != null ? surface.mNativeObject : 0; - nativeSetDisplaySurface(displayToken, nativeSurface); + + if (surface != null) { + synchronized (surface.mLock) { + nativeSetDisplaySurface(displayToken, surface.mNativeSurface); + } + } else { + nativeSetDisplaySurface(displayToken, 0); + } } public static IBinder createDisplay(String name, boolean secure) { diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index 230f426626a0..5c3934d82077 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -260,7 +260,7 @@ public class TextureView extends View { @Override public void setLayerType(int layerType, Paint paint) { if (paint != mLayerPaint) { - mLayerPaint = paint; + mLayerPaint = paint == null ? new Paint() : paint; invalidate(); } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 0938bb3e88d2..c47e111ad44f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -11749,10 +11749,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * Resolve all RTL related properties. * + * @return true if resolution of RTL properties has been done + * * @hide */ - public void resolveRtlPropertiesIfNeeded() { - if (!needRtlPropertiesResolution()) return; + public boolean resolveRtlPropertiesIfNeeded() { + if (!needRtlPropertiesResolution()) return false; // Order is important here: LayoutDirection MUST be resolved first if (!isLayoutDirectionResolved()) { @@ -11773,6 +11775,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, resolveDrawables(); } onRtlPropertiesChanged(getLayoutDirection()); + return true; } /** @@ -11825,6 +11828,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * @return true if RTL properties need resolution. + * */ private boolean needRtlPropertiesResolution() { return (mPrivateFlags2 & ALL_RTL_PROPERTIES_RESOLVED) != ALL_RTL_PROPERTIES_RESOLVED; diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index c7ce99955e5d..58c30e9d5f6e 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -5453,15 +5453,19 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * @hide */ @Override - public void resolveRtlPropertiesIfNeeded() { - super.resolveRtlPropertiesIfNeeded(); - int count = getChildCount(); - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - if (child.isLayoutDirectionInherited()) { - child.resolveRtlPropertiesIfNeeded(); + public boolean resolveRtlPropertiesIfNeeded() { + final boolean result = super.resolveRtlPropertiesIfNeeded(); + // We dont need to resolve the children RTL properties if nothing has changed for the parent + if (result) { + int count = getChildCount(); + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child.isLayoutDirectionInherited()) { + child.resolveRtlPropertiesIfNeeded(); + } } } + return result; } /** diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java index 655d148548ba..4e213247e503 100644 --- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java +++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java @@ -20,6 +20,7 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; @@ -28,6 +29,8 @@ import android.util.Pair; import android.util.Slog; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodSubtype; +import android.view.textservice.SpellCheckerInfo; +import android.view.textservice.TextServicesManager; import java.util.ArrayList; import java.util.HashMap; @@ -357,6 +360,78 @@ public class InputMethodUtils { return !subtype.isAuxiliary(); } + public static void setNonSelectedSystemImesDisabledUntilUsed( + PackageManager packageManager, List<InputMethodInfo> enabledImis) { + if (DEBUG) { + Slog.d(TAG, "setNonSelectedSystemImesDisabledUntilUsed"); + } + final String[] systemImesDisabledUntilUsed = Resources.getSystem().getStringArray( + com.android.internal.R.array.config_disabledUntilUsedPreinstalledImes); + if (systemImesDisabledUntilUsed == null || systemImesDisabledUntilUsed.length == 0) { + return; + } + // Only the current spell checker should be treated as an enabled one. + final SpellCheckerInfo currentSpellChecker = + TextServicesManager.getInstance().getCurrentSpellChecker(); + for (final String packageName : systemImesDisabledUntilUsed) { + if (DEBUG) { + Slog.d(TAG, "check " + packageName); + } + boolean enabledIme = false; + for (int j = 0; j < enabledImis.size(); ++j) { + final InputMethodInfo imi = enabledImis.get(j); + if (packageName.equals(imi.getPackageName())) { + enabledIme = true; + break; + } + } + if (enabledIme) { + // enabled ime. skip + continue; + } + if (currentSpellChecker != null + && packageName.equals(currentSpellChecker.getPackageName())) { + // enabled spell checker. skip + if (DEBUG) { + Slog.d(TAG, packageName + " is the current spell checker. skip"); + } + continue; + } + ApplicationInfo ai = null; + try { + ai = packageManager.getApplicationInfo(packageName, + PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS); + } catch (NameNotFoundException e) { + Slog.w(TAG, "NameNotFoundException: " + packageName, e); + } + if (ai == null) { + // No app found for packageName + continue; + } + final boolean isSystemPackage = (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + if (!isSystemPackage) { + continue; + } + setDisabledUntilUsed(packageManager, packageName); + } + } + + private static void setDisabledUntilUsed(PackageManager packageManager, String packageName) { + final int state = packageManager.getApplicationEnabledSetting(packageName); + if (state == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT + || state == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { + if (DEBUG) { + Slog.d(TAG, "Update state(" + packageName + "): DISABLED_UNTIL_USED"); + } + packageManager.setApplicationEnabledSetting(packageName, + PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, 0); + } else { + if (DEBUG) { + Slog.d(TAG, packageName + " is already DISABLED_UNTIL_USED"); + } + } + } + /** * Utility class for putting and getting settings for InputMethod * TODO: Move all putters and getters of settings to this class. @@ -405,8 +480,7 @@ public class InputMethodUtils { public void setCurrentUserId(int userId) { if (DEBUG) { - Slog.d(TAG, "--- Swtich the current user from " + mCurrentUserId + " to " - + userId + ", new ime = " + getSelectedInputMethod()); + Slog.d(TAG, "--- Swtich the current user from " + mCurrentUserId + " to " + userId); } // IMMS settings are kept per user, so keep track of current user mCurrentUserId = userId; diff --git a/core/java/com/android/internal/view/menu/MenuItemImpl.java b/core/java/com/android/internal/view/menu/MenuItemImpl.java index 7189610be9ab..39078ca2746d 100644 --- a/core/java/com/android/internal/view/menu/MenuItemImpl.java +++ b/core/java/com/android/internal/view/menu/MenuItemImpl.java @@ -598,11 +598,13 @@ public final class MenuItemImpl implements MenuItem { mActionView = null; mActionProvider = actionProvider; mMenu.onItemsChanged(true); // Measurement can be changed - mActionProvider.setVisibilityListener(new ActionProvider.VisibilityListener() { - @Override public void onActionProviderVisibilityChanged(boolean isVisible) { - mMenu.onItemVisibleChanged(MenuItemImpl.this); - } - }); + if (mActionProvider != null) { + mActionProvider.setVisibilityListener(new ActionProvider.VisibilityListener() { + @Override public void onActionProviderVisibilityChanged(boolean isVisible) { + mMenu.onItemVisibleChanged(MenuItemImpl.this); + } + }); + } return this; } diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index d69bc31e15d9..dda1a105d76c 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -86,7 +86,7 @@ public class ActionBarView extends AbsActionBarView { ActionBar.DISPLAY_TITLE_MULTIPLE_LINES; private static final int DEFAULT_CUSTOM_GRAVITY = Gravity.START | Gravity.CENTER_VERTICAL; - + private int mNavigationMode; private int mDisplayOptions = -1; private CharSequence mTitle; @@ -113,7 +113,7 @@ public class ActionBarView extends AbsActionBarView { private int mProgressBarPadding; private int mItemPadding; - + private int mTitleStyleRes; private int mSubtitleStyleRes; private int mProgressStyle; @@ -127,7 +127,7 @@ public class ActionBarView extends AbsActionBarView { private MenuBuilder mOptionsMenu; private boolean mMenuPrepared; - + private ActionBarContextView mContextView; private ActionMenuItem mLogoNavItem; @@ -188,7 +188,7 @@ public class ActionBarView extends AbsActionBarView { ActionBar.NAVIGATION_MODE_STANDARD); mTitle = a.getText(R.styleable.ActionBar_title); mSubtitle = a.getText(R.styleable.ActionBar_subtitle); - + mLogo = a.getDrawable(R.styleable.ActionBar_logo); if (mLogo == null) { if (context instanceof Activity) { @@ -232,7 +232,7 @@ public class ActionBarView extends AbsActionBarView { mExpandedHomeLayout.setOnClickListener(mExpandedActionViewUpListener); mExpandedHomeLayout.setContentDescription(getResources().getText( R.string.action_bar_up_description)); - + // This needs to highlight/be focusable on its own. // TODO: Clean up the handoff between expanded/normal. final Drawable upBackground = mUpGoerFive.getBackground(); @@ -261,9 +261,9 @@ public class ActionBarView extends AbsActionBarView { } mContentHeight = a.getLayoutDimension(R.styleable.ActionBar_height, 0); - + a.recycle(); - + mLogoNavItem = new ActionMenuItem(context, 0, android.R.id.home, 0, 0, mTitle); mUpGoerFive.setOnClickListener(mUpClickListener); @@ -553,6 +553,7 @@ public class ActionBarView extends AbsActionBarView { if (mLogoNavItem != null) { mLogoNavItem.setTitle(title); } + mUpGoerFive.setContentDescription(buildHomeContentDescription()); } public CharSequence getSubtitle() { @@ -569,6 +570,7 @@ public class ActionBarView extends AbsActionBarView { (!TextUtils.isEmpty(mTitle) || !TextUtils.isEmpty(mSubtitle)); mTitleLayout.setVisibility(visible ? VISIBLE : GONE); } + mUpGoerFive.setContentDescription(buildHomeContentDescription()); } public void setHomeButtonEnabled(boolean enable) { @@ -682,7 +684,7 @@ public class ActionBarView extends AbsActionBarView { removeView(mCustomNavView); } } - + if (mTitleLayout != null && (flagsChanged & ActionBar.DISPLAY_TITLE_MULTIPLE_LINES) != 0) { if ((options & ActionBar.DISPLAY_TITLE_MULTIPLE_LINES) != 0) { @@ -755,7 +757,7 @@ public class ActionBarView extends AbsActionBarView { removeView(mTabScrollView); } } - + switch (mode) { case ActionBar.NAVIGATION_MODE_LIST: if (mSpinner == null) { @@ -808,11 +810,11 @@ public class ActionBarView extends AbsActionBarView { public View getCustomNavigationView() { return mCustomNavView; } - + public int getNavigationMode() { return mNavigationMode; } - + public int getDisplayOptions() { return mDisplayOptions; } @@ -952,7 +954,7 @@ public class ActionBarView extends AbsActionBarView { throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + "with android:layout_width=\"match_parent\" (or fill_parent)"); } - + int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (heightMode != MeasureSpec.AT_MOST) { throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + @@ -963,7 +965,7 @@ public class ActionBarView extends AbsActionBarView { int maxHeight = mContentHeight >= 0 ? mContentHeight : MeasureSpec.getSize(heightMeasureSpec); - + final int verticalPadding = getPaddingTop() + getPaddingBottom(); final int paddingLeft = getPaddingLeft(); final int paddingRight = getPaddingRight(); @@ -999,7 +1001,7 @@ public class ActionBarView extends AbsActionBarView { availableWidth = Math.max(0, availableWidth - homeOffsetWidth); leftOfCenter = Math.max(0, availableWidth - homeOffsetWidth); } - + if (mMenuView != null && mMenuView.getParent() == this) { availableWidth = measureChildView(mMenuView, availableWidth, exactHeightSpec, 0); rightOfCenter = Math.max(0, rightOfCenter - mMenuView.getMeasuredWidth()); diff --git a/core/jni/Android.mk b/core/jni/Android.mk index edc0baf251e8..594d5789517a 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -25,6 +25,7 @@ LOCAL_SRC_FILES:= \ com_google_android_gles_jni_GLImpl.cpp.arm \ android_app_NativeActivity.cpp \ android_opengl_EGL14.cpp \ + android_opengl_EGLExt.cpp \ android_opengl_GLES10.cpp \ android_opengl_GLES10Ext.cpp \ android_opengl_GLES11.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 3b6b1608db00..ca658dab3814 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -67,11 +67,13 @@ extern int register_android_graphics_YuvImage(JNIEnv* env); extern int register_com_google_android_gles_jni_EGLImpl(JNIEnv* env); extern int register_com_google_android_gles_jni_GLImpl(JNIEnv* env); extern int register_android_opengl_jni_EGL14(JNIEnv* env); +extern int register_android_opengl_jni_EGLExt(JNIEnv* env); extern int register_android_opengl_jni_GLES10(JNIEnv* env); extern int register_android_opengl_jni_GLES10Ext(JNIEnv* env); extern int register_android_opengl_jni_GLES11(JNIEnv* env); extern int register_android_opengl_jni_GLES11Ext(JNIEnv* env); extern int register_android_opengl_jni_GLES20(JNIEnv* env); +extern int register_android_opengl_jni_GLES30(JNIEnv* env); extern int register_android_hardware_Camera(JNIEnv *env); extern int register_android_hardware_SensorManager(JNIEnv *env); @@ -1120,11 +1122,13 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_com_google_android_gles_jni_EGLImpl), REG_JNI(register_com_google_android_gles_jni_GLImpl), REG_JNI(register_android_opengl_jni_EGL14), + REG_JNI(register_android_opengl_jni_EGLExt), REG_JNI(register_android_opengl_jni_GLES10), REG_JNI(register_android_opengl_jni_GLES10Ext), REG_JNI(register_android_opengl_jni_GLES11), REG_JNI(register_android_opengl_jni_GLES11Ext), REG_JNI(register_android_opengl_jni_GLES20), + REG_JNI(register_android_opengl_jni_GLES30), REG_JNI(register_android_graphics_Bitmap), REG_JNI(register_android_graphics_BitmapFactory), diff --git a/core/jni/android_opengl_EGL14.cpp b/core/jni/android_opengl_EGL14.cpp index ac4bc1d6bc56..664af07b7c00 100644 --- a/core/jni/android_opengl_EGL14.cpp +++ b/core/jni/android_opengl_EGL14.cpp @@ -1202,22 +1202,6 @@ android_eglCopyBuffers return (EGLBoolean) 0; } -/* EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) */ -static jboolean -android_eglPresentationTimeANDROID - (JNIEnv *_env, jobject _this, jobject dpy, jobject sur, jlong time) { - EGLBoolean _returnValue = (EGLBoolean) 0; - EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); - EGLSurface sur_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, sur); - - _returnValue = eglPresentationTimeANDROID( - (EGLDisplay)dpy_native, - (EGLSurface)sur_native, - (EGLnsecsANDROID)time - ); - return _returnValue; -} - static const char *classPathName = "android/opengl/EGL14"; static JNINativeMethod methods[] = { @@ -1256,7 +1240,6 @@ static JNINativeMethod methods[] = { {"eglWaitNative", "(I)Z", (void *) android_eglWaitNative }, {"eglSwapBuffers", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;)Z", (void *) android_eglSwapBuffers }, {"eglCopyBuffers", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;I)Z", (void *) android_eglCopyBuffers }, -{"eglPresentationTimeANDROID", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z", (void *) android_eglPresentationTimeANDROID }, }; int register_android_opengl_jni_EGL14(JNIEnv *_env) diff --git a/core/jni/android_opengl_EGLExt.cpp b/core/jni/android_opengl_EGLExt.cpp new file mode 100644 index 000000000000..5179ddcf4c89 --- /dev/null +++ b/core/jni/android_opengl_EGLExt.cpp @@ -0,0 +1,162 @@ +/* +** Copyright 2013, 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. +*/ + +// This source file is automatically generated + +#include "jni.h" +#include "JNIHelp.h" +#include <android_runtime/AndroidRuntime.h> +#include <android_runtime/android_view_Surface.h> +#include <android_runtime/android_graphics_SurfaceTexture.h> +#include <utils/misc.h> + +#include <assert.h> +#include <EGL/egl.h> +#include <EGL/eglext.h> + +#include <gui/Surface.h> +#include <gui/GLConsumer.h> +#include <gui/Surface.h> + +#include <ui/ANativeObjectBase.h> + +static int initialized = 0; + +static jclass egldisplayClass; +static jclass eglcontextClass; +static jclass eglsurfaceClass; +static jclass eglconfigClass; + +static jmethodID egldisplayGetHandleID; +static jmethodID eglcontextGetHandleID; +static jmethodID eglsurfaceGetHandleID; +static jmethodID eglconfigGetHandleID; + +static jmethodID egldisplayConstructor; +static jmethodID eglcontextConstructor; +static jmethodID eglsurfaceConstructor; +static jmethodID eglconfigConstructor; + +static jobject eglNoContextObject; +static jobject eglNoDisplayObject; +static jobject eglNoSurfaceObject; + + + +/* Cache method IDs each time the class is loaded. */ + +static void +nativeClassInit(JNIEnv *_env, jclass glImplClass) +{ + jclass egldisplayClassLocal = _env->FindClass("android/opengl/EGLDisplay"); + egldisplayClass = (jclass) _env->NewGlobalRef(egldisplayClassLocal); + jclass eglcontextClassLocal = _env->FindClass("android/opengl/EGLContext"); + eglcontextClass = (jclass) _env->NewGlobalRef(eglcontextClassLocal); + jclass eglsurfaceClassLocal = _env->FindClass("android/opengl/EGLSurface"); + eglsurfaceClass = (jclass) _env->NewGlobalRef(eglsurfaceClassLocal); + jclass eglconfigClassLocal = _env->FindClass("android/opengl/EGLConfig"); + eglconfigClass = (jclass) _env->NewGlobalRef(eglconfigClassLocal); + + egldisplayGetHandleID = _env->GetMethodID(egldisplayClass, "getHandle", "()I"); + eglcontextGetHandleID = _env->GetMethodID(eglcontextClass, "getHandle", "()I"); + eglsurfaceGetHandleID = _env->GetMethodID(eglsurfaceClass, "getHandle", "()I"); + eglconfigGetHandleID = _env->GetMethodID(eglconfigClass, "getHandle", "()I"); + + + egldisplayConstructor = _env->GetMethodID(egldisplayClass, "<init>", "(I)V"); + eglcontextConstructor = _env->GetMethodID(eglcontextClass, "<init>", "(I)V"); + eglsurfaceConstructor = _env->GetMethodID(eglsurfaceClass, "<init>", "(I)V"); + eglconfigConstructor = _env->GetMethodID(eglconfigClass, "<init>", "(I)V"); + + jobject localeglNoContextObject = _env->NewObject(eglcontextClass, eglcontextConstructor, (jint)EGL_NO_CONTEXT); + eglNoContextObject = _env->NewGlobalRef(localeglNoContextObject); + jobject localeglNoDisplayObject = _env->NewObject(egldisplayClass, egldisplayConstructor, (jint)EGL_NO_DISPLAY); + eglNoDisplayObject = _env->NewGlobalRef(localeglNoDisplayObject); + jobject localeglNoSurfaceObject = _env->NewObject(eglsurfaceClass, eglsurfaceConstructor, (jint)EGL_NO_SURFACE); + eglNoSurfaceObject = _env->NewGlobalRef(localeglNoSurfaceObject); + + + jclass eglClass = _env->FindClass("android/opengl/EGL14"); + jfieldID noContextFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_CONTEXT", "Landroid/opengl/EGLContext;"); + _env->SetStaticObjectField(eglClass, noContextFieldID, eglNoContextObject); + + jfieldID noDisplayFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_DISPLAY", "Landroid/opengl/EGLDisplay;"); + _env->SetStaticObjectField(eglClass, noDisplayFieldID, eglNoDisplayObject); + + jfieldID noSurfaceFieldID = _env->GetStaticFieldID(eglClass, "EGL_NO_SURFACE", "Landroid/opengl/EGLSurface;"); + _env->SetStaticObjectField(eglClass, noSurfaceFieldID, eglNoSurfaceObject); +} + +static void * +fromEGLHandle(JNIEnv *_env, jmethodID mid, jobject obj) { + if (obj == NULL){ + jniThrowException(_env, "java/lang/IllegalArgumentException", + "Object is set to null."); + } + + return (void*) (_env->CallIntMethod(obj, mid)); +} + +static jobject +toEGLHandle(JNIEnv *_env, jclass cls, jmethodID con, void * handle) { + if (cls == eglcontextClass && + (EGLContext)handle == EGL_NO_CONTEXT) { + return eglNoContextObject; + } + + if (cls == egldisplayClass && + (EGLDisplay)handle == EGL_NO_DISPLAY) { + return eglNoDisplayObject; + } + + if (cls == eglsurfaceClass && + (EGLSurface)handle == EGL_NO_SURFACE) { + return eglNoSurfaceObject; + } + + return _env->NewObject(cls, con, (jint)handle); +} + +// -------------------------------------------------------------------------- +/* EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) */ +static jboolean +android_eglPresentationTimeANDROID + (JNIEnv *_env, jobject _this, jobject dpy, jobject sur, jlong time) { + EGLBoolean _returnValue = (EGLBoolean) 0; + EGLDisplay dpy_native = (EGLDisplay) fromEGLHandle(_env, egldisplayGetHandleID, dpy); + EGLSurface sur_native = (EGLSurface) fromEGLHandle(_env, eglsurfaceGetHandleID, sur); + + _returnValue = eglPresentationTimeANDROID( + (EGLDisplay)dpy_native, + (EGLSurface)sur_native, + (EGLnsecsANDROID)time + ); + return (jboolean)_returnValue; +} + +static const char *classPathName = "android/opengl/EGLExt"; + +static JNINativeMethod methods[] = { +{"_nativeClassInit", "()V", (void*)nativeClassInit }, +{"eglPresentationTimeANDROID", "(Landroid/opengl/EGLDisplay;Landroid/opengl/EGLSurface;J)Z", (void *) android_eglPresentationTimeANDROID }, +}; + +int register_android_opengl_jni_EGLExt(JNIEnv *_env) +{ + int err; + err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods)); + return err; +} diff --git a/core/jni/android_opengl_GLES30.cpp b/core/jni/android_opengl_GLES30.cpp index ac294bdcc433..3c50aa0ee814 100644 --- a/core/jni/android_opengl_GLES30.cpp +++ b/core/jni/android_opengl_GLES30.cpp @@ -5144,7 +5144,7 @@ static JNINativeMethod methods[] = { {"glGetStringi", "(II)Ljava/lang/String;", (void *) android_glGetStringi__II }, {"glCopyBufferSubData", "(IIIII)V", (void *) android_glCopyBufferSubData__IIIII }, {"glGetUniformIndices", "(I[Ljava/lang/String;[II)V", (void *) android_glGetUniformIndices_array }, -{"glGetUniformIndices", "(I[Ljava/lang/String;[Ljava/nio/IntBuffer)V", (void *) android_glGetUniformIndices_buffer }, +{"glGetUniformIndices", "(I[Ljava/lang/String;Ljava/nio/IntBuffer;)V", (void *) android_glGetUniformIndices_buffer }, {"glGetActiveUniformsiv", "(II[III[II)V", (void *) android_glGetActiveUniformsiv__II_3III_3II }, {"glGetActiveUniformsiv", "(IILjava/nio/IntBuffer;ILjava/nio/IntBuffer;)V", (void *) android_glGetActiveUniformsiv__IILjava_nio_IntBuffer_2ILjava_nio_IntBuffer_2 }, {"glGetUniformBlockIndex", "(ILjava/lang/String;)I", (void *) android_glGetUniformBlockIndex__ILjava_lang_String_2 }, diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index a41a38997031..d9f6be96a156 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -55,8 +55,7 @@ static const char* const OutOfResourcesException = static struct { jclass clazz; jfieldID mNativeObject; - jfieldID mNativeObjectLock; - jfieldID mCanvas; + jfieldID mLock; jmethodID ctor; } gSurfaceClassInfo; @@ -93,7 +92,7 @@ sp<ANativeWindow> android_view_Surface_getNativeWindow(JNIEnv* env, jobject surf sp<Surface> android_view_Surface_getSurface(JNIEnv* env, jobject surfaceObj) { sp<Surface> sur; jobject lock = env->GetObjectField(surfaceObj, - gSurfaceClassInfo.mNativeObjectLock); + gSurfaceClassInfo.mLock); if (env->MonitorEnter(lock) == JNI_OK) { sur = reinterpret_cast<Surface *>( env->GetIntField(surfaceObj, gSurfaceClassInfo.mNativeObject)); @@ -200,12 +199,13 @@ static inline void swapCanvasPtr(JNIEnv* env, jobject canvasObj, SkCanvas* newCa SkSafeUnref(previousCanvas); } -static jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jint nativeObject, jobject dirtyRectObj) { +static void nativeLockCanvas(JNIEnv* env, jclass clazz, + jint nativeObject, jobject canvasObj, jobject dirtyRectObj) { sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); if (!isSurfaceValid(surface)) { doThrowIAE(env); - return NULL; + return; } // get dirty region @@ -232,11 +232,10 @@ static jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jint nativeObje OutOfResourcesException : "java/lang/IllegalArgumentException"; jniThrowException(env, exception, NULL); - return NULL; + return; } // Associate a SkCanvas object to this surface - jobject canvasObj = env->GetObjectField(surfaceObj, gSurfaceClassInfo.mCanvas); env->SetIntField(canvasObj, gCanvasClassInfo.mSurfaceFormat, outBuffer.format); SkBitmap bitmap; @@ -277,17 +276,10 @@ static jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jint nativeObje env->SetIntField(dirtyRectObj, gRectClassInfo.right, bounds.right); env->SetIntField(dirtyRectObj, gRectClassInfo.bottom, bounds.bottom); } - - return canvasObj; } -static void nativeUnlockCanvasAndPost(JNIEnv* env, jobject surfaceObj, jint nativeObject, jobject canvasObj) { - jobject ownCanvasObj = env->GetObjectField(surfaceObj, gSurfaceClassInfo.mCanvas); - if (!env->IsSameObject(ownCanvasObj, canvasObj)) { - doThrowIAE(env); - return; - } - +static void nativeUnlockCanvasAndPost(JNIEnv* env, jclass clazz, + jint nativeObject, jobject canvasObj) { sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); if (!isSurfaceValid(surface)) { return; @@ -306,8 +298,8 @@ static void nativeUnlockCanvasAndPost(JNIEnv* env, jobject surfaceObj, jint nati // ---------------------------------------------------------------------------- -static jint nativeCopyFrom(JNIEnv* env, jclass clazz, - jint nativeObject, jint surfaceControlNativeObj) { +static jint nativeCreateFromSurfaceControl(JNIEnv* env, jclass clazz, + jint surfaceControlNativeObj) { /* * This is used by the WindowManagerService just after constructing * a Surface and is necessary for returning the Surface reference to @@ -315,17 +307,11 @@ static jint nativeCopyFrom(JNIEnv* env, jclass clazz, */ sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj)); - sp<Surface> other(ctrl->getSurface()); - if (other != NULL) { - other->incStrong(&sRefBaseOwner); - } - - sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject)); - if (sur != NULL) { - sur->decStrong(&sRefBaseOwner); + sp<Surface> surface(ctrl->getSurface()); + if (surface != NULL) { + surface->incStrong(&sRefBaseOwner); } - - return int(other.get()); + return reinterpret_cast<jint>(surface.get()); } static jint nativeReadFromParcel(JNIEnv* env, jclass clazz, @@ -386,12 +372,12 @@ static JNINativeMethod gSurfaceMethods[] = { (void*)nativeIsValid }, {"nativeIsConsumerRunningBehind", "(I)Z", (void*)nativeIsConsumerRunningBehind }, - {"nativeLockCanvas", "(ILandroid/graphics/Rect;)Landroid/graphics/Canvas;", + {"nativeLockCanvas", "(ILandroid/graphics/Canvas;Landroid/graphics/Rect;)V", (void*)nativeLockCanvas }, {"nativeUnlockCanvasAndPost", "(ILandroid/graphics/Canvas;)V", (void*)nativeUnlockCanvasAndPost }, - {"nativeCopyFrom", "(II)I", - (void*)nativeCopyFrom }, + {"nativeCreateFromSurfaceControl", "(I)I", + (void*)nativeCreateFromSurfaceControl }, {"nativeReadFromParcel", "(ILandroid/os/Parcel;)I", (void*)nativeReadFromParcel }, {"nativeWriteToParcel", "(ILandroid/os/Parcel;)V", @@ -406,11 +392,9 @@ int register_android_view_Surface(JNIEnv* env) jclass clazz = env->FindClass("android/view/Surface"); gSurfaceClassInfo.clazz = jclass(env->NewGlobalRef(clazz)); gSurfaceClassInfo.mNativeObject = - env->GetFieldID(gSurfaceClassInfo.clazz, "mNativeObject", "I"); - gSurfaceClassInfo.mNativeObjectLock = - env->GetFieldID(gSurfaceClassInfo.clazz, "mNativeObjectLock", "Ljava/lang/Object;"); - gSurfaceClassInfo.mCanvas = - env->GetFieldID(gSurfaceClassInfo.clazz, "mCanvas", "Landroid/graphics/Canvas;"); + env->GetFieldID(gSurfaceClassInfo.clazz, "mNativeSurface", "I"); + gSurfaceClassInfo.mLock = + env->GetFieldID(gSurfaceClassInfo.clazz, "mLock", "Ljava/lang/Object;"); gSurfaceClassInfo.ctor = env->GetMethodID(gSurfaceClassInfo.clazz, "<init>", "(I)V"); clazz = env->FindClass("android/graphics/Canvas"); diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 17385877a3d5..32513131236f 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Laat die program toe om klank met die mikrofoon op te neem. Hierdie toestemming laat die program toe om klank te eniger tyd, sonder jou bevestiging, op te neem."</string> <string name="permlab_camera" msgid="3616391919559751192">"neem foto\'s en video\'s"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Laat die program toe om foto\'s en video\'s met die kamera te neem. Hierdie toestemming laat die program toe om die kamera te eniger tyd sonder jou bevestiging te gebruik."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"deaktiveer LED wat oordrag aandui wanneer kamera gebruik word"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Laat \'n pre-geïnstalleerde stelselprogram toe om die LED wat kamera-gebruik aandui, te deaktiveer."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"deaktiveer tablet permanent"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"deaktiveer foon permanent"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Laat die program toe om die hele tablet permanent uitvee. Dit is baie gevaarlik."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string> <string name="owner_name" msgid="2716755460376028154">"Eienaar"</string> <string name="error_message_title" msgid="4510373083082500195">"Fout"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Hierdie program werk nie met rekeninge vir beperkte profiele nie"</string> <string name="app_not_found" msgid="3429141853498927379">"Geen program gevind om hierdie handeling te hanteer nie"</string> <string name="revoke" msgid="5404479185228271586">"Herroep"</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 06c798885603..b56bca263d0b 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"መተግበሪያው ድምጽን በማይክሮፎን እንዲቀዳ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው ያላንተ ማረጋገጫ በማንኛውም ጊዜ ድምጽ እንዲቀዳ ይፈቅድለታል።"</string> <string name="permlab_camera" msgid="3616391919559751192">"ፎቶዎች እና ቪዲዮዎች አንሳ"</string> <string name="permdesc_camera" msgid="8497216524735535009">"መተግበሪያው በካሜራው ፎቶዎችንና ቪዲዮዎችን እንዲያነሳ ይፈቅድለታል። ይህ ፈቃድ መተግበሪያው ካሜራውን በማንኛውም ጊዜ ያላንተ ማረጋገጫ እንዲጠቀም ይፈቅድለታል።"</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"ካሜራው ስራ ላይ ሲሆን የማስተላለፍ አመልካች ኤል ኢ ዲን ያሰናክሉ"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"ቀድሞ የተጫነ የስርዓት መተግበሪያ ካሜራውን አመላካች ኤል ኢ ዲ እንዳይጠቀም እንዲያሰናክል ያስችለዋል።"</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"በቋሚነት ጡባዊ አቦዝን"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"በቋሚነት ስልኩን አቦዝን"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"ትግበራው ጡባዊ ተኮውን በቋሚነት ማቦዘን ይፈቅዳል። ይህ በጣም አደገኛ ነው።"</string> @@ -623,7 +621,7 @@ <string name="permdesc_use_sip" msgid="4717632000062674294">" ለSIP ግልጋሎት የበይነ መረብ ጥሪዎች አድርግ/ተቀበል ለመተግበሪያው ይፈቅዳሉ።"</string> <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"የታሪካዊ አውታረመረብ አጠቃቀም አንብብ"</string> <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"የተወሰኑ የአውታረ መረቦች እና ትግበራዎችን ታሪካዊ የአውታረመረብ አጠቃቀም ለማንበብ ለመተግበሪያው ይፈቅዳሉ፡፡"</string> - <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"የአውታረ መረብ ፖሊሲ አደራጅ"</string> + <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"የአውታረ መረብ መምሪያ አደራጅ"</string> <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"የአውታረመረብ ቋሚ መመሪያዎችን እና ትግበራ ተኮር ደንቦችን ለማደራጀት ለመተግበሪያው ይፈቅዳሉ፡፡"</string> <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"የአውታረ መረብ አጠቃቀም"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"ከመተግበሪያዎች በተለየ መልኩ እንዴት የአውታረ መረብ አጠቃቀም እንደተመዘገበ ለመቀየር ለመተግበሪያው ይፈቅዳሉ።ለመደበኛ መተግበሪያዎች አገልግሎት አይውልም።"</string> @@ -644,7 +642,7 @@ <string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"የፋብሪካው ውሂብ ዳግም አስጀምርን በማከናወን፣ያለ ማስጠንቀቂያ የጡባዊውን ውሂብ አጥፋ።"</string> <string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"የፋብሪካ ውሂብ ድጋሚ አስጀምር በማከናወን ያለ ማሰጠንቀቂያ የስልኩን ውሂብ ደምስስ።"</string> <string name="policylab_setGlobalProxy" msgid="2784828293747791446">"የመሣሪያውን ሁሉንም ፕሮክሲ አዘጋጅ"</string> - <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"ፖሊሲ እስኪነቃ ድረስ ለመጠቀም የመሣሪያውን ሁሉንም ፕሮክሲ አዘጋጅ። የመጀመሪያው የመሣሪያ አስተዳደር ብቻ የሁሉንም ፕሮክሲ ያዘጋጃል።"</string> + <string name="policydesc_setGlobalProxy" msgid="6387497466660154931">"መምሪያ እስኪነቃ ድረስ ለመጠቀም የመሣሪያውን ሁሉንም ፕሮክሲ አዘጋጅ። የመጀመሪያው የመሣሪያ አስተዳደር ብቻ የሁሉንም ፕሮክሲ ያዘጋጃል።"</string> <string name="policylab_expirePassword" msgid="885279151847254056">"የማያቆልፍ ይለፍ ቃል ማብቂያ ጊዜ አዘጋጅ"</string> <string name="policydesc_expirePassword" msgid="1729725226314691591">"የማያ ቆልፍ ይለፍ ቃል በምን ያህል ጊዜ ተደጋግሞ መለወጥ እንዳለበት ተቆጣጠር።"</string> <string name="policylab_encryptedStorage" msgid="8901326199909132915">"ማከማቻ ማመስጠር አዘጋጅ"</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string> <string name="owner_name" msgid="2716755460376028154">"ባለቤት"</string> <string name="error_message_title" msgid="4510373083082500195">"ስህተት"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"ይህ መተግበሪያ የተገደቡ መገለጫዎች መለያዎችን አይደግፍም"</string> <string name="app_not_found" msgid="3429141853498927379">"ይህን እርምጃ የሚያከናውን ምንም መተግበሪያ አልተገኘም"</string> <string name="revoke" msgid="5404479185228271586">"ሻር"</string> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index be2aedda1051..f101f16e1112 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"للسماح للتطبيق بتسجيل الصوت باستخدام الميكروفون. ويتيح هذا الإذن للتطبيق تسجيل الصوت في أي وقت وبدون موافقة منك."</string> <string name="permlab_camera" msgid="3616391919559751192">"التقاط صور ومقاطع فيديو"</string> <string name="permdesc_camera" msgid="8497216524735535009">"للسماح للتطبيق بالتقاط صور ومقاطع فيديو من خلال الكاميرا. ويتيح هذا الإذن للتطبيق استخدام الكاميرا في أي وقت وبدون موافقة منك."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"تعطيل مؤشر LED للإرسال عندما تكون الكاميرا قيد الاستخدام"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"للسماح لتطبيق نظام مثبت مسبقًا لتعطيل مؤشر LED لاستخدام الكاميرا."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"تعطيل الجهاز اللوحي نهائيًا"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"تعطيل الهاتف على الدوام"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"للسماح للتطبيق بتعطيل الجهاز اللوحي بالكامل بشكل دائم. هذا خطير للغاية."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"المالك"</string> <string name="error_message_title" msgid="4510373083082500195">"خطأ"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"هذا التطبيق لا يتوافق مع حسابات الملفات الشخصية المقيدة"</string> <string name="app_not_found" msgid="3429141853498927379">"لم يتم العثور على تطبيق يمكنه التعامل مع هذا الإجراء."</string> <string name="revoke" msgid="5404479185228271586">"إلغاء"</string> </resources> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index b5b1ac4fd3da..1f1093b3b386 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Дазваляе прыкладанню запісваць аўдыё з дапамогай мікрафона. Дзякуючы гэтаму дазволу прыкладаннi могуць запiсваць аўдыё ў любы час без вашага пацвярджэння."</string> <string name="permlab_camera" msgid="3616391919559751192">"рабіць фатаграфіі і відэа"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Дазваляе прыкладанню рабiць фотаздымкi і здымаць відэа з дапамогай камеры. Дзякуючы ггэтаму дазволу прыкладанне можа ў любы час выкарыстоўваць камеру без вашага пацверджання."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"адключыць святлодыёдны індыкатар перадачы, калі камера выкарыстоўваецца"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Дазваляе папярэдне ўсталяванаму сістэмнаму прыкладанню адключыць святлодыёдны індыкатар працы камеры."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"цалкам адключыць планшэт"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"цалкам адключаць тэлефон"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Дазваляе прыкладанням цалкам адключаць планшэт. Гэта вельмі небяспечна."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Бягучы карыстальнік <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Уладальнік"</string> <string name="error_message_title" msgid="4510373083082500195">"Памылка"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Гэтае прыкладанне не падтрымлівае уліковыя запісы для карыстальнікаў з абмежаваннямi"</string> <string name="app_not_found" msgid="3429141853498927379">"Прыкладанне для гэтага дзеяння не знойдзенае"</string> <string name="revoke" msgid="5404479185228271586">"Ануляваць"</string> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 31ff56cc2580..677470994fe9 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Разрешава на приложението да записва звук с микрофона. Това разрешение му позволява да го прави по всяко време без потвърждение от ваша страна."</string> <string name="permlab_camera" msgid="3616391919559751192">"правене на снимки и видеоклипове"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Разрешава на приложението да прави снимки и видеоклипове с камерата. Това разрешение му позволява да я използва по всяко време без потвърждение от ваша страна."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"деактивиране на светодиодния индикатор за предаване, когато камерата се използва"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Разрешава на предварително инсталирано системно приложение да деактивира светодиодния индикатор за използване на камерата."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"деактивиране на таблета за постоянно"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"деактивиране на телефона за постоянно"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Разрешава на приложението да деактивира целия таблет за постоянно. Това е много опасно."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Собственик"</string> <string name="error_message_title" msgid="4510373083082500195">"Грешка"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Това приложение не поддържа профили за потребителски профили с ограничена функционалност"</string> <string name="app_not_found" msgid="3429141853498927379">"Няма намерено приложение за извършване на това действие"</string> <string name="revoke" msgid="5404479185228271586">"Отмяна"</string> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 9013c6cff961..9900c69c8a4d 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permet que l\'aplicació enregistri àudio amb el micròfon. Aquest permís permet que l\'aplicació enregistri àudio en qualsevol moment sense la teva confirmació."</string> <string name="permlab_camera" msgid="3616391919559751192">"fes fotos i vídeos"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Permet que l\'aplicació faci fotos i vídeos amb la càmera. Aquest permís permet que l\'aplicació utilitzi la càmera en qualsevol moment sense la teva confirmació."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"desactiva la transmissió del LED indicador en fer servir la càmera"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permet que una aplicació dels sistema preinstal·lada desactivi el LED indicador d\'ús de la càmera."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactiva la tauleta de manera permanent"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"desactivar definitivament el telèfon"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permet que l\'aplicació desactivi tota la tauleta de manera permanent. Aquesta acció és molt perillosa."</string> @@ -1057,7 +1055,7 @@ <string name="textSelectionCABTitle" msgid="5236850394370820357">"Selecció de text"</string> <string name="addToDictionary" msgid="4352161534510057874">"Afegeix al diccionari"</string> <string name="deleteText" msgid="6979668428458199034">"Suprimeix"</string> - <string name="inputMethod" msgid="1653630062304567879">"Mètode d\'entrada"</string> + <string name="inputMethod" msgid="1653630062304567879">"Mètode d\'introducció de text"</string> <string name="editTextMenuTitle" msgid="4909135564941815494">"Accions de text"</string> <string name="low_internal_storage_view_title" msgid="5576272496365684834">"S\'està acabant l\'espai d\'emmagatzematge"</string> <string name="low_internal_storage_view_text" msgid="6640505817617414371">"És possible que algunes funcions del sistema no funcionin"</string> @@ -1275,7 +1273,7 @@ <string name="deny" msgid="2081879885755434506">"Denega"</string> <string name="permission_request_notification_title" msgid="6486759795926237907">"Permís sol·licitat"</string> <string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"S\'ha sol·licitat permís"\n"per al compte <xliff:g id="ACCOUNT">%s</xliff:g>."</string> - <string name="input_method_binding_label" msgid="1283557179944992649">"Mètode d\'entrada"</string> + <string name="input_method_binding_label" msgid="1283557179944992649">"Mètode d\'introducció de text"</string> <string name="sync_binding_label" msgid="3687969138375092423">"Sincronització"</string> <string name="accessibility_binding_label" msgid="4148120742096474641">"Accessibilitat"</string> <string name="wallpaper_binding_label" msgid="1240087844304687662">"Fons de pantalla"</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Propietari"</string> <string name="error_message_title" msgid="4510373083082500195">"Error"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"L\'aplicació no és compatible amb comptes de perfils restringits."</string> <string name="app_not_found" msgid="3429141853498927379">"No s\'ha trobat cap aplicació per processar aquesta acció"</string> <string name="revoke" msgid="5404479185228271586">"Revoca"</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 10d8fe0b24d7..9b18284c5550 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Umožňuje aplikaci zaznamenat zvuk pomocí mikrofonu. Toto oprávnění umožňuje aplikaci kdykoliv zaznamenat zvuk bez vašeho svolení."</string> <string name="permlab_camera" msgid="3616391919559751192">"pořizování fotografií a videí"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Umožňuje aplikaci pořizovat fotografie a videa pomocí fotoaparátu. Toto oprávnění umožňuje aplikaci používat fotoaparát kdykoliv i bez vašeho svolení."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"vypnutí indikátoru LED přenosu při použití fotoaparátu"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Umožňuje předinstalované systémové aplikaci vypnout kontrolku LED fotoaparátu."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trvalé vypnutí tabletu"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"trvalé vypnutí telefonu"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Umožňuje aplikaci trvale vypnout celý tablet. To je velmi nebezpečné oprávnění."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Vlastník"</string> <string name="error_message_title" msgid="4510373083082500195">"Chyba"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Tato aplikace nepodporuje účty pro omezené profily."</string> <string name="app_not_found" msgid="3429141853498927379">"Aplikace potřebná k provedení této akce nebyla nalezena"</string> <string name="revoke" msgid="5404479185228271586">"Zrušit"</string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index b9b4066171ee..54d61a4a7864 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Tillader, at appen kan optage lyd med mikrofonen. Med denne tilladelse kan appen til enhver tid optage lyd uden din bekræftelse."</string> <string name="permlab_camera" msgid="3616391919559751192">"tag billeder og optag video"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Tillader, at appen kan tage billeder og videoer med kameraet. Med denne tilladelse kan appen til enhver tid bruge kameraet uden din bekræftelse."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"deaktiver sendelysdioden, når kameraet er i brug"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Tillader, at en forudinstalleret systemapplikation deaktiverer lysdioden for brug af kameraet."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"deaktiver tabletcomputeren permanent"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"deaktiver telefonen permanent"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tillader, at appen kan deaktivere hele din tablet permanent. Dette er meget farligt."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Ejer"</string> <string name="error_message_title" msgid="4510373083082500195">"Fejl"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Denne applikation understøtter ikke konti for begrænsede profiler"</string> <string name="app_not_found" msgid="3429141853498927379">"Der blev ikke fundet nogen applikation, der kan håndtere denne handling"</string> <string name="revoke" msgid="5404479185228271586">"Tilbagekald"</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 9be524b2f805..ac82f6287acd 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Ermöglicht der App, Ton mithilfe des Mikrofons aufzunehmen. Die Berechtigung erlaubt der App, Tonaufnahmen jederzeit und ohne Ihre Bestätigung durchzuführen."</string> <string name="permlab_camera" msgid="3616391919559751192">"Bilder und Videos aufnehmen"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Ermöglicht der App, Bilder und Videos mit der Kamera aufzunehmen. Die Berechtigung erlaubt der App, die Kamera jederzeit und ohne Ihre Bestätigung zu nutzen."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"LED-Anzeige für Übertragung bei Kameranutzung deaktivieren"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Vorinstallierte System-Apps können die LED-Anzeige für die Kameranutzung deaktivieren."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"Tablet dauerhaft deaktivieren"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"Telefon dauerhaft deaktivieren"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ermöglicht der App, das gesamte Tablet dauerhaft zu deaktivieren. Dies birgt hohe Risiken."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Aktueller Nutzer <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="owner_name" msgid="2716755460376028154">"Eigentümer"</string> <string name="error_message_title" msgid="4510373083082500195">"Fehler"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Diese App unterstützt keine Konten für eingeschränkte Profile."</string> <string name="app_not_found" msgid="3429141853498927379">"Für diese Aktion wurde keine App gefunden."</string> <string name="revoke" msgid="5404479185228271586">"Aufheben"</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 7dc8330daf90..2cb7381e1608 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Επιτρέπει στην εφαρμογή την εγγραφή ήχου με το μικρόφωνο. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να εγγράφει ήχο ανά πάσα στιγμή χωρίς την έγκρισή σας."</string> <string name="permlab_camera" msgid="3616391919559751192">"λήψη φωτογραφιών και βίντεο"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Επιτρέπει στην εφαρμογή τη λήψη φωτογραφιών και βίντεο με τη φωτογραφική μηχανή. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να χρησιμοποιεί τη φωτογραφική μηχανή ανά πάσα στιγμή χωρίς την έγκρισή σας."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"απενεργοποίηση ένδειξης LED μετάδοσης όταν χρησιμοποιείται η φωτογραφική μηχανή"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Επιτρέπει σε μια προεγκατεστημένη εφαρμογή συστήματος να απενεργοποιήσει την ένδειξη LED χρήσης της φωτογραφικής μηχανής."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"μόνιμη απενεργοποίηση του tablet"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"μόνιμη απενεργοποίηση τηλεφώνου"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Επιτρέπει στην εφαρμογή τη μόνιμη απενεργοποίηση όλων των λειτουργιών του tablet, το οποίο είναι εξαιρετικά επικίνδυνο."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Κάτοχος"</string> <string name="error_message_title" msgid="4510373083082500195">"Σφάλμα"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Αυτή η εφαρμογή δεν υποστηρίζει λογαριασμούς για περιορισμένα προφίλ"</string> <string name="app_not_found" msgid="3429141853498927379">"Δεν υπάρχει εφαρμογή για τη διαχείριση αυτής της ενέργειας"</string> <string name="revoke" msgid="5404479185228271586">"Ανάκληση"</string> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index dd1dcda56af6..555d20983608 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Allows the app to record audio with the microphone. This permission allows the app to record audio at any time without your confirmation."</string> <string name="permlab_camera" msgid="3616391919559751192">"take pictures and videos"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Allows the app to take pictures and videos with the camera. This permission allows the app to use the camera at any time without your confirmation."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"disable transmit indicator LED when camera is in use"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Allows a pre-installed system application to disable the camera use indicator LED."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"permanently disable tablet"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"permanently disable phone"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Allows the app to permanently disable the entire tablet. This is very dangerous."</string> @@ -570,12 +568,12 @@ <string name="permlab_changeBackgroundDataSetting" msgid="1400666012671648741">"change background data usage setting"</string> <string name="permdesc_changeBackgroundDataSetting" msgid="5347729578468744379">"Allows the app to change the background data usage setting."</string> <string name="permlab_accessWifiState" msgid="5202012949247040011">"view Wi-Fi connections"</string> - <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Allows the app to view information about Wi-FI networking, such as whether Wi-FI is enabled and name of connected Wi-FI devices."</string> + <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Allows the app to view information about Wi-Fi networking, such as whether Wi-Fi is enabled and name of connected Wi-Fi devices."</string> <string name="permlab_changeWifiState" msgid="6550641188749128035">"connect and disconnect from Wi-Fi"</string> - <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Allows the app to connect to and disconnect from Wi-FI access points and to make changes to device configuration for Wi-FI networks."</string> + <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Allows the app to connect to and disconnect from Wi-Fi access points and to make changes to device configuration for Wi-Fi networks."</string> <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"allow Wi-Fi Multicast reception"</string> - <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Allows the app to receive packets sent to all devices on a Wi-FI network using multicast addresses, not just your tablet. It uses more power than the non-multicast mode."</string> - <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Allows the app to receive packets sent to all devices on a Wi-FI network using multicast addresses, not just your phone. It uses more power than the non-multicast mode."</string> + <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Allows the app to receive packets sent to all devices on a Wi-Fi network using multicast addresses, not just your tablet. It uses more power than the non-multicast mode."</string> + <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Allows the app to receive packets sent to all devices on a Wi-Fi network using multicast addresses, not just your phone. It uses more power than the non-multicast mode."</string> <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"access Bluetooth settings"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Allows the app to configure the local Bluetooth tablet and to discover and pair with remote devices."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Allows the app to configure the local Bluetooth phone and to discover and pair with remote devices."</string> @@ -1157,7 +1155,7 @@ <string name="wifi_p2p_enter_pin_message" msgid="5920929550367828970">"Type the required PIN:"</string> <string name="wifi_p2p_show_pin_message" msgid="8530563323880921094">"PIN:"</string> <string name="wifi_p2p_frequency_conflict_message" product="tablet" msgid="8012981257742232475">"The tablet will temporarily disconnect from Wi-Fi while it\'s connected to <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> - <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"The phone will temporarily disconnect from Wi-FI while it\'s connected to <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> + <string name="wifi_p2p_frequency_conflict_message" product="default" msgid="7363907213787469151">"The phone will temporarily disconnect from Wi-Fi while it\'s connected to <xliff:g id="DEVICE_NAME">%1$s</xliff:g>"</string> <string name="select_character" msgid="3365550120617701745">"Insert character"</string> <string name="sms_control_title" msgid="7296612781128917719">"Sending SMS messages"</string> <string name="sms_control_message" msgid="3867899169651496433">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> is sending a large number of SMS messages. Do you want to allow this app to continue sending messages?"</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Current user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Owner"</string> <string name="error_message_title" msgid="4510373083082500195">"Error"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"This application does not support accounts for restricted profiles"</string> <string name="app_not_found" msgid="3429141853498927379">"No application found to handle this action"</string> <string name="revoke" msgid="5404479185228271586">"Revoke"</string> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index b4ade0798caf..e14a36ce58f0 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que la aplicación grabe audio con el micrófono. La aplicación puede utilizar este permiso para grabar audio en cualquier momento sin tener tu confirmación."</string> <string name="permlab_camera" msgid="3616391919559751192">"tomar fotografías y grabar videos"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Permite que la aplicación saque fotos o grabe videos con la cámara. Este permiso autoriza a la aplicación a utilizar la cámara en cualquier momento sin tu confirmación."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"Inhabilitar el indicador LED de transmisión mientras se utiliza la cámara"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permite que una aplicación del sistema instalada previamente inhabilite el indicador LED de uso de la cámara."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactivar tablet de forma permanente"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"desactivar dispositivo de manera permanente"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que la aplicación inhabilite toda la tableta de manera permanente. Esto es muy peligroso."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="owner_name" msgid="2716755460376028154">"Propietario"</string> <string name="error_message_title" msgid="4510373083082500195">"Error"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Esta aplicación no admite cuentas de perfiles restringidos."</string> <string name="app_not_found" msgid="3429141853498927379">"No se encontró una aplicación para manejar esta acción."</string> <string name="revoke" msgid="5404479185228271586">"Revocar"</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 2efedde00caa..c8665cd33f5f 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que la aplicación grabe audio con el micrófono. La aplicación puede utilizar este permiso para grabar audio en cualquier momento sin tener la confirmación del usuario."</string> <string name="permlab_camera" msgid="3616391919559751192">"realizar fotografías y vídeos"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Permite que la aplicación haga fotos o grabe vídeos con la cámara. Este permiso autoriza a la aplicación a utilizar la cámara en cualquier momento sin tu confirmación."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"inhabilitar el indicador LED de transmisión mientras se utiliza la cámara"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permite que una aplicación de sistema instalada previamente inhabilite el indicador LED que advierte del uso de la cámara."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"inhabilitar tablet de forma permanente"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"inhabilitar el teléfono de forma permanente"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que la aplicación inhabilite todas las funciones del tablet de forma permanente. Este permiso es muy peligroso."</string> @@ -1074,7 +1072,7 @@ <string name="whichApplication" msgid="4533185947064773386">"Completar acción utilizando"</string> <string name="alwaysUse" msgid="4583018368000610438">"Usar siempre para esta acción"</string> <string name="clearDefaultHintMsg" msgid="3252584689512077257">"Para borrar los valores predeterminados, accede a Ajustes del sistema > Aplicaciones > Descargadas."</string> - <string name="chooseActivity" msgid="7486876147751803333">"Seleccionar una acción"</string> + <string name="chooseActivity" msgid="7486876147751803333">"Selecciona una acción"</string> <string name="chooseUsbActivity" msgid="6894748416073583509">"Seleccionar una aplicación para el dispositivo USB"</string> <string name="noApplications" msgid="2991814273936504689">"Ninguna aplicación puede realizar esta acción."</string> <string name="aerr_title" msgid="1905800560317137752"></string> @@ -1109,7 +1107,7 @@ <string name="old_app_description" msgid="2082094275580358049">"No iniciar la nueva aplicación"</string> <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> <string name="new_app_description" msgid="1932143598371537340">"Detener la aplicación anterior sin guardar"</string> - <string name="sendText" msgid="5209874571959469142">"Seleccionar una acción para el texto"</string> + <string name="sendText" msgid="5209874571959469142">"Selecciona una acción para el texto"</string> <string name="volume_ringtone" msgid="6885421406845734650">"Volumen del timbre"</string> <string name="volume_music" msgid="5421651157138628171">"Volumen multimedia"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Reproduciendo a través de Bluetooth"</string> @@ -1450,7 +1448,7 @@ <string name="wifi_display_notification_disconnect" msgid="6183754463561153372">"Desconectar"</string> <string name="kg_emergency_call_label" msgid="684946192523830531">"Llamada de emergencia"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"¿Has olvidado el patrón?"</string> - <string name="kg_wrong_pattern" msgid="1850806070801358830">"El patrón es incorrecto."</string> + <string name="kg_wrong_pattern" msgid="1850806070801358830">"El patrón es incorrecto"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Contraseña incorrecta"</string> <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorrecto"</string> <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Inténtalo de nuevo en <xliff:g id="NUMBER">%d</xliff:g> segundos."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="owner_name" msgid="2716755460376028154">"Propietario"</string> <string name="error_message_title" msgid="4510373083082500195">"Error"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Esta aplicación no admite cuentas de perfiles restringidos"</string> <string name="app_not_found" msgid="3429141853498927379">"No se ha encontrado ninguna aplicación que pueda realizar esta acción."</string> <string name="revoke" msgid="5404479185228271586">"Revocar"</string> </resources> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 278921599eb8..354597ba90c3 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Võimaldab rakendusel salvestada mikrofoniga heli. See luba võimaldab rakendusel salvestada heli igal ajal ilma teie kinnituseta."</string> <string name="permlab_camera" msgid="3616391919559751192">"piltide ja videote tegemine"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Võimaldab rakendusel teha kaameraga pilte ja videoid. See luba võimaldab rakendusel kasutada kaamerat mis tahes ajal teie kinnituseta."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"keela kaamera kasutamisel näidikutule kasutamine"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Lubab eelinstallitud süsteemirakendusel keelata kaamera näidikutule kasutamise."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"blokeeri tahvelarvuti jäädavalt"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"blokeeri telefon jäädavalt"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Võimaldab rakendusel kogu tahvelarvuti jäädavalt keelata. See on väga ohtlik."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Omanik"</string> <string name="error_message_title" msgid="4510373083082500195">"Viga"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"See rakendus ei toeta piiratud profiilide kontosid"</string> <string name="app_not_found" msgid="3429141853498927379">"Selle toimingu käsitlemiseks ei leitud ühtegi rakendust"</string> <string name="revoke" msgid="5404479185228271586">"Tühista"</string> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index d6344cac43c9..6bf84b6170d7 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"به برنامه اجازه میدهد صدا را با میکروفن ضبط کند. این مجوز به برنامه اجازه میدهد صدا را در هر زمان که بخواهید بدون تأیید شما ضبط کند."</string> <string name="permlab_camera" msgid="3616391919559751192">"عکسبرداری و فیلمبرداری"</string> <string name="permdesc_camera" msgid="8497216524735535009">"به برنامه اجازه میدهد با دوربین به عکسبرداری و فیلمبرداری بپردازد. این مجوز به برنامه اجازه میدهد از دوربین در هر زمانی بدون تأیید شما استفاده کند."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"LED نشانگر انتقال داده، هنگام استفاده از دوربین غیرفعال شود"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"به یک برنامه سیستم از قبل نصب شده اجازه میدهد LED نشانگر استفاده از دوربین را غیرفعال کند."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"غیر فعال کردن دائم رایانهٔ لوحی"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"تلفن بطور دائمی غیرفعال شود"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"به برنامه اجازه میدهد تا رایانهٔ لوحی را به طور کلی و دائمی غیرفعال کند. این کار بسیار خطرناک است."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"دارنده"</string> <string name="error_message_title" msgid="4510373083082500195">"خطا"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"این برنامه از حسابهای متعلق به نمایههای محدود پشتیبانی نمیکند"</string> <string name="app_not_found" msgid="3429141853498927379">"برنامهای برای انجام این عملکرد موجود نیست"</string> <string name="revoke" msgid="5404479185228271586">"لغو"</string> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 9d662ece1f37..4ddd489f97c2 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Antaa sovelluksen tallentaa ääntä mikrofonin avulla. Sovellus voi tallentaa ääntä milloin tahansa pyytämättä sinulta lupaa."</string> <string name="permlab_camera" msgid="3616391919559751192">"ota kuvia ja videoita"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Antaa sovelluksen ottaa kuvia ja kuvata videoita kameralla. Sovellus voi käyttää kameraa milloin tahansa ilman lupaasi."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"poista lähetyksen merkkivalo käytöstä, kun kameraa käytetään"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Antaa valmiiksi asennetun järjestelmäsovelluksen poistaa käytöstä kameran käytössäolon merkkivalon."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"poista tablet-laite käytöstä lopullisesti"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"poista puhelin käytöstä pysyvästi"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Antaa sovelluksen poistaa koko tablet-laitteen käytöstä lopullisesti. Tämä on hyvin vaarallista."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Nykyinen käyttäjä: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Omistaja"</string> <string name="error_message_title" msgid="4510373083082500195">"Virhe"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Tämä sovellus ei tue rajoitettujen profiilien tilejä"</string> <string name="app_not_found" msgid="3429141853498927379">"Tätä toimintoa käsittelevää sovellusta ei löydy"</string> <string name="revoke" msgid="5404479185228271586">"Peruuta"</string> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 65794e9cbd0c..b58c3f3f7572 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permet à l\'application d\'enregistrer des contenus audio à l\'aide du microphone. Cette autorisation lui donne la possibilité d\'enregistrer du contenu audio à tout moment sans votre consentement."</string> <string name="permlab_camera" msgid="3616391919559751192">"prendre des photos et enregistrer des vidéos"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Permet à l\'application de prendre des photos et de filmer des vidéos avec l\'appareil photo. Cette autorisation lui permet d\'utiliser l\'appareil photo à tout moment sans votre consentement."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"désactiver l\'indicateur d\'émission LED lorsque la caméra est en cours d\'utilisation"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permet à une application système préinstallée de désactiver l\'indicateur LED d\'utilisation de la caméra."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"désactiver définitivement la tablette"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"désactiver définitivement le téléphone"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permet à l\'application de désactiver définitivement la tablette. Cette fonctionnalité peut avoir des répercussions très sérieuses."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="owner_name" msgid="2716755460376028154">"Propriétaire"</string> <string name="error_message_title" msgid="4510373083082500195">"Erreur"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Les comptes des profils limités ne sont pas acceptés pour cette application."</string> <string name="app_not_found" msgid="3429141853498927379">"Aucune application trouvée pour gérer cette action."</string> <string name="revoke" msgid="5404479185228271586">"Révoquer"</string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 5bf5a13e276c..df153cb00b27 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"एप्लिकेशन को माइक्रोफ़ोन द्वारा ऑडियो रिकार्ड करने देता है. यह अनुमति एप्लिकेशन को आपकी पुष्टि के बिना किसी भी समय ऑडियो रिकार्ड करने देती है."</string> <string name="permlab_camera" msgid="3616391919559751192">"चित्र और वीडियो लें"</string> <string name="permdesc_camera" msgid="8497216524735535009">"एप्लिकेशन को कैमरे से चित्र और वीडियो लेने देता है. यह अनुमति एप्लिकेशन को किसी भी समय आपकी पुष्टि के बिना कैमरे का उपयोग करने देती है."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"कैमरा उपयोग में होने पर संचारण संकेतक LED अक्षम करें"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"पहले से इंस्टॉल किए गए सिस्टम एप्लिकेशन को कैमरे को संकेतक LED का उपयोग करने से अक्षम करती है."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"स्थायी रूप से टेबलेट अक्षम करें"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"फ़ोन को स्थायी रूप से अक्षम करें"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"एप्लिकेशन को संपूर्ण टेबलेट को स्थायी रूप से अक्षम करने देता है. यह बहुत खतरनाक है."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"वर्तमान उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"स्वामी"</string> <string name="error_message_title" msgid="4510373083082500195">"त्रुटि"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"यह एप्लिकेशन प्रतिबंधित प्रोफ़ाइल के खातों का समर्थन नहीं करता है"</string> <string name="app_not_found" msgid="3429141853498927379">"इस कार्यवाही को प्रबंधित करने के लिए कोई एप्लिकेशन नहीं मिला"</string> <string name="revoke" msgid="5404479185228271586">"निरस्त करें"</string> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index bebbebb36bb3..c2f6acfac9e1 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Aplikaciji omogućuje snimanje zvuka mikrofonom. Ta dozvola aplikaciji omogućuje snimanje zvuka u bilo kojem trenutku bez vašeg odobrenja."</string> <string name="permlab_camera" msgid="3616391919559751192">"snimi fotografije i videozapise"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Aplikaciji omogućuje snimanje slika i videozapisa fotoaparatom. Ta dozvola aplikaciji omogućuje upotrebu fotoaparata u bilo kojem trenutku bez vašeg odobrenja."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"onemogućavanje lampice pokazivača prijenosa kada je fotoaparat u upotrebi"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Omogućuje unaprijed instaliranim aplikacijama sustava onemogućavanje lampice pokazivača upotrebe fotoaparata."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogući tabletni uređaj"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"trajno onemogućavanje telefona"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Aplikaciji omogućuje trajno isključivanje cijelog tabletnog računala. To je vrlo opasno."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Vlasnik"</string> <string name="error_message_title" msgid="4510373083082500195">"Pogreška"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Aplikacija ne podržava račune za ograničene profile"</string> <string name="app_not_found" msgid="3429141853498927379">"Nije pronađena aplikacija za upravljanje ovom radnjom"</string> <string name="revoke" msgid="5404479185228271586">"Opozovi"</string> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 6f2e0ffc9325..38ed2ad36a44 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Lehetővé teszi az alkalmazás számára a mikrofonnal való hangfelvételt.Az engedéllyel rendelkező alkalmazás az Ön jóváhagyása nélkül, bármikor rögzíthet hanganyagot."</string> <string name="permlab_camera" msgid="3616391919559751192">"fotók és videók készítése"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Lehetővé teszi az alkalmazás számára, hogy a fényképezőgéppel fotókat és videókat készítsen. Az engedéllyel rendelkező alkalmazás bármikor, az Ön jóváhagyása nélkül használhatja a fényképezőgépet."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"átviteljelző LED letiltása, ha a kamera használatban van"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Lehetővé teszi egy előre telepített rendszeralkalmazás számára, hogy letiltsa a kamerahasználatot jelző LED-et."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"a táblagép végleges deaktiválása"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"telefon végleges letiltása"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Lehetővé teszi az alkalmazás számára, hogy teljesen deaktiválják a táblagépet. Ez nagyon veszélyes."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> az aktuális felhasználó."</string> <string name="owner_name" msgid="2716755460376028154">"Tulajdonos"</string> <string name="error_message_title" msgid="4510373083082500195">"Hiba"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Ez az alkalmazás nem támogatja a korlátozott profilokkal rendelkező fiókokat"</string> <string name="app_not_found" msgid="3429141853498927379">"Nincs megfelelő alkalmazás a művelet elvégzésére."</string> <string name="revoke" msgid="5404479185228271586">"Visszavonás"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index ed93383837ba..986a0015c81f 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Memungkinkan aplikasi merekam audio dengan mikrofon. Izin ini memungkinkan aplikasi merekam audio kapan saja tanpa konfirmasi Anda."</string> <string name="permlab_camera" msgid="3616391919559751192">"ambil gambar dan video"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Memungkinkan aplikasi mengambil gambar dan video dengan kamera. Izin ini memungkinkan aplikasi menggunakan kamera kapan saja tanpa konfirmasi Anda."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"nonaktifkan LED indikator transmisi saat kamera digunakan"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Izinkan aplikasi sistem yang sudah dipasang sebelumnya menonaktifkan LED indikator penggunaan kamera."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"noaktifkan tablet secara permanen"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"nonaktifkan ponsel secara permanen"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Mengizinkan apl menonaktifkan seluruh tablet secara permanen. Ini sangat berbahaya."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Pengguna saat ini <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Pemilik"</string> <string name="error_message_title" msgid="4510373083082500195">"Kesalahan"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Aplikasi ini tidak mendukung akun untuk profil yang dibatasi"</string> <string name="app_not_found" msgid="3429141853498927379">"Tidak ada aplikasi yang ditemukan untuk menangani tindakan ini"</string> <string name="revoke" msgid="5404479185228271586">"Cabut"</string> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 7c7e7bd210c7..b0512da36cd2 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Consente all\'applicazione di registrare audio con il microfono. Questa autorizzazione consente all\'applicazione di registrare audio in qualsiasi momento senza la tua conferma."</string> <string name="permlab_camera" msgid="3616391919559751192">"acquisizione di foto e video"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Consente all\'applicazione di scattare foto e riprendere video con la fotocamera. Questa autorizzazione consente all\'applicazione di utilizzare la fotocamera in qualsiasi momento senza la tua conferma."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"disabilitazione del LED di indicazione della trasmissione quando la fotocamera è in uso"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Consente a un\'applicazione di sistema preinstallata di disabilitare il LED che indica l\'utilizzo della fotocamera."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"disattivazione definitiva tablet"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"disattivazione telefono"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Consente all\'applicazione di disattivare l\'intero tablet in modo definitivo. Questa autorizzazione è molto pericolosa."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Proprietario"</string> <string name="error_message_title" msgid="4510373083082500195">"Errore"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Questa applicazione non supporta account relativi a profili con limitazioni"</string> <string name="app_not_found" msgid="3429141853498927379">"Nessuna applicazione trovata in grado di gestire questa azione"</string> <string name="revoke" msgid="5404479185228271586">"Revoca"</string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 16e81a02aca1..0b818d7ec0e2 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"מאפשר ליישום להקליט אודיו באמצעות המיקרופון. אישור זה מתיר ליישום להקליט אודיו בכל עת ללא אישורך."</string> <string name="permlab_camera" msgid="3616391919559751192">"צלם תמונות וסרטונים"</string> <string name="permdesc_camera" msgid="8497216524735535009">"מאפשר ליישום לצלם תמונות וסרטונים באמצעות המצלמה. אישור זה מאפשר ליישום להשתמש במצלמה בכל עת ללא אישורך."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"השבת את נורית מצב השידור כשהמצלמה בשימוש"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"מתיר ליישום מערכת המותקן מראש להשבית את השימוש של המצלמה בנורית המצב."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"השבת טאבלט לצמיתות"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"השבת טלפון לצמיתות"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"מאפשר ליישום להשבית את הטבלט כולו לצמיתות. זו הרשאה מסוכנת מאוד."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"בעלים"</string> <string name="error_message_title" msgid="4510373083082500195">"שגיאה"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"היישום הזה לא תומך בחשבונות עבור פרופילים מוגבלים"</string> <string name="app_not_found" msgid="3429141853498927379">"לא נמצא יישום שתומך בפעולה זו"</string> <string name="revoke" msgid="5404479185228271586">"בטל"</string> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index d758163b7433..e1320d8b4850 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"マイクを使った録音をアプリに許可します。これにより、アプリがいつでも確認なしで録音できるようになります。"</string> <string name="permlab_camera" msgid="3616391919559751192">"写真と動画の撮影"</string> <string name="permdesc_camera" msgid="8497216524735535009">"カメラでの写真と動画の撮影をアプリに許可します。これにより、アプリが確認なしでいつでもカメラを使用できるようになります。"</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"カメラの使用中に通信インジケータLEDを無効にする"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"カメラ使用インジケータLEDを無効にすることをプレインストールされているシステムアプリに許可します。"</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"タブレットを完全に無効化"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"端末を永続的に無効にする"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"タブレット全体を完全に無効にすることをアプリに許可します。この許可は危険です。"</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"現在のユーザーは<xliff:g id="NAME">%1$s</xliff:g>です。"</string> <string name="owner_name" msgid="2716755460376028154">"所有者"</string> <string name="error_message_title" msgid="4510373083082500195">"エラー"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"このアプリでは制限付きプロフィールのアカウントはサポートしていません"</string> <string name="app_not_found" msgid="3429141853498927379">"この操作を行うアプリが見つかりません"</string> <string name="revoke" msgid="5404479185228271586">"取り消し"</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 45b8459d40c2..6e280b6e230c 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"앱이 마이크로 오디오를 녹음할 수 있도록 허용합니다. 이 권한을 사용하면 앱이 사용자의 확인 없이 언제든지 오디오를 녹음할 수 있습니다."</string> <string name="permlab_camera" msgid="3616391919559751192">"사진과 동영상 찍기"</string> <string name="permdesc_camera" msgid="8497216524735535009">"앱이 카메라로 사진과 동영상을 찍을 수 있도록 허용합니다. 이 권한을 사용하면 앱이 언제든지 사용자의 확인 없이 카메라를 사용할 수 있습니다."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"카메라를 사용할 때 전송 표시 LED 사용 중지"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"사전 설치된 시스템 애플리케이션에서 카메라 사용 표시 LED를 사용 중지하도록 허용합니다."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"영구적으로 태블릿 사용 안함"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"휴대전화를 영구적으로 사용 중지"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"앱이 태블릿을 영구적으로 사용중지할 수 있게 합니다. 이 기능은 매우 위험합니다."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"현재 사용자는 <xliff:g id="NAME">%1$s</xliff:g>님입니다."</string> <string name="owner_name" msgid="2716755460376028154">"소유자"</string> <string name="error_message_title" msgid="4510373083082500195">"오류"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"이 애플리케이션은 제한된 프로필의 계정을 지원하지 않습니다."</string> <string name="app_not_found" msgid="3429141853498927379">"이 작업을 처리하는 애플리케이션을 찾을 수 없습니다."</string> <string name="revoke" msgid="5404479185228271586">"취소"</string> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index fbdd0d918c22..1136b7f5b027 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Leidžiama programai įrašyti garsą naudojant mikrofoną. Šis leidimas suteikia galimybę programai įrašyti garsą bet kada be jūsų patvirtinimo."</string> <string name="permlab_camera" msgid="3616391919559751192">"fotografuoti ir filmuoti"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Leidžiama programai fotografuoti ir filmuoti kamera. Šis leidimas suteikia teisę programai naudoti kamerą bet kada be jūsų patvirtinimo."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"neleisti perduoti LED indikatoriaus, kai naudojamas fotoaparatas"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Leidžiama iš anksto įdiegtai sistemos programai išjungti fotoaparato naudojimo indikatoriaus LED."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"visam laikui neleisti planšetinio kompiuterio"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"visam laikui išjungti telefoną"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Leidžiama programai visam laikui išjungti visą planšetinį kompiuterį. Tai labai pavojinga."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Savininkas"</string> <string name="error_message_title" msgid="4510373083082500195">"Klaida"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Ši programa nepalaiko apribotų profilių paskyrų"</string> <string name="app_not_found" msgid="3429141853498927379">"Nerasta programa šiam veiksmui apdoroti"</string> <string name="revoke" msgid="5404479185228271586">"Anuliuoti"</string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 2a98fd96c581..1efb916fb639 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Ļauj lietotnei ierakstīt audio, izmantojot mikrofonu. Šī atļauja ļauj lietotnei ierakstīt audio jebkurā brīdī bez jūsu apstiprinājuma."</string> <string name="permlab_camera" msgid="3616391919559751192">"uzņemt attēlus un videoklipus"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Ļauj lietotnei uzņemt attēlus un videoklipus ar kameru. Ar šo atļauju lietotne var jebkurā brīdī izmantot kameru bez jūsu apstiprinājuma."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"Atspējot pārraidīšanas LED indikatoru, kad kamera tiek izmantota"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Ļauj iepriekš instalētai sistēmas lietojumprogrammai atspējot LED indikatoru, izmantojot kameru."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"neatgriezeniski atspējot planšetdatoru"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"neatgriezeniski atspējot tālruni"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ļauj lietotnei neatgriezeniski atspējot visu planšetdatoru. Tas ir ļoti bīstami."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Īpašnieks"</string> <string name="error_message_title" msgid="4510373083082500195">"Kļūda"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Šajā lietojumprogrammā netiek atbalstīti ierobežotu profilu konti."</string> <string name="app_not_found" msgid="3429141853498927379">"Netika atrasta neviena lietojumprogramma, kas var veikt šo darbību."</string> <string name="revoke" msgid="5404479185228271586">"Atsaukt"</string> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 3f3b93d17015..8c8deb29fc5e 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Lar appen ta opp lyd med mikrofonen. Dette betyr at appen kan ta opp lyd når som helst uten at du har bedt om det."</string> <string name="permlab_camera" msgid="3616391919559751192">"ta bilder og videoer"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Lar appen ta bilder og filme med kameraet. Denne tillatelsen gjør at appen kan bruke kameraet når som helst uten bekreftelse fra deg."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"deaktiver LED-lyset for indikering av overføring når kameraet er i bruk"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Tillater at forhåndsinnstallerte systemapper deaktiverer LED-indikatoren for kamerabruk."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"deaktiver nettbrett permanent"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"deaktivere telefonen permanent"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Lar appen deaktivere hele nettbrettet permanent. Dette er svært risikabelt."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Eier"</string> <string name="error_message_title" msgid="4510373083082500195">"Feil"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Denne appen støtter ikke kontoer for begrensede profiler"</string> <string name="app_not_found" msgid="3429141853498927379">"Finner ingen apper som kan utføre denne handlingen"</string> <string name="revoke" msgid="5404479185228271586">"Opphev"</string> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 096b335e20dc..38abeda5772b 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Hiermee kan de app audio opnemen met de microfoon. Met deze toestemming kan de app op elk moment audio opnemen, zonder om uw bevestiging te vragen."</string> <string name="permlab_camera" msgid="3616391919559751192">"foto\'s en video\'s maken"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Hiermee kan de app foto\'s en video\'s maken met de camera. Met deze toestemming kan de app de camera altijd gebruiken, zonder uw bevestiging."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"indicatielampje uitschakelen wanneer camera wordt gebruikt"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Staat toe dat een vooraf geïnstalleerde systeemapp het indicatielampje voor cameragebruik uitschakelt."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"tablet permanent uitschakelen"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"telefoon permanent uitschakelen"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Hiermee kan de app de gehele tablet permanent uitschakelen. Dit is erg gevaarlijk."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Eigenaar"</string> <string name="error_message_title" msgid="4510373083082500195">"Fout"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Deze app biedt geen ondersteuning voor accounts voor beperkte profielen"</string> <string name="app_not_found" msgid="3429141853498927379">"Er is geen app gevonden om deze actie uit te voeren"</string> <string name="revoke" msgid="5404479185228271586">"Intrekken"</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 0a6442b84dfa..b529eca2815a 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Pozwala aplikacji na nagrywanie dźwięku przez mikrofon. Aplikacja z tym uprawnieniem może nagrywać dźwięk w dowolnym momencie bez Twojego potwierdzenia."</string> <string name="permlab_camera" msgid="3616391919559751192">"wykonywanie zdjęć i filmów wideo"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Pozwala aplikacji na robienie zdjęć i nagrywanie filmów przy użyciu aparatu. Aplikacja z tym uprawnieniem może użyć aparatu w dowolnym momencie bez Twojego potwierdzenia."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"wyłącz wskaźnik LED transmisji, gdy aparat jest w użyciu"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Zezwala wstępnie zainstalowanej aplikacji systemowej na wyłączenie wskaźnika LED użycia kamery."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trwałe wyłączenie tabletu"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"wyłączenie telefonu na stałe"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Pozwala aplikacji na całkowite i trwałe wyłączenie tabletu. To bardzo niebezpieczne."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Właściciel"</string> <string name="error_message_title" msgid="4510373083082500195">"Błąd"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Ta aplikacja nie obsługuje kont w przypadku profili z ograniczeniami"</string> <string name="app_not_found" msgid="3429141853498927379">"Nie znaleziono aplikacji do obsługi tej akcji"</string> <string name="revoke" msgid="5404479185228271586">"Cofnij"</string> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 50695f84acef..8335f4c8161c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite que a aplicação grave áudio com o microfone. Esta autorização permite que a aplicação grave áudio em qualquer altura sem a confirmação do utilizador."</string> <string name="permlab_camera" msgid="3616391919559751192">"tirar fotografias e vídeos"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Permite que a aplicação tire fotografias e grave vídeos com a câmara. Esta autorização permite que a aplicação utilize a câmara sem a sua confirmação em qualquer altura."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"desativar LED indicador de transmissão com a câmara em utilização"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permite que uma aplicação de sistema pré-instalada desative o LED indicador de utilização da câmara."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"desactivar tablet de forma permanente"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"desactivar telefone de forma permanente"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite que a aplicação desative definitivamente todo o tablet. Esta ação é muito perigosa."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string> <string name="owner_name" msgid="2716755460376028154">"Proprietário"</string> <string name="error_message_title" msgid="4510373083082500195">"Erro"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Esta aplicação não suporta contas de perfis restritos"</string> <string name="app_not_found" msgid="3429141853498927379">"Não foram encontradas aplicações para executar esta ação"</string> <string name="revoke" msgid="5404479185228271586">"Revogar"</string> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index d7bb939c2141..7369ae8a6ee8 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Permite aplicaţiei să efectueze înregistrări audio cu ajutorul microfonului. Cu această permisiune aplicaţia efectuează oricând înregistrări audio fără confirmare."</string> <string name="permlab_camera" msgid="3616391919559751192">"realizarea de fotografii şi videoclipuri"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Permite aplicaţiei să realizeze fotografii şi videoclipuri cu camera foto. Cu această permisiune aplicaţia utilizează camera foto oricând şi fără confirmare."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"dezactivează ledul care indică când este utilizată camera foto"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Permite unei aplicații de sistem preinstalate să dezactiveze ledul care indică utilizarea camerei foto."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"dezactivarea permanentă a computerului tablet PC"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"dezactivare permanentă a telefonului"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Permite aplicaţiei să dezactiveze definitiv întreaga tabletă. Acest lucru este foarte periculos."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Utilizator curent: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Proprietar"</string> <string name="error_message_title" msgid="4510373083082500195">"Eroare"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Această aplicație nu acceptă conturi pentru profilurile cu permisiuni limitate"</string> <string name="app_not_found" msgid="3429141853498927379">"Nicio aplicație pentru gestionarea acestei acțiuni"</string> <string name="revoke" msgid="5404479185228271586">"Revocați"</string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index d603fe45375e..5c3c0b741009 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Приложение сможет записывать аудио с помощью микрофона в любое время без уведомления."</string> <string name="permlab_camera" msgid="3616391919559751192">"Фото- и видеосъемка"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Приложение сможет снимать фотографии и видеоролики с помощью камеры в любое время без вашего разрешения."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"Отключать светодиодный индикатор во время использования камеры"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Предустановленное системное приложение сможет отключать светодиодный индикатор использования камеры."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"Выключение планшета"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"Отключение телефона"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Приложение сможет отключить все функции планшетного ПК. Это очень опасно."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Выбран аккаунт пользователя <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Владелец"</string> <string name="error_message_title" msgid="4510373083082500195">"Ошибка"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Это приложение не поддерживается в аккаунтах для профилей с ограниченным доступом"</string> <string name="app_not_found" msgid="3429141853498927379">"Невозможно обработать это действие"</string> <string name="revoke" msgid="5404479185228271586">"Отменить"</string> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index ff1fd3690bb9..06461f2c8c5c 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Umožňuje aplikácii zaznamenávať zvuk pomocou mikrofónu. Toto povolenie umožňuje aplikácii zaznamenávať zvuk kedykoľvek bez vášho potvrdenia."</string> <string name="permlab_camera" msgid="3616391919559751192">"snímanie fotografií a natáčanie videí"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Umožňuje aplikácii fotografovať a nahrávať videá pomocou fotoaparátu. Toto povolenie umožňuje aplikácii používať fotoaparát kedykoľvek a bez vášho potvrdenia."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"Zakázať indikátor LED prenosu pri používaní fotoaparátu"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Umožňuje v predinštalovanej systémovej aplikácii zakázať indikátor LED používania fotoaparátu."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trvalé zakázanie tabletu"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"trvalé vypnutie telefónu"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Umožňuje aplikácii natrvalo zakázať celý tablet. Toto je veľmi nebezpečné nastavenie."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Vlastník"</string> <string name="error_message_title" msgid="4510373083082500195">"Chyba"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Táto aplikácia nepodporuje účty pre profily s obmedzením"</string> <string name="app_not_found" msgid="3429141853498927379">"Aplikácia potrebná na spracovanie tejto akcie sa nenašla"</string> <string name="revoke" msgid="5404479185228271586">"Odvolať"</string> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 5c15457dc029..7b894e250266 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Aplikaciji omogoča snemanje zvoka z mikrofonom. S tem dovoljenjem lahko aplikacija kadar koli snema zvok brez vaše potrditve."</string> <string name="permlab_camera" msgid="3616391919559751192">"fotografiranje in snemanje videoposnetkov"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Aplikaciji omogoča fotografiranje in snemanje videoposnetkov s kamero. S tem dovoljenjem lahko aplikacija kadar koli uporablja kamero brez vaše potrditve."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"onemogoči LED-indikator prenašanja, ko je fotoaparat v uporabi"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Dovoli že nameščeni sistemski aplikaciji, da onemogoči LED-indikator uporabe fotoaparata."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"trajno onemogočenje tabličnega računalnika"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"trajno onemogočenje telefona"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Programu omogoča trajno onemogočenje celotnega tabličnega računalnika. To je zelo nevarno dejanje."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Trenutni uporabnik <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Lastnik"</string> <string name="error_message_title" msgid="4510373083082500195">"Napaka"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Ta aplikacija ne podpira računov za profile z omejitvami"</string> <string name="app_not_found" msgid="3429141853498927379">"Najdena ni bila nobena aplikacija za izvedbo tega dejanja"</string> <string name="revoke" msgid="5404479185228271586">"Prekliči"</string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 108ab6049c84..82c982d8a0a8 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Дозвољава апликацији да снима звук помоћу микрофона. Ова дозвола омогућава апликацији да снима звук у било ком тренутку без ваше потврде."</string> <string name="permlab_camera" msgid="3616391919559751192">"снимање фотографија и видео снимака"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Дозвољава апликацији да снима слике и видео снимке камером. Ова дозвола омогућава апликацији да у било ком тренутку користи камеру без ваше потврде."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"онемогући пренос LED осветљења индикатора док се камера користи"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Дозвољава унапред инсталираној системској апликацији да онемогући LED осветљење индикатора за коришћење камере."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"трајно онемогућавање таблета"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"трајно онемогућавање телефона"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Дозвољава апликацији да трајно онемогући цео таблет. Ово је веома опасно."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Актуелни корисник <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Власник"</string> <string name="error_message_title" msgid="4510373083082500195">"Грешка"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Ова апликација не подржава налоге за ограничене профиле"</string> <string name="app_not_found" msgid="3429141853498927379">"Није пронађена ниједна апликација која би могла да обави ову радњу"</string> <string name="revoke" msgid="5404479185228271586">"Опозови"</string> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 71bd390ec5a3..cfeef376227e 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Tillåter att appen spelar in ljud med mikrofonen. Med den här behörigheten tillåts appen att spela in ljud när som helst utan ditt godkännande."</string> <string name="permlab_camera" msgid="3616391919559751192">"ta bilder och spela in videoklipp"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Tillåter att appen tar bilder och spelar in videor med kameran. Med den här behörigheten tillåts appen att använda kameran när som helst utan ditt godkännande."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"inaktivera LED-sändningsindikator när kameran används"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Tillåter att en förinstallerad systemapp inaktiverar LED-indikatorn för kameranvändning."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"inaktivera surfplattan permanent"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"inaktivera telefonen permanent"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Tillåter att appen inaktiverar hela surfplattan permanent. Detta är mycket farligt."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Nuvarande användare: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Ägare"</string> <string name="error_message_title" msgid="4510373083082500195">"Fel"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Den här appen stöder inte konton för begränsade profiler"</string> <string name="app_not_found" msgid="3429141853498927379">"Ingen app som kan hantera åtgärden hittades"</string> <string name="revoke" msgid="5404479185228271586">"Återkalla"</string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index c9570d993502..6862ed565a8f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -156,7 +156,7 @@ <string name="global_action_power_off" msgid="4471879440839879722">"Zima simu"</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 yako ya sasa ya kifaa, ili kutuma ujumbe wa barua pepe. Itachukua muda mfupi kuanza ripoti ya hitilafu mpaka itakapokuwa tayari kutumwa; tafadhali vumilia."</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> <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mtindo wa kimya"</string> <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sauti Imezimwa"</string> <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imewashwa"</string> @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Inaruhusu programu kurekodi sauti kwa kinasa sauti. Idhini hii inaruhusu programu kurekodi sauti wakati wowote bila ya uthibitisho wako."</string> <string name="permlab_camera" msgid="3616391919559751192">"Kupiga picha na kurekodi video"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Inaruhusu programu kupiga picha na video kwa kamera. Kibali hiki kinaruhusu programu kutumia kamera kwa wakati wowote bila uthibitisho wako."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"zima LED ya kisambaza kiashirio wakati kamera inatumika"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Huruhusu mfumo wa programu iliyosakinishwa awali kuzima kamera isitumie kiashirio cha LED."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"zima kompyuta ndogo kabisa"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"simu iliyolemazwa kabisa"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Inaruhusu programu kulemaza kompyuta yote kibao kabisa. Hii ni hatari sana."</string> @@ -557,7 +555,7 @@ <string name="permdesc_manageAccounts" msgid="8698295625488292506">"Inaruhusu programu kutekeleza shughuli kama vile kuongeza na kutoa akaunti, na kufuta manenosiri yazo."</string> <string name="permlab_useCredentials" msgid="235481396163877642">"tumia akaunti kwenye kifaa"</string> <string name="permdesc_useCredentials" msgid="7984227147403346422">"Inaruhusu programu kuomba shuhuda za uthibitisho."</string> - <string name="permlab_accessNetworkState" msgid="4951027964348974773">"ona miunganisho ya mtandao"</string> + <string name="permlab_accessNetworkState" msgid="4951027964348974773">"Kuangalia mitandao"</string> <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Inaruhusu programu kuona taarifa kuhusu miunganisho ya mtandao kama vile mitandao ipi iliyopo na imeunganishwa."</string> <string name="permlab_createNetworkSockets" msgid="8018758136404323658">"ufikiaji kamili wa mtandao"</string> <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Inaruhusu programu kuunda soketi za mtandao na kutumia itifaki za mtandao maalum. Kivinajri na programu nyingine zilizotolewa zinamaanisha kutuma data kwenye mtandao, kwa hivyo kibali hiki hakihitajiki kutuma data kwenye mtandao."</string> @@ -1486,15 +1484,14 @@ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Umekosea kuchora mchoro wako wa kufungua mara <xliff:g id="NUMBER_0">%d</xliff:g>. Baada ya majaribio <xliff:g id="NUMBER_1">%d</xliff:g> yasiyofaulu, utaombwa kufungua simu yako kwa kutumia akaunti ya barua pepe."\n\n" Jaribu tena baada ya sekunde <xliff:g id="NUMBER_2">%d</xliff:g>."</string> <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string> <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ondoa"</string> - <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Iongeza sauti zaidi ya kiwango kinachopendekezwa?"\n"Kusikiliza kwa sauti ya juu kwa muda mrefu kunaweza kuharibu uwezo wako wa kusikia."</string> + <string name="safe_media_volume_warning" product="default" msgid="7324161939475478066">"Ungependa kuongeza sauti kupita kiwango kinachopendekezwa?"\n"Kusikiliza kwa sauti ya juu kwa muda mrefu kunaweza kuharibu uwezo wako wa kusikia."</string> <string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Endelea kushikilia chini kwa vidole vyako viwili ili kuwezesha ufikivu."</string> <string name="accessibility_enabled" msgid="1381972048564547685">"Ufikivu umewezeshwa."</string> <string name="enable_accessibility_canceled" msgid="3833923257966635673">"Ufikivu umeghairiwa."</string> <string name="user_switched" msgid="3768006783166984410">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Mmiliki"</string> <string name="error_message_title" msgid="4510373083082500195">"Hitilafu"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Programu hii haiwezi kutumiwa na akaunti za wasifu zilizowekewa vikwazo"</string> <string name="app_not_found" msgid="3429141853498927379">"Hakuna programu iliyopatikana ili kushughulikia kitendo hiki"</string> <string name="revoke" msgid="5404479185228271586">"Batilisha"</string> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 96763196cb84..c7f025c29c12 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"อนุญาตให้แอปพลิเคชันบันทึกเสียงด้วยไมโครโฟน การอนุญาตนี้ทำให้แอปพลิเคชันสามารถบันทึกเสียงได้ทุกเมื่อโดยไม่ต้องรอการยืนยันจากคุณ"</string> <string name="permlab_camera" msgid="3616391919559751192">"ถ่ายภาพและวิดีโอ"</string> <string name="permdesc_camera" msgid="8497216524735535009">"อนุญาตให้แอปพลิเคชันถ่ายภาพและวิดีโอด้วยกล้องถ่ายรูปนี้ การอนุญาตนี้จะทำให้แอปพลิเคชันสามารถใช้กล้องถ่ายรูปได้ทุกเมื่อโดยไม่ต้องรอการยืนยันจากคุณ"</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"ปิดไฟสัญญาณ LED เมื่อใช้งานกล้อง"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"อนุญาตให้แอปพลิเคชันระบบที่ติดตั้งล่วงหน้าปิดไฟสัญญาณ LED ของกล้อง"</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"ปิดการใช้งานแท็บเล็ตอย่างถาวร"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"ปิดการใช้งานโทรศัพท์ถาวร"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"อนุญาตให้แอปพลิเคชันปิดใช้งานแท็บเล็ตทั้งเครื่องอย่างถาวร การดำเนินการนี้เป็นอันตรายอย่างยิ่ง"</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="owner_name" msgid="2716755460376028154">"เจ้าของ"</string> <string name="error_message_title" msgid="4510373083082500195">"ข้อผิดพลาด"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"แอปพลิเคชันนี้ไม่สนับสนุนบัญชีที่มีโปรไฟล์ที่ถูกจำกัด"</string> <string name="app_not_found" msgid="3429141853498927379">"ไม่พบแอปพลิเคชันสำหรับการทำงานนี้"</string> <string name="revoke" msgid="5404479185228271586">"เพิกถอน"</string> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 3e6c02e55263..b594c5850a26 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Pinapayagan ang app na mag-record ng audio gamit ang mikropono. Pinapayagan ng pahintulot na ito ang app na mag-record ng audio anumang oras nang wala ng iyong kumpirmasyon."</string> <string name="permlab_camera" msgid="3616391919559751192">"kumuha ng mga larawan at video"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Pinapayagan ang app na kumuha ng mga larawan at video gamit ang camera. Pinapayagan ng pahintulot na ito ang app na gamitin ang camera anumang oras nang wala ng iyong kumpirmasyon."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"i-disable ang LED na tagapagpahiwatig kapag ginagamit ang camera"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Pinapayagan ang isang paunang na-install na application ng system na i-disable ang LED na tagapagpahiwatig ng paggamit sa camera."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"permanenteng huwag paganahin ang tablet"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"permanenteng huwag paganahin ang telepono"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Pinapayagan ang app na huwag paganahin nang permanente ang buong tablet. Lubos itong mapanganib."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Kasalukuyang user <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"May-ari"</string> <string name="error_message_title" msgid="4510373083082500195">"Error"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Hindi sinusuportahan ng application na ito ang mga account para sa mga pinaghihigpitang profile"</string> <string name="app_not_found" msgid="3429141853498927379">"Walang nakitang application na mangangasiwa sa pagkilos na ito"</string> <string name="revoke" msgid="5404479185228271586">"Bawiin"</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 9ecb5eccf748..a8d374bac06d 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Uygulamaya mikrofonla ses kaydetme izni verir. Bu izin, uygulamanın istediği zaman onayınız olmadan ses kaydetmesine olanak sağlar."</string> <string name="permlab_camera" msgid="3616391919559751192">"resim çekme ve görüntü kaydetme"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Uygulamaya kamerayla fotoğraf ve video çekme izni verir. Bu izin, uygulamanın sizin onayınız olmadan istediği zaman kamerayı kullanmasına olanak sağlar."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"Kamera kullanımda iken iletim göstergesi LED\'ini devre dışı bırak"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Önceden yüklenmiş bir sistem uygulamasına kamera kullanım göstergesi LED\'ini devre dışı bırakma izni verir."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"tableti kalıcı olarak devre dışı bırak"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"telefonu tamamen devre dışı bırak"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Uygulamaya, tüm tableti kalıcı olarak devre dışı bırakma izni verir. Bu çok tehlikelidir."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Geçerli kullanıcı: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Sahibi"</string> <string name="error_message_title" msgid="4510373083082500195">"Hata"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Bu uygulama kısıtlanmış profillerin hesaplarını desteklemez"</string> <string name="app_not_found" msgid="3429141853498927379">"Bu eylemi gerçekleştirecek bir uygulama bulunamadı"</string> <string name="revoke" msgid="5404479185228271586">"İptal et"</string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 5092eed6394f..ecb0c306ce80 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Дозволяє програмі записувати звук за допомогою мікрофона. Такий дозвіл дає програмі змогу будь-коли записувати звук без вашого підтвердження."</string> <string name="permlab_camera" msgid="3616391919559751192">"фотограф. та знімати відео"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Дозволяє програмі фотографувати та знімати відео за допомогою камери. Такий дозвіл дає програмі змогу будь-коли використовувати камеру без вашого підтвердження."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"вимикати світлодіодний індикатор передавання, коли використовується камера"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Дозволяє попередньо встановленій системній програмі вимикати світлодіодний індикатор використання камери."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"остаточно вимкнути пристрій"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"остаточно вимкнути телефон"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Дозволяє програмі назавжди вимикати весь планшетний ПК. Це дуже небезпечно."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Власник"</string> <string name="error_message_title" msgid="4510373083082500195">"Помилка"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Ця програма не підтримує облікові записи для обмежених профілів"</string> <string name="app_not_found" msgid="3429141853498927379">"Не знайдено програму для обробки цієї дії"</string> <string name="revoke" msgid="5404479185228271586">"Анулювати"</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index ce77b3977553..ac75d9d89a5b 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Cho phép ứng dụng ghi âm bằng micrô. Quyền này cho phép ứng dụng ghi âm bất kỳ lúc nào mà không cần sự xác nhận của bạn."</string> <string name="permlab_camera" msgid="3616391919559751192">"chụp ảnh và quay video"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Cho phép ứng dụng chụp ảnh và quay video bằng máy ảnh. Quyền này cho phép ứng dụng sử dụng máy ảnh bất kỳ lúc nào mà không cần sự xác nhận của bạn."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"vô hiệu hóa tính năng phát đèn LED chỉ báo khi máy ảnh đang được sử dụng"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Cho phép cài đặt trước ứng dụng hệ thống để vô hiệu hóa việc máy ảnh sử dụng đèn LED chỉ báo."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"vô hiệu hóa vĩnh viễn máy tính bảng"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"vĩnh viễn vô hiệu hóa điện thoại"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Cho phép ứng dụng vô hiệu hóa vĩnh viễn toàn bộ máy tính bảng. Điều này rất nguy hiểm."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Người dùng hiện tại <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Chủ sở hữu"</string> <string name="error_message_title" msgid="4510373083082500195">"Lỗi"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Ứng dụng này không hỗ trợ tài khoản cho các tiểu sử bị hạn chế"</string> <string name="app_not_found" msgid="3429141853498927379">"Không tìm thấy ứng dụng nào để xử lý tác vụ này"</string> <string name="revoke" msgid="5404479185228271586">"Thu hồi"</string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 6f20ad7345d9..140dbfbf9254 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -312,7 +312,7 @@ <string name="permlab_stopAppSwitches" msgid="4138608610717425573">"禁止切换应用"</string> <string name="permdesc_stopAppSwitches" msgid="8262195802582255021">"阻止用户切换到其他应用。"</string> <string name="permlab_getTopActivityInfo" msgid="2537922311411546016">"获取当前应用的信息"</string> - <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"允许应用针对目前在屏幕前台运行的应用检索相关隐私信息。"</string> + <string name="permdesc_getTopActivityInfo" msgid="2512448855496067131">"允许应用检索目前在屏幕前台运行的应用专有的信息。"</string> <string name="permlab_runSetActivityWatcher" msgid="892239094867182656">"监控所有应用的启动"</string> <string name="permdesc_runSetActivityWatcher" msgid="6003603162578577406">"允许应用监视和控制系统是如何启动活动的。恶意应用可能会完全破坏系统。此权限只有在进行开发时才需要,正常使用情况下绝不需要。"</string> <string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"发送包删除的广播"</string> @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"允许该应用使用麦克风录制音频。此权限可让该应用不经您的确认即可随时录制音频。"</string> <string name="permlab_camera" msgid="3616391919559751192">"拍摄照片和视频"</string> <string name="permdesc_camera" msgid="8497216524735535009">"允许该应用使用相机拍摄照片和视频。此权限可让该应用随时使用相机,而无需您的确认。"</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"在相机使用过程中停用传输指示灯 LED"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"允许预装的系统应用禁止相机使用指示灯 LED。"</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"永久停用平板电脑"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"永久停用手机"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"允许应用永久停用整个平板电脑,但这样非常危险。"</string> @@ -627,7 +625,7 @@ <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"允许应用管理网络政策和定义专门针对应用的规则。"</string> <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"修改网络使用情况记录方式"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"允许该应用修改对于各应用的网络使用情况的统计方式。普通应用不应使用此权限。"</string> - <string name="permlab_accessNotifications" msgid="7673416487873432268">"查看通知"</string> + <string name="permlab_accessNotifications" msgid="7673416487873432268">"访问通知"</string> <string name="permdesc_accessNotifications" msgid="458457742683431387">"允许该应用检索、检查并清除通知,包括其他应用发布的通知。"</string> <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"绑定到通知侦听器服务"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"允许应用绑定到通知侦听器服务的顶级接口(普通应用绝不需要此权限)。"</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string> <string name="owner_name" msgid="2716755460376028154">"机主"</string> <string name="error_message_title" msgid="4510373083082500195">"错误"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"此应用不支持受限个人资料的帐户"</string> <string name="app_not_found" msgid="3429141853498927379">"找不到可处理此操作的应用"</string> <string name="revoke" msgid="5404479185228271586">"撤消"</string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index b8db6e8de518..aaa4c2fe50df 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"允許應用程式使用麥克風錄音。這項權限可讓應用程式隨時錄音,不需經過您的確認。"</string> <string name="permlab_camera" msgid="3616391919559751192">"拍攝相片和影片"</string> <string name="permdesc_camera" msgid="8497216524735535009">"允許應用程式使用相機拍照和錄影。這項權限可讓應用程式隨時使用相機,而不需請求您進行確認。"</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"使用攝影機時停用傳輸指示器 LED"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"允許預先安裝的系統應用程式停用攝影機指示器 LED。"</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"永久停用平板電腦"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"永久停用電話"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"允許應用程式永久停用平板電腦所有功能 (這類權限具有高度風險)。"</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"目前的使用者是 <xliff:g id="NAME">%1$s</xliff:g>。"</string> <string name="owner_name" msgid="2716755460376028154">"擁有者"</string> <string name="error_message_title" msgid="4510373083082500195">"錯誤"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"這個應用程式不支援設有限制的個人資料所屬帳戶"</string> <string name="app_not_found" msgid="3429141853498927379">"找不到支援此操作的應用程式"</string> <string name="revoke" msgid="5404479185228271586">"撤銷"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 8dedd357f27d..f69f44ac906a 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -468,10 +468,8 @@ <string name="permdesc_recordAudio" msgid="4906839301087980680">"Ivumela uhlelo lokusebenza ukurekhoda umsindo nge-microphone. Le mvume ivumela uhlelo lokusebenza ukuqopha umsindo noma kunini ngaphandle kokuqinisekisa kwakho."</string> <string name="permlab_camera" msgid="3616391919559751192">"thatha izithombe namavidiyo"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Ivumela uhlelo lokusebenza ukuthatha izithombe namavidiyo ngekhamera. Le mvume ivumela uhlelo lokusebenza ukusebenzisa ikhamera nganoma isiphi isikhathi ngaphandle kwemvume yakho."</string> - <!-- no translation found for permlab_cameraDisableTransmitLed (2651072630501126222) --> - <skip /> - <!-- no translation found for permdesc_cameraDisableTransmitLed (4764585465480295341) --> - <skip /> + <string name="permlab_cameraDisableTransmitLed" msgid="2651072630501126222">"khubaza i-LED yesikhombi sokudlulisa uma ikhamera isebenza"</string> + <string name="permdesc_cameraDisableTransmitLed" msgid="4764585465480295341">"Ivumela isistimu efakwe ngaphambili yohlelo lokusebenza ukuze ikhubaze i-LED yesikhombi sokusetshenziswa kwekhamera."</string> <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"vimbela ngokuphelele ithebhulethi"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"ngokwaphakade vimbela ifoni"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"Ivumela uhlelo lokusebenza ukuvimbela yonke ithebhulethi ngokuphelele. Lokhu kuyingozi kakhulu."</string> @@ -1493,8 +1491,7 @@ <string name="user_switched" msgid="3768006783166984410">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string> <string name="owner_name" msgid="2716755460376028154">"Umnikazi"</string> <string name="error_message_title" msgid="4510373083082500195">"Iphutha"</string> - <!-- no translation found for app_no_restricted_accounts (4011285085817350390) --> - <skip /> + <string name="app_no_restricted_accounts" msgid="4011285085817350390">"Lolu hlelo lokusebenza alusekeli ama-akhawunti wamaphrofayela akhawulelwe"</string> <string name="app_not_found" msgid="3429141853498927379">"Alukho uhlelo lokusebenza olutholakele lokuphatha lesi senzo"</string> <string name="revoke" msgid="5404479185228271586">"Chitha"</string> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 5c772b2e99fa..0313308c4a5b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1108,4 +1108,20 @@ stream or master volumes. --> <bool name="config_useFixedVolume">false</bool> + <!-- The list of IMEs which should be disabled until used. + This function suppresses update notifications for these pre-installed apps. + We need to set this configuration carefully that they should not have functionarities + other than "IME" or "Spell Checker". In InputMethodManagerService, + the listed IMEs are disabled until used when all of the following conditions are met. + 1. Not selected as an enabled IME in the Settings + 2. Not selected as a spell checker in the Settings + 3. Installed + 4. A pre-installed IME + 5. Not enabled + And the disabled_until_used state for an IME is released by InputMethodManagerService + when the IME is selected as an enabled IME. --> + <string-array name="config_disabledUntilUsedPreinstalledImes" translatable="false"> + <item>com.android.inputmethod.latin</item> + </string-array> + </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 2158e90779f7..6a3bdaa3282f 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -919,6 +919,7 @@ <java-symbol type="array" name="special_locale_names" /> <java-symbol type="array" name="config_masterVolumeRamp" /> <java-symbol type="array" name="config_cdma_dun_supported_types" /> + <java-symbol type="array" name="config_disabledUntilUsedPreinstalledImes" /> <java-symbol type="drawable" name="default_wallpaper" /> <java-symbol type="drawable" name="indicator_input_error" /> diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml index 3e3b12d06c49..d89934f33a2f 100644 --- a/docs/html/_redirects.yaml +++ b/docs/html/_redirects.yaml @@ -266,6 +266,9 @@ redirects: - from: /training/cloudsync/aesync.html to: /google/gcm/index.html +- from: /training/basics/location/... + to: /training/location/... + # -------------------- MISC ---------------------- - from: /shareables/... diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd index e17a0fd84c89..6956634a9f28 100644 --- a/docs/html/about/dashboards/index.jd +++ b/docs/html/about/dashboards/index.jd @@ -57,7 +57,7 @@ Platform Versions</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 14-day period ending on April 2, 2013. +<p style="clear:both"><em>Data collected during a 14-day period ending on May 1, 2013. <br/>Any versions with less than 0.1% distribution are not shown.</em> </p> @@ -83,7 +83,7 @@ Screens</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 14-day period ending on April 2, 2013 +<p style="clear:both"><em>Data collected during a 14-day period ending on May 1, 2013 <br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p> @@ -102,7 +102,7 @@ support for any lower version (for example, support for version 2.0 also implies <img alt="" style="float:right" -src="//chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b,6fad0c&chl=GL%201.1%20only|GL%202.0%20%26%201.1&chd=t%3A0.3,99.7&chf=bg,s,00000000" /> +src="//chart.googleapis.com/chart?cht=p&chs=400x250&chco=c4df9b,6fad0c&chl=GL%201.1%20only|GL%202.0%20%26%201.1&chd=t%3A0.2,99.8&chf=bg,s,00000000" /> <p>To declare which version of OpenGL ES your application requires, you should use the {@code android:glEsVersion} attribute of the <a @@ -120,17 +120,17 @@ uses.</p> </tr> <tr> <td>1.1 only</th> -<td>0.3%</td> +<td>0.2%</td> </tr> <tr> <td>2.0 & 1.1</th> -<td>99.7%</td> +<td>99.8%</td> </tr> </table> -<p style="clear:both"><em>Data collected during a 14-day period ending on April 2, 2013</em></p> +<p style="clear:both"><em>Data collected during a 14-day period ending on May 1, 2013</em></p> @@ -148,7 +148,7 @@ uses.</p> var VERSION_DATA = [ { - "chart": "//chart.googleapis.com/chart?chf=bg%2Cs%2C00000000&chd=t%3A1.8%2C4.0%2C39.8%2C0.2%2C29.3%2C25.0&chl=Eclair%7CFroyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean&chs=500x250&cht=p&chco=c4df9b%2C6fad0c", + "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chf=bg%2Cs%2C00000000&chd=t%3A1.8%2C3.7%2C38.5%2C0.1%2C27.5%2C28.4&chco=c4df9b%2C6fad0c&chl=Eclair%7CFroyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean", "data": [ { "api": 4, @@ -163,7 +163,7 @@ var VERSION_DATA = { "api": 8, "name": "Froyo", - "perc": "4.0" + "perc": "3.7" }, { "api": 9, @@ -173,27 +173,27 @@ var VERSION_DATA = { "api": 10, "name": "Gingerbread", - "perc": "39.7" + "perc": "38.4" }, { "api": 13, "name": "Honeycomb", - "perc": "0.2" + "perc": "0.1" }, { "api": 15, "name": "Ice Cream Sandwich", - "perc": "29.3" + "perc": "27.5" }, { "api": 16, "name": "Jelly Bean", - "perc": "23.0" + "perc": "26.1" }, { "api": 17, "name": "Jelly Bean", - "perc": "2.0" + "perc": "2.3" } ] } @@ -205,34 +205,35 @@ var VERSION_DATA = var SCREEN_DATA = [ + { "data": { "Large": { - "hdpi": "0.5", - "ldpi": "0.7", - "mdpi": "2.7", + "hdpi": "0.4", + "ldpi": "0.6", + "mdpi": "2.9", "tvdpi": "1.0", - "xhdpi": "0.8" + "xhdpi": "0.7" }, "Normal": { - "hdpi": "37.9", + "hdpi": "37.3", "ldpi": "0.1", "mdpi": "16.1", - "xhdpi": "25.0", - "xxhdpi": "0.8" + "xhdpi": "24.9", + "xxhdpi": "1.3" }, "Small": { - "ldpi": "9.5" + "ldpi": "9.8" }, "Xlarge": { "hdpi": "0.1", - "ldpi": "0.1", - "mdpi": "4.6", + "ldpi": "0.2", + "mdpi": "4.5", "xhdpi": "0.1" } }, - "densitychart": "//chart.googleapis.com/chart?chf=bg%2Cs%2C00000000&chd=t%3A10.4%2C23.4%2C1.0%2C38.5%2C25.9%2C0.8&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chs=400x250&cht=p&chco=c4df9b%2C6fad0c", - "layoutchart": "//chart.googleapis.com/chart?chf=bg%2Cs%2C00000000&chd=t%3A4.9%2C5.7%2C79.9%2C9.5&chl=Xlarge%7CLarge%7CNormal%7CSmall&chs=400x250&cht=p&chco=c4df9b%2C6fad0c" + "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chf=bg%2Cs%2C00000000&chd=t%3A10.7%2C23.5%2C1.0%2C37.8%2C25.7%2C1.3&chco=c4df9b%2C6fad0c&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi", + "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chf=bg%2Cs%2C00000000&chd=t%3A4.9%2C5.6%2C79.7%2C9.8&chco=c4df9b%2C6fad0c&chl=Xlarge%7CLarge%7CNormal%7CSmall" } ]; diff --git a/docs/html/google/google_toc.cs b/docs/html/google/google_toc.cs index 81982a130e65..fa9b9c98b70c 100644 --- a/docs/html/google/google_toc.cs +++ b/docs/html/google/google_toc.cs @@ -27,19 +27,24 @@ <li><a href="<?cs var:toroot?>google/play-services/setup.html"> <span class="en">Setup</span></a> </li> - - <li><a href="<?cs var:toroot?>google/play-services/auth.html"> - <span class="en">Authorization</span></a> + <li><a href="<?cs var:toroot?>google/play-services/games.html"> + <span class="en">Games</span></a> </li> - <li><a href="<?cs var:toroot?>google/play-services/plus.html"> <span class="en">Google+</span></a> </li> - <li><a href="<?cs var:toroot?>google/play-services/maps.html"> <span class="en">Google Maps</span></a> </li> - + <li><a href="<?cs var:toroot?>google/play-services/location.html"> + <span class="en">Location</span></a> + </li> + <li><a href="<?cs var:toroot?>google/play-services/gcm.html"> + <span class="en">GCM</span></a> + </li> + <li><a href="<?cs var:toroot?>google/play-services/auth.html"> + <span class="en">Authorization</span></a> + </li> <li id="gms-tree-list" class="nav-section"> <div class="nav-section-header"> <a href="<?cs var:toroot ?>reference/gms-packages.html"> diff --git a/docs/html/google/play-services/games.jd b/docs/html/google/play-services/games.jd new file mode 100644 index 000000000000..8555b9495be8 --- /dev/null +++ b/docs/html/google/play-services/games.jd @@ -0,0 +1,69 @@ +page.title=Google Play Games +header.hide=1 + +@jd:body + +<div class="landing-banner"> + +<div class="col-6"> + <img src="{@docRoot}images/google/game_services.png" alt=""> +</div> +<div class="col-6"> + +<h1 itemprop="name" style="margin-bottom:0;">Google Play Games Platform Services</h1> + <p itemprop="description"> + Google Play Games Platform Services lets you integrate popular gaming features such as achievements, leaderboards, and real-time multiplayer gameplay in your apps. Players can sign in using their Google+ identities and share their gaming experience with friends. + </p> + <p>Visit <a class="external-link" + href="https://developers.google.com/games/services/">developers.google.com/games/services</a> for more information about integrating game services into your app. +</p> +</div> +</div> + +<div class="landing-docs"> + <div class="col-6 normal-links"> + <h3 style="clear:left">Key Developer Features</h3> + <h4>Drive engagement with leaderboards</h4> + <p>Let players compare scores with friends using leaderboards or see how they rank against other players worldwide. Games Platform Services automatically maintains daily, weekly, and all-time high scores. <a class="external-link" href="https://developers.google.com/games/services/android/leaderboards">Build leaderboards</a>.</p> + + <h4>Reward players with achievements</h4> + <p>Add hidden and incremental achievements to encourage users to explore your game in new and interesting ways. You can use the built-in UI for Android to display achievement progress. + <a class="external-link" href="https://developers.google.com/games/services/android/achievements">Add achievements to your game</a>.</p> + </a> + + <h4>Create real-time multiplayer games</h4> + <p>Make your game more dynamic by letting multiple players compete or cooperate simultaneously. You can use the Games Platform Services API to invite game participants or auto-match players anonymously, and exchange data between game clients. <a class="external-link" href="https://developers.google.com/games/services/android/multiplayer">Develop real-time multiplayer games</a>.</p> + + <h4>Save game progress to the cloud</h4> + <p>Store game data on Google servers using Cloud Save. Synchronize game progress seamlessly across all your users' devices. <a class="external-link" href="https://developers.google.com/games/services/android/cloudsave">Save games in the cloud</a>.</p> + </div> + + + <div class="col-6 normal-links"> + <h3 style="clear:left">Getting Started</h3> + <h4>1. Get the Google Play services SDK</h4> + <p>The Games Platform Services API for Android is part of the Google Play services platform.</p> + <p>To use game services, <a href="{@docRoot}google/play-services/setup.html">set up</a> + the Google Play services SDK. Then, see the <a class="external-link" + href="https://developers.google.com/games/services/android/quickstart"> + Getting Started guide</a> to set up your app. + </p> + + <h4>2. Run the sample</h4> + + <p>Once you've installed the Google Play services package, <a class="external-link" + href="https://developers.google.com/games/services/downloads/">download the game services samples</a> to learn how to use the major components of the Games Platform Services APIs. + </p> + + <h4>3. Read the documentation</h4> + + <p>Read the <a class="external-link" href="https://developers.google.com/games/services/terms"> + API Terms of Service</a>.</p> + <p>Detailed documentation for the Games Platform Services is available at <a class="external-link" + href="https://developers.google.com/games/services/">developers.google.com/games/services</a>. + </p> + <p>For quick access while developing your Android apps, the + <a href="{@docRoot}reference/com/google/android/gms/games/package-summary.html">Games Platform Services API for Android reference</a> is available here on developer.android.com.</p> + </div> + +</div> diff --git a/docs/html/google/play-services/gcm.jd b/docs/html/google/play-services/gcm.jd new file mode 100644 index 000000000000..67b55ea30678 --- /dev/null +++ b/docs/html/google/play-services/gcm.jd @@ -0,0 +1,69 @@ +page.title=GCM Extensions for Android +page.tags="cloud","push","messaging" +header.hide=1 +@jd:body + +<div class="landing-banner"> + +<div class="col-6"> + <img src="" alt=""> +</div> +<div class="col-6"> + + <h1 itemprop="name" style="margin-bottom:0;">GCM Extensions for Android</h1> + <p itemprop="description"> +GCM extension APIs make it easier to take advantage of enhanced messaging capabilities in your apps, and they can help you simplify your implementation of Google Cloud Messaging.</p> + +<p>You can use GCM extensions in any new or existing GCM implementation to build powerful multi-device messaging and presence features for your users.</p> + +</div> +</div> + + +<div class="landing-docs"> + <div class="col-6 normal-links"> + <h3 style="clear:left">Key Developer Features</h3> + + <h4>Faster, easier GCM setup</h4> + <p>Streamlined registration makes it simple and fast to add GCM support to your Android app. <a href="{@docRoot}google/play-services/gcm/gs.html">Learn more »</a></p> + + + <h4>Bidirectional messaging over XMPP</h4> + <p>GCM's Cloud Connection Service (CCS) lets you communicate with Android devices over a persistent XMPP connection. Communication is asynchronous and bidirectional, and you can use the service in tandem with existing GCM APIs. You can use <a href="https://services.google.com/fb/forms/gcm/">this form</a> to sign up for CCS. <a href="{@docRoot}google/gcm/ccs.html">Learn more »</a></p> + + <!-- <p>To get started, sign up using <a href="https://services.google.com/fb/forms/gcm/">this form</a> and then learn how to <a href="{@docRoot}google/gcm/ccs.html">send XMPP messages</a>.</p> --> + + <h4>Seamless multi-device messaging</h4> + <p>New user notifications let you send a single message simultaneously to all of a user's Android devices. </p> + + <p>GCM lets you map all of a user's multiple devices to a single notification key, which you can then reference as the target for messages that you are sending to that user. + <a href="{@docRoot}google/gcm/notifications.html">Learn more »</a></p> + </a> + + + </div> + + + <div class="col-6 normal-links"> + <h3 style="clear:left">Getting Started</h3> + <h4>1. Get the Google Play services SDK</h4> + <p>The GCM Extension APIs are part of the Google Play services platform. To use the APIs, <a href="{@docRoot}google/play-services/setup.html">set up + the Google Play services SDK</a>. + </p> + + <h4>2. Create a Google APIs project</h4> + + <p>To use GCM, you need to set up a Google APIs project and get an application key. If you are already using GCM, you can use your existing project and key. <a href="{@docRoot}google/play-services/gcm/gs.html#google_apis">Learn more »</a></p> + + <h4>3. Set up GCM in your app</h4> + + <p>To send and receive messages over GCM, you need to update the manifest and add code to register with GCM and handle messages. See <a href="{@docRoot}google/play-services/gcm/gs.html#manifest">Get Started</a> for details. + </p> + + <h4>4. Integrate GCM with your backend servers</h4> + + <p>A complete GCM implementation requires a server-side implementation, in addition to the client implementation in your app. For complete information, make sure to read the <a href="{@docRoot}google/gcm/index.html">Google Cloud Messaging documentation</a>. + + </div> + +</div> diff --git a/docs/html/google/play-services/location.jd b/docs/html/google/play-services/location.jd new file mode 100644 index 000000000000..430aaeb298e6 --- /dev/null +++ b/docs/html/google/play-services/location.jd @@ -0,0 +1,89 @@ +page.title=Location APIs +page.tags="location","geofence", "geofencing", "activity recognition", "activity detection", "gps" +header.hide=1 +@jd:body + + + <div class="landing-banner"> + +<div class="col-6"> + <img src="{@docRoot}images/google/gps-location.png" alt="Location APIs Logo"> +</div> + +<div class="col-6"> + +<h1 itemprop="name" style="margin-bottom:0;">Location APIs</h1> +<p itemprop="description"> + The location APIs make it easy for you to build location-aware applications, without needing to + focus on the details of the underlying location technology. They also let you minimize + power consumption by using all of the capabilities of the device hardware. +</p> + +<p> + To get started, first <a href="{@docRoot}google/play-services/setup.html">set up</a> + the Google Play services SDK. You can learn how to use the APIs in the training + class <a href="{@docRoot}training/basics/location/index.html">Making Your App Location Aware</a>, + and details are available in the <a href="{@docRoot}reference/com/google/android/location/package-summary.html">Location API reference</a>. To look at a code example, <a href="">download the sample app</a>. +</p> +</div> +</div> +<div class="landing-docs"> + <h3 style="clear:left">Key Developer Features</h3> + <div class="layout-content-row"> + <div class="layout-content-col span-6"> + + + +<h4 style="font-weight:bold">Fused location provider</h4> +<ul> + <li> + <em>Simple APIs</em>: Lets you specify high-level needs like "high accuracy" or "low power", instead of + having to worry about location providers. + </li> + <li> + <em>Always-on location</em>: Gives your apps immediate access to the best, most recent location. + </li> + <li> + <em>Power-efficiency</em>: Minimizes your app's use of power. Based on all incoming location requests and available sensors, fused location provider chooses the most efficient way to meet those needs. + </li> + <li> + <em>Versatility</em>: Meets a wide range of needs, from foreground uses that need highly accurate + location to background uses that need periodic location updates with negligible power impact. + </li> + +</ul> + +<h4 style="font-weight:bold">Geofencing APIs</h4> +<ul> + <li> + <em>Simple but powerful APIs</em>: Allows batch addition and removal of geofences. Ability to manage + multiple geofences at the same time. Ability to filter alerts for both entry and exit or + entry only or exit only. + </li> + <li> + <em>Optimized for battery</em>: Adjusts location updates based on user’s proximity to the geofence + and user’s modality (still, walking, driving, and so on). + </li> +</ul> +</div> + +<div class="layout-content-col span-6"> +<h4 style="font-weight:bold">Activity recognition</h4> +<ul> + <li> + Uses low-power sensors to recognize the user's current physical activity, such as walking, + cycling, or driving, or remaining still. + </li> + <li> + Great for adding movement awareness to location awareness. Apps can adjust the amount of + location awareness they provide, based on the current user movement. For example, a + navigation app can request more frequent updates when the user is driving. + </li> + <li> + Features for advanced applications: For advanced applications that want to do their own + post-processing, this API also makes available confidence values for each of the activities. + It also includes two activities that indicate unreliable measurements: unknown and tilt. + </li> +</ul> +</div> +</div>
\ No newline at end of file diff --git a/docs/html/images/google/game_services.png b/docs/html/images/google/game_services.png Binary files differnew file mode 100644 index 000000000000..f62d7f0420b9 --- /dev/null +++ b/docs/html/images/google/game_services.png diff --git a/docs/html/images/google/gps-location.png b/docs/html/images/google/gps-location.png Binary files differnew file mode 100644 index 000000000000..c9acda1ea6fd --- /dev/null +++ b/docs/html/images/google/gps-location.png diff --git a/docs/html/training/contacts-provider/display-contact-badge.jd b/docs/html/training/contacts-provider/display-contact-badge.jd index f08935d1262d..041eb58b6870 100644 --- a/docs/html/training/contacts-provider/display-contact-badge.jd +++ b/docs/html/training/contacts-provider/display-contact-badge.jd @@ -169,8 +169,8 @@ trainingnavtop=true // Gets a content URI for the contact mContactUri = Contacts.getLookupUri( - Cursor.getLong(mIdColumn), - Cursor.getString(mLookupKeyColumn) + mCursor.getLong(mIdColumn), + mCursor.getString(mLookupKeyColumn) ); mBadge.assignContactUri(mContactUri); </pre> @@ -221,7 +221,7 @@ trainingnavtop=true * Assuming the current Cursor position is the contact you want, * gets the thumbnail ID */ - mThumbnailUri = Cursor.getString(mThumbnailColumn); + mThumbnailUri = mCursor.getString(mThumbnailColumn); ... </pre> <p> diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp index b7d3d6fad1d5..3c587976d007 100644 --- a/libs/hwui/DisplayList.cpp +++ b/libs/hwui/DisplayList.cpp @@ -299,8 +299,8 @@ void DisplayList::updateMatrix() { if (mWidth != mPrevWidth || mHeight != mPrevHeight) { mPrevWidth = mWidth; mPrevHeight = mHeight; - mPivotX = mPrevWidth / 2; - mPivotY = mPrevHeight / 2; + mPivotX = mPrevWidth / 2.0f; + mPivotY = mPrevHeight / 2.0f; } } if ((mMatrixFlags & ROTATION_3D) == 0) { diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 6fc27714bda8..ddb190e3fec1 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -3535,7 +3535,7 @@ void OpenGLRenderer::getAlphaAndMode(SkPaint* paint, int* alpha, SkXfermode::Mod getAlphaAndModeDirect(paint, alpha, mode); if (mDrawModifiers.mOverrideLayerAlpha < 1.0f) { // if drawing a layer, ignore the paint's alpha - *alpha = mDrawModifiers.mOverrideLayerAlpha; + *alpha = mDrawModifiers.mOverrideLayerAlpha * 255; } *alpha *= mSnapshot->alpha; } diff --git a/media/java/android/media/DeniedByServerException.java b/media/java/android/media/DeniedByServerException.java new file mode 100644 index 000000000000..9c1633adca97 --- /dev/null +++ b/media/java/android/media/DeniedByServerException.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media; + +/** + * Exception thrown when the provisioning server or key server denies a + * certficate or license for a device. + */ +public final class DeniedByServerException extends MediaDrmException { + public DeniedByServerException(String detailMessage) { + super(detailMessage); + } +} diff --git a/media/java/android/media/MediaDrm.java b/media/java/android/media/MediaDrm.java index a58fa5183736..be2d9bcc9438 100644 --- a/media/java/android/media/MediaDrm.java +++ b/media/java/android/media/MediaDrm.java @@ -127,11 +127,14 @@ public final class MediaDrm { private static final native boolean isCryptoSchemeSupportedNative(byte[] uuid); /** - * Instantiate a MediaDrm object using opaque, crypto scheme specific - * data. + * Instantiate a MediaDrm object + * * @param uuid The UUID of the crypto scheme. + * + * @throws UnsupportedSchemeException if the device does not support the + * specified scheme UUID */ - public MediaDrm(UUID uuid) throws MediaDrmException { + public MediaDrm(UUID uuid) throws UnsupportedSchemeException { Looper looper; if ((looper = Looper.myLooper()) != null) { mEventHandler = new EventHandler(this, looper); @@ -268,8 +271,10 @@ public final class MediaDrm { /** * Open a new session with the MediaDrm object. A session ID is returned. + * + * @throws NotProvisionedException if provisioning is needed */ - public native byte[] openSession(); + public native byte[] openSession() throws NotProvisionedException; /** * Close a session on the MediaDrm object that was previously opened @@ -346,10 +351,14 @@ public final class MediaDrm { * keys, which are identified by a keySetId. * @param optionalParameters are included in the key request message to * allow a client application to provide additional message parameters to the server. + * + * @throws NotProvisionedException if reprovisioning is needed, due to a + * problem with the certifcate */ public native KeyRequest getKeyRequest(byte[] scope, byte[] init, String mimeType, int keyType, - HashMap<String, String> optionalParameters); + HashMap<String, String> optionalParameters) + throws NotProvisionedException; /** @@ -360,8 +369,15 @@ public final class MediaDrm { * * @param sessionId the session ID for the DRM session * @param response the byte array response from the server + * + * @throws NotProvisionedException if the response indicates that + * reprovisioning is required + * @throws DeniedByServerException if the response indicates that the + * server rejected the request */ - public native byte[] provideKeyResponse(byte[] sessionId, byte[] response); + public native byte[] provideKeyResponse(byte[] sessionId, byte[] response) + throws NotProvisionedException, DeniedByServerException; + /** * Restore persisted offline keys into a new session. keySetId identifies the @@ -430,8 +446,12 @@ public final class MediaDrm { * * @param response the opaque provisioning response byte array to provide to the * DRM engine plugin. + * + * @throws DeniedByServerException if the response indicates that the + * server rejected the request */ - public native void provideProvisionResponse(byte[] response); + public native void provideProvisionResponse(byte[] response) + throws DeniedByServerException; /** * A means of enforcing limits on the number of concurrent streams per subscriber diff --git a/media/java/android/media/MediaDrmException.java b/media/java/android/media/MediaDrmException.java index d6f5ff4ace8b..d547574e177b 100644 --- a/media/java/android/media/MediaDrmException.java +++ b/media/java/android/media/MediaDrmException.java @@ -17,10 +17,9 @@ package android.media; /** - * Exception thrown if MediaDrm object could not be instantiated for - * whatever reason. + * Base class for MediaDrm exceptions */ -public final class MediaDrmException extends Exception { +public class MediaDrmException extends Exception { public MediaDrmException(String detailMessage) { super(detailMessage); } diff --git a/media/java/android/media/NotProvisionedException.java b/media/java/android/media/NotProvisionedException.java new file mode 100644 index 000000000000..32b8151a4d47 --- /dev/null +++ b/media/java/android/media/NotProvisionedException.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media; + +/** + * Exception thrown when an operation on a MediaDrm object is attempted + * and the device does not have a certificate. The app should obtain and + * install a certificate using the MediaDrm provisioning methods then retry + * the operation. + */ +public final class NotProvisionedException extends MediaDrmException { + public NotProvisionedException(String detailMessage) { + super(detailMessage); + } +} diff --git a/media/java/android/media/UnsupportedSchemeException.java b/media/java/android/media/UnsupportedSchemeException.java new file mode 100644 index 000000000000..d7b5d47ff785 --- /dev/null +++ b/media/java/android/media/UnsupportedSchemeException.java @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.media; + +/** + * Exception thrown when an attempt is made to construct a MediaDrm object + * using a crypto scheme UUID that is not supported by the device + */ +public final class UnsupportedSchemeException extends MediaDrmException { + public UnsupportedSchemeException(String detailMessage) { + super(detailMessage); + } +} diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp index d1b499e8d9d0..ec8894989036 100644 --- a/media/jni/android_media_MediaDrm.cpp +++ b/media/jni/android_media_MediaDrm.cpp @@ -219,12 +219,6 @@ static bool throwExceptionAsNecessary( case ERROR_DRM_TAMPER_DETECTED: drmMessage = "Invalid state"; break; - case ERROR_DRM_NOT_PROVISIONED: - drmMessage = "Not provisioned"; - break; - case ERROR_DRM_DEVICE_REVOKED: - drmMessage = "Device revoked"; - break; default: break; } @@ -238,6 +232,12 @@ static bool throwExceptionAsNecessary( if (err == BAD_VALUE) { jniThrowException(env, "java/lang/IllegalArgumentException", msg); return true; + } else if (err == ERROR_DRM_NOT_PROVISIONED) { + jniThrowException(env, "android/media/NotProvisionedException", msg); + return true; + } else if (err == ERROR_DRM_DEVICE_REVOKED) { + jniThrowException(env, "android/media/DeniedByServerException", msg); + return true; } else if (err != OK) { String8 errbuf; if (drmMessage != NULL) { @@ -248,6 +248,7 @@ static bool throwExceptionAsNecessary( msg = errbuf.string(); } } + ALOGE("Illegal state exception: %s", msg); jniThrowException(env, "java/lang/IllegalStateException", msg); return true; } @@ -574,7 +575,7 @@ static void android_media_MediaDrm_native_setup( if (err != OK) { jniThrowException( env, - "android/media/MediaDrmException", + "android/media/UnsupportedSchemeException", "Failed to instantiate drm object."); return; } diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index c2655c72b998..4d77cfd02087 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -164,17 +164,18 @@ static void captureCallback(void* user, visualizer_callback_cookie *callbackInfo = (visualizer_callback_cookie *)user; JNIEnv *env = AndroidRuntime::getJNIEnv(); - AutoMutex lock(&callbackInfo->callback_data_lock); + + if (!user || !env) { + ALOGW("captureCallback error user %p, env %p", user, env); + return; + } ALOGV("captureCallback: callbackInfo %p, visualizer_ref %p visualizer_class %p", callbackInfo, callbackInfo->visualizer_ref, callbackInfo->visualizer_class); - if (!user || !env) { - ALOGW("captureCallback error user %p, env %p", user, env); - return; - } + AutoMutex lock(&callbackInfo->callback_data_lock); if (waveformSize != 0 && waveform != NULL) { jbyteArray jArray; diff --git a/opengl/java/android/opengl/EGL14.java b/opengl/java/android/opengl/EGL14.java index 2c9508a4e5e1..cd53c1757faa 100644 --- a/opengl/java/android/opengl/EGL14.java +++ b/opengl/java/android/opengl/EGL14.java @@ -445,12 +445,4 @@ public static final int EGL_CORE_NATIVE_ENGINE = 0x305B; int target ); - // C function EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) - - public static native boolean eglPresentationTimeANDROID( - EGLDisplay dpy, - EGLSurface sur, - long time - ); - } diff --git a/opengl/java/android/opengl/EGLExt.java b/opengl/java/android/opengl/EGLExt.java new file mode 100644 index 000000000000..2e0363d1d92a --- /dev/null +++ b/opengl/java/android/opengl/EGLExt.java @@ -0,0 +1,46 @@ +/* +** +** Copyright 2013, 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. +*/ + +// This source file is automatically generated + +package android.opengl; + +/** + * EGL Extensions + */ +public class EGLExt { + + // EGL_KHR_create_context + public static final int EGL_CONTEXT_MAJOR_VERSION_KHR = 0x3098; + public static final int EGL_CONTEXT_MINOR_VERSION_KHR = 0x30FB; + public static final int EGL_CONTEXT_FLAGS_KHR = 0x30FC; + public static final int EGL_OPENGL_ES3_BIT_KHR = 0x0040; + + native private static void _nativeClassInit(); + static { + _nativeClassInit(); + } + + // C function EGLBoolean eglPresentationTimeANDROID ( EGLDisplay dpy, EGLSurface sur, EGLnsecsANDROID time ) + + public static native boolean eglPresentationTimeANDROID( + EGLDisplay dpy, + EGLSurface sur, + long time + ); + +} diff --git a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java index 627235f1e03b..cdd3d84a96fb 100644 --- a/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java +++ b/packages/SystemUI/src/com/android/systemui/ImageWallpaper.java @@ -388,7 +388,6 @@ public class ImageWallpaper extends WallpaperService { private void updateWallpaperLocked() { Throwable exception = null; try { - mWallpaperManager.forgetLoadedWallpaper(); // force reload mBackground = null; mBackground = mWallpaperManager.getBitmap(); } catch (RuntimeException e) { diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java b/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java index 9281c750b749..02ddb739d79a 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentTasksLoader.java @@ -286,6 +286,10 @@ public class RecentTasksLoader implements View.OnTouchListener { private void cancelLoadingThumbnailsAndIcons() { + if (mRecentsPanel != null && mRecentsPanel.isShowing()) { + return; + } + if (mTaskLoader != null) { mTaskLoader.cancel(false); mTaskLoader = null; diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java index c3259373a2c4..62030ad194fd 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsActivity.java @@ -127,6 +127,9 @@ public class RecentsActivity extends Activity { } mShowing = true; if (mRecentsPanel != null) { + // Call and refresh the recent tasks list in case we didn't preload tasks + // or in case we don't get an onNewIntent + mRecentsPanel.refreshRecentTasksList(); mRecentsPanel.refreshViews(); } super.onStart(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index ff364853bead..f33dc20607bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -25,6 +25,7 @@ import android.util.EventLog; import android.util.Slog; import android.view.MotionEvent; import android.view.View; +import android.view.accessibility.AccessibilityEvent; import com.android.systemui.EventLogTags; import com.android.systemui.R; @@ -56,8 +57,6 @@ public class NotificationPanelView extends PanelView { mHandleBar = resources.getDrawable(R.drawable.status_bar_close); mHandleBarHeight = resources.getDimensionPixelSize(R.dimen.close_handle_height); mHandleView = findViewById(R.id.handle); - - setContentDescription(resources.getString(R.string.accessibility_desc_notification_shade)); } @Override @@ -71,6 +70,17 @@ public class NotificationPanelView extends PanelView { super.fling(vel, always); } + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + event.getText() + .add(getContext().getString(R.string.accessibility_desc_notification_shade)); + return true; + } + + return super.dispatchPopulateAccessibilityEvent(event); + } + // We draw the handle ourselves so that it's always glued to the bottom of the window. @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java index 2314d93c05f5..3333563197ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SettingsPanelView.java @@ -28,6 +28,7 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; import com.android.systemui.EventLogTags; import com.android.systemui.R; @@ -62,10 +63,8 @@ public class SettingsPanelView extends PanelView { mHandleBar = resources.getDrawable(R.drawable.status_bar_close); mHandleBarHeight = resources.getDimensionPixelSize(R.dimen.close_handle_height); mHandleView = findViewById(R.id.handle); - - setContentDescription(resources.getString(R.string.accessibility_desc_quick_settings)); } - + public void setQuickSettings(QuickSettings qs) { mQS = qs; } @@ -120,6 +119,17 @@ public class SettingsPanelView extends PanelView { } } + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + event.getText() + .add(getContext().getString(R.string.accessibility_desc_quick_settings)); + return true; + } + + return super.dispatchPopulateAccessibilityEvent(event); + } + // We draw the handle ourselves so that it's always glued to the bottom of the window. @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 2a3c87e4ff6f..a537e99dfa98 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -3735,7 +3735,16 @@ class BackupManagerService extends IBackupManager.Stub { } else { // So far so good -- do the signatures match the manifest? Signature[] sigs = mManifestSignatures.get(info.packageName); - if (!signaturesMatch(sigs, pkg)) { + if (signaturesMatch(sigs, pkg)) { + // If this is a system-uid app without a declared backup agent, + // don't restore any of the file data. + if ((pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID) + && (pkg.applicationInfo.backupAgentName == null)) { + Slog.w(TAG, "Installed app " + info.packageName + + " has restricted uid and no agent"); + okay = false; + } + } else { Slog.w(TAG, "Installed app " + info.packageName + " signatures do not match restore manifest"); okay = false; diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java index dbffa973181f..1f2947db7861 100644 --- a/services/java/com/android/server/BatteryService.java +++ b/services/java/com/android/server/BatteryService.java @@ -236,6 +236,15 @@ public final class BatteryService extends Binder { } } + /** + * Returns a non-zero value if an unsupported charger is attached. + */ + public int getInvalidCharger() { + synchronized (mLock) { + return mInvalidCharger; + } + } + private void shutdownIfNoPowerLocked() { // shut down gracefully if our battery is critically low and we are not powered. // wait until the system has booted before attempting to display the shutdown dialog. diff --git a/services/java/com/android/server/IdleMaintenanceService.java b/services/java/com/android/server/IdleMaintenanceService.java index 0c90de43d8a3..584d4bc5f4c8 100644 --- a/services/java/com/android/server/IdleMaintenanceService.java +++ b/services/java/com/android/server/IdleMaintenanceService.java @@ -17,11 +17,12 @@ package com.android.server; import android.app.Activity; +import android.app.AlarmManager; +import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.os.BatteryManager; import android.os.Handler; import android.os.Looper; import android.os.PowerManager; @@ -40,7 +41,6 @@ import android.util.Log; * The current implementation is very simple. The start of a maintenance * window is announced if: the screen is off or showing a dream AND the * battery level is more than twenty percent AND at least one hour passed - * since the screen went off or a dream started (i.e. since the last user * activity). * * The end of a maintenance window is announced only if: a start was @@ -48,27 +48,44 @@ import android.util.Log; */ public class IdleMaintenanceService extends BroadcastReceiver { - private final boolean DEBUG = false; + private static final boolean DEBUG = false; private static final String LOG_TAG = IdleMaintenanceService.class.getSimpleName(); private static final int LAST_USER_ACTIVITY_TIME_INVALID = -1; - private static final long MILLIS_IN_DAY = 24 * 60 * 60 * 1000; + private static final long MIN_IDLE_MAINTENANCE_INTERVAL_MILLIS = 24 * 60 * 60 * 1000; // 1 day private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_CHARGING = 30; // percent private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_NOT_CHARGING = 80; // percent - private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING = 10; // percent + private static final int MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING = 20; // percent - private static final long MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START = 60 * 60 * 1000; // 1 hour + private static final long MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START = 71 * 60 * 1000; // 71 min - private final Intent mIdleMaintenanceStartIntent = - new Intent(Intent.ACTION_IDLE_MAINTENANCE_START); + private static final long MAX_IDLE_MAINTENANCE_DURATION = 71 * 60 * 1000; // 71 min - private final Intent mIdleMaintenanceEndIntent = - new Intent(Intent.ACTION_IDLE_MAINTENANCE_END); + private static final String ACTION_UPDATE_IDLE_MAINTENANCE_STATE = + "com.android.server.IdleMaintenanceService.action.UPDATE_IDLE_MAINTENANCE_STATE"; + + private static final Intent sIdleMaintenanceStartIntent; + static { + sIdleMaintenanceStartIntent = new Intent(Intent.ACTION_IDLE_MAINTENANCE_START); + sIdleMaintenanceStartIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + }; + + private static final Intent sIdleMaintenanceEndIntent; + static { + sIdleMaintenanceEndIntent = new Intent(Intent.ACTION_IDLE_MAINTENANCE_END); + sIdleMaintenanceEndIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + } + + private final AlarmManager mAlarmService; + + private final BatteryService mBatteryService; + + private final PendingIntent mUpdateIdleMaintenanceStatePendingIntent; private final Context mContext; @@ -76,30 +93,37 @@ public class IdleMaintenanceService extends BroadcastReceiver { private final Handler mHandler; - private long mLastIdleMaintenanceStartTimeMillis = SystemClock.elapsedRealtime(); + private long mLastIdleMaintenanceStartTimeMillis; private long mLastUserActivityElapsedTimeMillis = LAST_USER_ACTIVITY_TIME_INVALID; - private int mBatteryLevel; - - private boolean mBatteryCharging; - private boolean mIdleMaintenanceStarted; - public IdleMaintenanceService(Context context) { + public IdleMaintenanceService(Context context, BatteryService batteryService) { mContext = context; + mBatteryService = batteryService; + + mAlarmService = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, LOG_TAG); mHandler = new Handler(mContext.getMainLooper()); + Intent intent = new Intent(ACTION_UPDATE_IDLE_MAINTENANCE_STATE); + intent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + mUpdateIdleMaintenanceStatePendingIntent = PendingIntent.getBroadcast(mContext, 0, + intent, PendingIntent.FLAG_UPDATE_CURRENT); + register(mContext.getMainLooper()); } public void register(Looper looper) { IntentFilter intentFilter = new IntentFilter(); + // Alarm actions. + intentFilter.addAction(ACTION_UPDATE_IDLE_MAINTENANCE_STATE); + // Battery actions. intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED); @@ -115,67 +139,117 @@ public class IdleMaintenanceService extends BroadcastReceiver { intentFilter, null, new Handler(looper)); } + private void scheduleUpdateIdleMaintenanceState(long delayMillis) { + final long triggetRealTimeMillis = SystemClock.elapsedRealtime() + delayMillis; + mAlarmService.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggetRealTimeMillis, + mUpdateIdleMaintenanceStatePendingIntent); + } + + private void unscheduleUpdateIdleMaintenanceState() { + mAlarmService.cancel(mUpdateIdleMaintenanceStatePendingIntent); + } + private void updateIdleMaintenanceState() { if (mIdleMaintenanceStarted) { - // Idle maintenance can be interrupted only by - // a change of the device state. - if (!deviceStatePermitsIdleMaintenanceRunning()) { + // Idle maintenance can be interrupted by user activity, or duration + // time out, or low battery. + if (!lastUserActivityPermitsIdleMaintenanceRunning() + || !batteryLevelAndMaintenanceTimeoutPermitsIdleMaintenanceRunning()) { + unscheduleUpdateIdleMaintenanceState(); mIdleMaintenanceStarted = false; EventLogTags.writeIdleMaintenanceWindowFinish(SystemClock.elapsedRealtime(), - mLastUserActivityElapsedTimeMillis, mBatteryLevel, - mBatteryCharging ? 1 : 0); + mLastUserActivityElapsedTimeMillis, mBatteryService.getBatteryLevel(), + isBatteryCharging() ? 1 : 0); sendIdleMaintenanceEndIntent(); + // We stopped since we don't have enough battery or timed out but the + // user is not using the device, so we should be able to run maintenance + // in the next maintenance window since the battery may be charged + // without interaction and the min interval between maintenances passed. + if (!batteryLevelAndMaintenanceTimeoutPermitsIdleMaintenanceRunning()) { + scheduleUpdateIdleMaintenanceState( + getNextIdleMaintenanceIntervalStartFromNow()); + } } } else if (deviceStatePermitsIdleMaintenanceStart() && lastUserActivityPermitsIdleMaintenanceStart() && lastRunPermitsIdleMaintenanceStart()) { + // Now that we started idle maintenance, we should schedule another + // update for the moment when the idle maintenance times out. + scheduleUpdateIdleMaintenanceState(MAX_IDLE_MAINTENANCE_DURATION); mIdleMaintenanceStarted = true; EventLogTags.writeIdleMaintenanceWindowStart(SystemClock.elapsedRealtime(), - mLastUserActivityElapsedTimeMillis, mBatteryLevel, - mBatteryCharging ? 1 : 0); + mLastUserActivityElapsedTimeMillis, mBatteryService.getBatteryLevel(), + isBatteryCharging() ? 1 : 0); mLastIdleMaintenanceStartTimeMillis = SystemClock.elapsedRealtime(); sendIdleMaintenanceStartIntent(); + } else if (lastUserActivityPermitsIdleMaintenanceStart()) { + if (lastRunPermitsIdleMaintenanceStart()) { + // The user does not use the device and we did not run maintenance in more + // than the min interval between runs, so schedule an update - maybe the + // battery will be charged latter. + scheduleUpdateIdleMaintenanceState(MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START); + } else { + // The user does not use the device but we have run maintenance in the min + // interval between runs, so schedule an update after the min interval ends. + scheduleUpdateIdleMaintenanceState( + getNextIdleMaintenanceIntervalStartFromNow()); + } } } + private long getNextIdleMaintenanceIntervalStartFromNow() { + return mLastIdleMaintenanceStartTimeMillis + MIN_IDLE_MAINTENANCE_INTERVAL_MILLIS + - SystemClock.elapsedRealtime(); + } + private void sendIdleMaintenanceStartIntent() { - if (DEBUG) { - Log.i(LOG_TAG, "Broadcasting " + Intent.ACTION_IDLE_MAINTENANCE_START); - } mWakeLock.acquire(); - mContext.sendOrderedBroadcastAsUser(mIdleMaintenanceStartIntent, UserHandle.ALL, + mContext.sendOrderedBroadcastAsUser(sIdleMaintenanceStartIntent, UserHandle.ALL, null, this, mHandler, Activity.RESULT_OK, null, null); } private void sendIdleMaintenanceEndIntent() { - if (DEBUG) { - Log.i(LOG_TAG, "Broadcasting " + Intent.ACTION_IDLE_MAINTENANCE_END); - } mWakeLock.acquire(); - mContext.sendOrderedBroadcastAsUser(mIdleMaintenanceEndIntent, UserHandle.ALL, + mContext.sendOrderedBroadcastAsUser(sIdleMaintenanceEndIntent, UserHandle.ALL, null, this, mHandler, Activity.RESULT_OK, null, null); } private boolean deviceStatePermitsIdleMaintenanceStart() { - final int minBatteryLevel = mBatteryCharging + final int minBatteryLevel = isBatteryCharging() ? MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_CHARGING : MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_START_NOT_CHARGING; return (mLastUserActivityElapsedTimeMillis != LAST_USER_ACTIVITY_TIME_INVALID - && mBatteryLevel > minBatteryLevel); + && mBatteryService.getBatteryLevel() > minBatteryLevel); } - private boolean deviceStatePermitsIdleMaintenanceRunning() { + private boolean lastUserActivityPermitsIdleMaintenanceStart() { + // The last time the user poked the device is above the threshold. return (mLastUserActivityElapsedTimeMillis != LAST_USER_ACTIVITY_TIME_INVALID - && mBatteryLevel > MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING); + && SystemClock.elapsedRealtime() - mLastUserActivityElapsedTimeMillis + > MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START); } - private boolean lastUserActivityPermitsIdleMaintenanceStart() { - return (SystemClock.elapsedRealtime() - mLastUserActivityElapsedTimeMillis - > MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START); + private boolean lastRunPermitsIdleMaintenanceStart() { + // Enough time passed since the last maintenance run. + return SystemClock.elapsedRealtime() - mLastIdleMaintenanceStartTimeMillis + > MIN_IDLE_MAINTENANCE_INTERVAL_MILLIS; } - private boolean lastRunPermitsIdleMaintenanceStart() { - return SystemClock.elapsedRealtime() - mLastIdleMaintenanceStartTimeMillis > MILLIS_IN_DAY; + private boolean lastUserActivityPermitsIdleMaintenanceRunning() { + // The user is not using the device. + return (mLastUserActivityElapsedTimeMillis != LAST_USER_ACTIVITY_TIME_INVALID); + } + + private boolean batteryLevelAndMaintenanceTimeoutPermitsIdleMaintenanceRunning() { + // Battery not too low and the maintenance duration did not timeout. + return (mBatteryService.getBatteryLevel() > MIN_BATTERY_LEVEL_IDLE_MAINTENANCE_RUNNING + && mLastIdleMaintenanceStartTimeMillis + MAX_IDLE_MAINTENANCE_DURATION + > SystemClock.elapsedRealtime()); + } + + private boolean isBatteryCharging() { + return mBatteryService.getPlugType() > 0 + && mBatteryService.getInvalidCharger() == 0; } @Override @@ -185,24 +259,38 @@ public class IdleMaintenanceService extends BroadcastReceiver { } String action = intent.getAction(); if (Intent.ACTION_BATTERY_CHANGED.equals(action)) { - final int maxBatteryLevel = intent.getExtras().getInt(BatteryManager.EXTRA_SCALE); - final int currBatteryLevel = intent.getExtras().getInt(BatteryManager.EXTRA_LEVEL); - mBatteryLevel = (int) (((float) maxBatteryLevel / 100) * currBatteryLevel); - final int pluggedState = intent.getExtras().getInt(BatteryManager.EXTRA_PLUGGED); - final int chargerState = intent.getExtras().getInt( - BatteryManager.EXTRA_INVALID_CHARGER, 0); - mBatteryCharging = (pluggedState > 0 && chargerState == 0); + // We care about battery only if maintenance is in progress so we can + // stop it if battery is too low. Note that here we assume that the + // maintenance clients are properly holding a wake lock. We will + // refactor the maintenance to use services instead of intents for the + // next release. The only client for this for now is internal an holds + // a wake lock correctly. + if (mIdleMaintenanceStarted) { + updateIdleMaintenanceState(); + } } else if (Intent.ACTION_SCREEN_ON.equals(action) || Intent.ACTION_DREAMING_STOPPED.equals(action)) { mLastUserActivityElapsedTimeMillis = LAST_USER_ACTIVITY_TIME_INVALID; + // Unschedule any future updates since we already know that maintenance + // cannot be performed since the user is back. + unscheduleUpdateIdleMaintenanceState(); + // If the screen went on/stopped dreaming, we know the user is using the + // device which means that idle maintenance should be stopped if running. + updateIdleMaintenanceState(); } else if (Intent.ACTION_SCREEN_OFF.equals(action) || Intent.ACTION_DREAMING_STARTED.equals(action)) { mLastUserActivityElapsedTimeMillis = SystemClock.elapsedRealtime(); + // If screen went off/started dreaming, we may be able to start idle maintenance + // after the minimal user inactivity elapses. We schedule an alarm for when + // this timeout elapses since the device may go to sleep by then. + scheduleUpdateIdleMaintenanceState(MIN_USER_INACTIVITY_IDLE_MAINTENANCE_START); + } else if (ACTION_UPDATE_IDLE_MAINTENANCE_STATE.equals(action)) { + updateIdleMaintenanceState(); } else if (Intent.ACTION_IDLE_MAINTENANCE_START.equals(action) || Intent.ACTION_IDLE_MAINTENANCE_END.equals(action)) { + // We were holding a wake lock while broadcasting the idle maintenance + // intents but now that we finished the broadcast release the wake lock. mWakeLock.release(); - return; } - updateIdleMaintenanceState(); } } diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index f872cc3b59a8..1dd5fc64039d 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -705,7 +705,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub @Override public void onReceive(Context context, Intent intent) { synchronized(mMethodMap) { - checkCurrentLocaleChangedLocked(); + resetStateIfCurrentLocaleChangedLocked(); } } }, filter); @@ -781,7 +781,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } - private void checkCurrentLocaleChangedLocked() { + private void resetStateIfCurrentLocaleChangedLocked() { resetAllInternalStateLocked(true /* updateOnlyWhenLocaleChanged */, true /* resetDefaultImeLocked */); } @@ -791,12 +791,16 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // InputMethodFileManager should be reset when the user is changed mFileManager = new InputMethodFileManager(mMethodMap, newUserId); final String defaultImiId = mSettings.getSelectedInputMethod(); - final boolean needsToResetDefaultIme = TextUtils.isEmpty(defaultImiId); + final boolean initialUserSwitch = TextUtils.isEmpty(defaultImiId); if (DEBUG) { Slog.d(TAG, "Switch user: " + newUserId + " current ime = " + defaultImiId); } resetAllInternalStateLocked(false /* updateOnlyWhenLocaleChanged */, - needsToResetDefaultIme); + initialUserSwitch /* needsToResetDefaultIme */); + if (initialUserSwitch) { + InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed(mContext.getPackageManager(), + mSettings.getEnabledInputMethodListLocked()); + } } @Override @@ -838,7 +842,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub !mImeSelectedOnBoot /* resetDefaultEnabledIme */); if (!mImeSelectedOnBoot) { Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here."); - checkCurrentLocaleChangedLocked(); + resetStateIfCurrentLocaleChangedLocked(); + InputMethodUtils.setNonSelectedSystemImesDisabledUntilUsed( + mContext.getPackageManager(), + mSettings.getEnabledInputMethodListLocked()); } mLastSystemLocale = mRes.getConfiguration().locale; try { @@ -1597,6 +1604,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub mSettings.getCurrentUserId()); if (ai != null && ai.enabledSetting == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { + if (DEBUG) { + Slog.d(TAG, "Update state(" + imm.getId() + + "): DISABLED_UNTIL_USED -> DEFAULT"); + } mIPackageManager.setApplicationEnabledSetting(imm.getPackageName(), PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP, mSettings.getCurrentUserId(), diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 7994b56ac64d..9455017dedb8 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -745,7 +745,7 @@ class ServerThread extends Thread { try { Slog.i(TAG, "IdleMaintenanceService"); - new IdleMaintenanceService(context); + new IdleMaintenanceService(context, battery); } catch (Throwable e) { reportWtf("starting IdleMaintenanceService", e); } diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java index 167e7afa5860..3aec4ea303c1 100644 --- a/services/java/com/android/server/Watchdog.java +++ b/services/java/com/android/server/Watchdog.java @@ -16,6 +16,9 @@ package com.android.server; +import android.app.IActivityController; +import android.os.Binder; +import android.os.RemoteException; import com.android.server.am.ActivityManagerService; import com.android.server.power.PowerManagerService; @@ -91,6 +94,8 @@ public class Watchdog extends Thread { Monitor mCurrentMonitor; int mPhonePid; + IActivityController mController; + boolean mAllowRestart = true; final Calendar mCalendar = Calendar.getInstance(); int mMinScreenOff = MEMCHECK_DEFAULT_MIN_SCREEN_OFF; @@ -223,6 +228,18 @@ public class Watchdog extends Thread { } } + public void setActivityController(IActivityController controller) { + synchronized (this) { + mController = controller; + } + } + + public void setAllowRestart(boolean allowRestart) { + synchronized (this) { + mAllowRestart = allowRestart; + } + } + public void addMonitor(Monitor monitor) { synchronized (this) { if (isAlive()) { @@ -391,6 +408,7 @@ public class Watchdog extends Thread { final String name; + final boolean allowRestart; synchronized (this) { long timeout = TIME_TO_WAIT; @@ -427,6 +445,7 @@ public class Watchdog extends Thread { name = (mCurrentMonitor != null) ? mCurrentMonitor.getClass().getName() : "null"; + allowRestart = mAllowRestart; } // If we got here, that means that the system is most likely hung. @@ -476,13 +495,34 @@ public class Watchdog extends Thread { dropboxThread.join(2000); // wait up to 2 seconds for it to return. } catch (InterruptedException ignored) {} + IActivityController controller; + synchronized (this) { + controller = mController; + } + if (controller != null) { + Slog.i(TAG, "Reporting stuck state to activity controller"); + try { + Binder.setDumpDisabled("Service dumps disabled due to hung system process."); + // 1 = keep waiting, -1 = kill system + int res = controller.systemNotResponding(name); + if (res >= 0) { + Slog.i(TAG, "Activity controller requested to coninue to wait"); + waitedHalf = false; + continue; + } + } catch (RemoteException e) { + } + } + // Only kill the process if the debugger is not attached. - if (!Debug.isDebuggerConnected()) { + if (Debug.isDebuggerConnected()) { + Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process"); + } else if (!allowRestart) { + Slog.w(TAG, "Restart not allowed: Watchdog is *not* killing the system process"); + } else { Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + name); Process.killProcess(Process.myPid()); System.exit(10); - } else { - Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process"); } waitedHalf = false; diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index 138c51b8898c..4ae9eb59b9c1 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1711,6 +1711,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { final KeyEventDispatcher mKeyEventDispatcher = new KeyEventDispatcher(); + boolean mWasConnectedAndDied; + // Handler only for dispatching accessibility events since we use event // types as message types allowing us to remove messages per event type. public Handler mEventDispatchHandler = new Handler(mMainHandler.getLooper()) { @@ -1865,8 +1867,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mServiceInterface = IAccessibilityServiceClient.Stub.asInterface(service); UserState userState = getUserStateLocked(mUserId); addServiceLocked(this, userState); - if (userState.mBindingServices.contains(mComponentName)) { + if (userState.mBindingServices.contains(mComponentName) || mWasConnectedAndDied) { userState.mBindingServices.remove(mComponentName); + mWasConnectedAndDied = false; try { mServiceInterface.setConnection(this, mId); onUserStateChangedLocked(userState); @@ -2220,7 +2223,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mServiceInterface = null; } - public boolean isInitializedLocked() { + public boolean isConnectedLocked() { return (mService != null); } @@ -2230,9 +2233,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { // whose handling the death recipient is unlinked and still get a call // on binderDied since the call was made before we unlink but was // waiting on the lock we held during the force stop handling. - if (!isInitializedLocked()) { + if (!isConnectedLocked()) { return; } + mWasConnectedAndDied = true; mKeyEventDispatcher.flush(); UserState userState = getUserStateLocked(mUserId); // The death recipient is unregistered in removeServiceLocked @@ -2245,7 +2249,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { userState.mEnabledServices.remove(mComponentName); userState.destroyUiAutomationService(); } - onUserStateChangedLocked(userState); } } diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 1d17da967c5d..0081dfc512d0 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -2822,6 +2822,7 @@ public final class ActivityManagerService extends ActivityManagerNative resumeOK = mController.activityResuming(next.packageName); } catch (RemoteException e) { mController = null; + Watchdog.getInstance().setActivityController(null); } if (!resumeOK) { @@ -3334,6 +3335,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (res < 0 && app.pid != MY_PID) Process.killProcess(app.pid); } catch (RemoteException e) { mController = null; + Watchdog.getInstance().setActivityController(null); } } @@ -3437,6 +3439,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } catch (RemoteException e) { mController = null; + Watchdog.getInstance().setActivityController(null); } } @@ -7441,6 +7444,7 @@ public final class ActivityManagerService extends ActivityManagerNative "setActivityController()"); synchronized (this) { mController = controller; + Watchdog.getInstance().setActivityController(controller); } } @@ -7809,6 +7813,45 @@ public final class ActivityManagerService extends ActivityManagerNative return killed; } + @Override + public void hang(final IBinder who, boolean allowRestart) { + if (checkCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Requires permission " + + android.Manifest.permission.SET_ACTIVITY_WATCHER); + } + + final IBinder.DeathRecipient death = new DeathRecipient() { + @Override + public void binderDied() { + synchronized (this) { + notifyAll(); + } + } + }; + + try { + who.linkToDeath(death, 0); + } catch (RemoteException e) { + Slog.w(TAG, "hang: given caller IBinder is already dead."); + return; + } + + synchronized (this) { + Watchdog.getInstance().setAllowRestart(allowRestart); + Slog.i(TAG, "Hanging system process at request of pid " + Binder.getCallingPid()); + synchronized (death) { + while (who.isBinderAlive()) { + try { + death.wait(); + } catch (InterruptedException e) { + } + } + } + Watchdog.getInstance().setAllowRestart(true); + } + } + public final void startRunning(String pkg, String cls, String action, String data) { synchronized(this) { @@ -8832,6 +8875,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } catch (RemoteException e) { mController = null; + Watchdog.getInstance().setActivityController(null); } } @@ -12765,6 +12809,7 @@ public final class ActivityManagerService extends ActivityManagerNative resumeOK = mController.activityResuming(next.packageName); } catch (RemoteException e) { mController = null; + Watchdog.getInstance().setActivityController(null); } if (!resumeOK) { diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java index fccaab56a9e1..9fdd293f8382 100644 --- a/services/java/com/android/server/am/ServiceRecord.java +++ b/services/java/com/android/server/am/ServiceRecord.java @@ -371,15 +371,15 @@ class ServiceRecord extends Binder { return; } try { - if (foregroundNoti.icon == 0) { + if (localForegroundNoti.icon == 0) { // It is not correct for the caller to supply a notification // icon, but this used to be able to slip through, so for // those dirty apps give it the app's icon. - foregroundNoti.icon = appInfo.icon; + localForegroundNoti.icon = appInfo.icon; // Do not allow apps to present a sneaky invisible content view either. - foregroundNoti.contentView = null; - foregroundNoti.bigContentView = null; + localForegroundNoti.contentView = null; + localForegroundNoti.bigContentView = null; CharSequence appName = appInfo.loadLabel( ams.mContext.getPackageManager()); if (appName == null) { @@ -395,7 +395,7 @@ class ServiceRecord extends Binder { appInfo.packageName, null)); PendingIntent pi = PendingIntent.getActivity(ams.mContext, 0, runningIntent, PendingIntent.FLAG_UPDATE_CURRENT); - foregroundNoti.setLatestEventInfo(ctx, + localForegroundNoti.setLatestEventInfo(ctx, ams.mContext.getString( com.android.internal.R.string .app_running_notification_title, @@ -406,10 +406,10 @@ class ServiceRecord extends Binder { appName), pi); } catch (PackageManager.NameNotFoundException e) { - foregroundNoti.icon = 0; + localForegroundNoti.icon = 0; } } - if (foregroundNoti.icon == 0) { + if (localForegroundNoti.icon == 0) { // Notifications whose icon is 0 are defined to not show // a notification, silently ignoring it. We don't want to // just ignore it, we want to prevent the service from diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java index 10c7e2776921..e7d1fa4ede21 100644 --- a/services/java/com/android/server/connectivity/Vpn.java +++ b/services/java/com/android/server/connectivity/Vpn.java @@ -95,7 +95,8 @@ public class Vpn extends BaseNetworkStateTracker { private Connection mConnection; private LegacyVpnRunner mLegacyVpnRunner; private PendingIntent mStatusIntent; - private boolean mEnableNotif = true; + private volatile boolean mEnableNotif = true; + private volatile boolean mEnableTeardown = true; private final IConnectivityManager mConnService; public Vpn(Context context, VpnCallback callback, INetworkManagementService netService, @@ -113,10 +114,23 @@ public class Vpn extends BaseNetworkStateTracker { } } + /** + * Set if this object is responsible for showing its own notifications. When + * {@code false}, notifications are handled externally by someone else. + */ public void setEnableNotifications(boolean enableNotif) { mEnableNotif = enableNotif; } + /** + * Set if this object is responsible for watching for {@link NetworkInfo} + * teardown. When {@code false}, teardown is handled externally by someone + * else. + */ + public void setEnableTeardown(boolean enableTeardown) { + mEnableTeardown = enableTeardown; + } + @Override protected void startMonitoringInternal() { // Ignored; events are sent through callbacks for now @@ -647,6 +661,8 @@ public class Vpn extends BaseNetworkStateTracker { private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + if (!mEnableTeardown) return; + if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { if (intent.getIntExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, ConnectivityManager.TYPE_NONE) == mOuterConnection.get()) { @@ -688,7 +704,6 @@ public class Vpn extends BaseNetworkStateTracker { IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); mContext.registerReceiver(mBroadcastReceiver, filter); - } public void check(String interfaze) { diff --git a/services/java/com/android/server/net/LockdownVpnTracker.java b/services/java/com/android/server/net/LockdownVpnTracker.java index 5b6e48545adb..e25192525e33 100644 --- a/services/java/com/android/server/net/LockdownVpnTracker.java +++ b/services/java/com/android/server/net/LockdownVpnTracker.java @@ -128,7 +128,10 @@ public class LockdownVpnTracker { mAcceptedEgressIface = null; mVpn.stopLegacyVpn(); } - if (egressDisconnected) return; + if (egressDisconnected) { + hideNotification(); + return; + } final int egressType = egressInfo.getType(); if (vpnInfo.getDetailedState() == DetailedState.FAILED) { @@ -192,6 +195,7 @@ public class LockdownVpnTracker { Slog.d(TAG, "initLocked()"); mVpn.setEnableNotifications(false); + mVpn.setEnableTeardown(false); final IntentFilter resetFilter = new IntentFilter(ACTION_LOCKDOWN_RESET); mContext.registerReceiver(mResetReceiver, resetFilter, CONNECTIVITY_INTERNAL, null); @@ -235,6 +239,7 @@ public class LockdownVpnTracker { mContext.unregisterReceiver(mResetReceiver); mVpn.setEnableNotifications(true); + mVpn.setEnableTeardown(true); } public void reset() { diff --git a/services/java/com/android/server/pm/Installer.java b/services/java/com/android/server/pm/Installer.java index d9c85bf6974b..734d07136aff 100644 --- a/services/java/com/android/server/pm/Installer.java +++ b/services/java/com/android/server/pm/Installer.java @@ -307,8 +307,8 @@ public final class Installer { return execute(builder.toString()); } - public int getSizeInfo(String pkgName, int persona, String apkPath, String fwdLockApkPath, - String asecPath, PackageStats pStats) { + public int getSizeInfo(String pkgName, int persona, String apkPath, String libDirPath, + String fwdLockApkPath, String asecPath, PackageStats pStats) { StringBuilder builder = new StringBuilder("getsize"); builder.append(' '); builder.append(pkgName); @@ -317,6 +317,8 @@ public final class Installer { builder.append(' '); builder.append(apkPath); builder.append(' '); + builder.append(libDirPath != null ? libDirPath : "!"); + builder.append(' '); builder.append(fwdLockApkPath != null ? fwdLockApkPath : "!"); builder.append(' '); builder.append(asecPath != null ? asecPath : "!"); diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 1b8ee82682f4..e804dfa3f9a4 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -422,8 +422,71 @@ public class PackageManagerService extends IPackageManager.Stub { PackageParser.Package mPlatformPackage; // Set of pending broadcasts for aggregating enable/disable of components. - final HashMap<String, ArrayList<String>> mPendingBroadcasts - = new HashMap<String, ArrayList<String>>(); + static class PendingPackageBroadcasts { + // for each user id, a map of <package name -> components within that package> + final SparseArray<HashMap<String, ArrayList<String>>> mUidMap; + + public PendingPackageBroadcasts() { + mUidMap = new SparseArray<HashMap<String, ArrayList<String>>>(); + } + + public ArrayList<String> get(int userId, String packageName) { + HashMap<String, ArrayList<String>> packages = getOrAllocate(userId); + return packages.get(packageName); + } + + public void put(int userId, String packageName, ArrayList<String> components) { + HashMap<String, ArrayList<String>> packages = getOrAllocate(userId); + packages.put(packageName, components); + } + + public void remove(int userId, String packageName) { + HashMap<String, ArrayList<String>> packages = mUidMap.get(userId); + if (packages != null) { + packages.remove(packageName); + } + } + + public void remove(int userId) { + mUidMap.remove(userId); + } + + public int userIdCount() { + return mUidMap.size(); + } + + public int userIdAt(int n) { + return mUidMap.keyAt(n); + } + + public HashMap<String, ArrayList<String>> packagesForUserId(int userId) { + return mUidMap.get(userId); + } + + public int size() { + // total number of pending broadcast entries across all userIds + int num = 0; + for (int i = 0; i< mUidMap.size(); i++) { + num += mUidMap.valueAt(i).size(); + } + return num; + } + + public void clear() { + mUidMap.clear(); + } + + private HashMap<String, ArrayList<String>> getOrAllocate(int userId) { + HashMap<String, ArrayList<String>> map = mUidMap.get(userId); + if (map == null) { + map = new HashMap<String, ArrayList<String>>(); + mUidMap.put(userId, map); + } + return map; + } + } + final PendingPackageBroadcasts mPendingBroadcasts = new PendingPackageBroadcasts(); + // Service Connection to remote media container service to copy // package uri's from external media onto secure containers // or internal storage. @@ -667,16 +730,23 @@ public class PackageManagerService extends IPackageManager.Stub { packages = new String[size]; components = new ArrayList[size]; uids = new int[size]; - Iterator<Map.Entry<String, ArrayList<String>>> - it = mPendingBroadcasts.entrySet().iterator(); - int i = 0; - while (it.hasNext() && i < size) { - Map.Entry<String, ArrayList<String>> ent = it.next(); - packages[i] = ent.getKey(); - components[i] = ent.getValue(); - PackageSetting ps = mSettings.mPackages.get(ent.getKey()); - uids[i] = (ps != null) ? ps.appId : -1; - i++; + int i = 0; // filling out the above arrays + + for (int n = 0; n < mPendingBroadcasts.userIdCount(); n++) { + int packageUserId = mPendingBroadcasts.userIdAt(n); + Iterator<Map.Entry<String, ArrayList<String>>> it + = mPendingBroadcasts.packagesForUserId(packageUserId) + .entrySet().iterator(); + while (it.hasNext() && i < size) { + Map.Entry<String, ArrayList<String>> ent = it.next(); + packages[i] = ent.getKey(); + components[i] = ent.getValue(); + PackageSetting ps = mSettings.mPackages.get(ent.getKey()); + uids[i] = (ps != null) + ? UserHandle.getUid(packageUserId, ps.appId) + : -1; + i++; + } } size = i; mPendingBroadcasts.clear(); @@ -6074,6 +6144,24 @@ public class PackageManagerService extends IPackageManager.Stub { if (sendAdded) { sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, extras, null, null, new int[] {userId}); + try { + IActivityManager am = ActivityManagerNative.getDefault(); + final boolean isSystem = + isSystemApp(pkgSetting) || isUpdatedSystemApp(pkgSetting); + if (isSystem && am.isUserRunning(userId, false)) { + // The just-installed/enabled app is bundled on the system, so presumed + // to be able to run automatically without needing an explicit launch. + // Send it a BOOT_COMPLETED if it would ordinarily have gotten one. + Intent bcIntent = new Intent(Intent.ACTION_BOOT_COMPLETED) + .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES) + .setPackage(packageName); + am.broadcastIntent(null, bcIntent, null, null, 0, null, null, null, + android.app.AppOpsManager.OP_NONE, false, false, userId); + } + } catch (RemoteException e) { + // shouldn't happen + Slog.w(TAG, "Unable to bootstrap installed package", e); + } } } finally { Binder.restoreCallingIdentity(callingId); @@ -9146,18 +9234,22 @@ public class PackageManagerService extends IPackageManager.Stub { } PackageParser.Package p; boolean dataOnly = false; + String libDirPath = null; String asecPath = null; synchronized (mPackages) { p = mPackages.get(packageName); + PackageSetting ps = mSettings.mPackages.get(packageName); if(p == null) { dataOnly = true; - PackageSetting ps = mSettings.mPackages.get(packageName); if((ps == null) || (ps.pkg == null)) { Slog.w(TAG, "Package named '" + packageName +"' doesn't exist."); return false; } p = ps.pkg; } + if (ps != null) { + libDirPath = ps.nativeLibraryPathString; + } if (p != null && (isExternal(p) || isForwardLocked(p))) { String secureContainerId = cidFromCodePath(p.applicationInfo.sourceDir); if (secureContainerId != null) { @@ -9176,8 +9268,8 @@ public class PackageManagerService extends IPackageManager.Stub { publicSrcDir = applicationInfo.publicSourceDir; } } - int res = mInstaller.getSizeInfo(packageName, userHandle, p.mPath, publicSrcDir, - asecPath, pStats); + int res = mInstaller.getSizeInfo(packageName, userHandle, p.mPath, libDirPath, + publicSrcDir, asecPath, pStats); if (res < 0) { return false; } @@ -9523,8 +9615,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } mSettings.writePackageRestrictionsLPr(userId); - packageUid = UserHandle.getUid(userId, pkgSetting.appId); - components = mPendingBroadcasts.get(packageName); + components = mPendingBroadcasts.get(userId, packageName); final boolean newPackage = components == null; if (newPackage) { components = new ArrayList<String>(); @@ -9536,10 +9627,10 @@ public class PackageManagerService extends IPackageManager.Stub { sendNow = true; // Purge entry from pending broadcast list if another one exists already // since we are sending one right away. - mPendingBroadcasts.remove(packageName); + mPendingBroadcasts.remove(userId, packageName); } else { if (newPackage) { - mPendingBroadcasts.put(packageName, components); + mPendingBroadcasts.put(userId, packageName, components); } if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { // Schedule a message @@ -9551,6 +9642,7 @@ public class PackageManagerService extends IPackageManager.Stub { long callingId = Binder.clearCallingIdentity(); try { if (sendNow) { + packageUid = UserHandle.getUid(userId, pkgSetting.appId); sendPackageChangedBroadcast(packageName, (flags&PackageManager.DONT_KILL_APP) != 0, components, packageUid); } @@ -10686,8 +10778,9 @@ public class PackageManagerService extends IPackageManager.Stub { /** Called by UserManagerService */ void cleanUpUserLILPw(int userHandle) { - if (mDirtyUsers.remove(userHandle)); + mDirtyUsers.remove(userHandle); mSettings.removeUserLPr(userHandle); + mPendingBroadcasts.remove(userHandle); if (mInstaller != null) { // Technically, we shouldn't be doing this with the package lock // held. However, this is very rare, and there is already so much diff --git a/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java b/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java index 0ab86e447ad9..5dd30f1bf4d8 100644 --- a/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java +++ b/services/java/com/android/server/updates/SELinuxPolicyInstallReceiver.java @@ -94,11 +94,15 @@ public class SELinuxPolicyInstallReceiver extends ConfigUpdateInstallReceiver { private void unpackBundle() throws IOException { BufferedInputStream stream = new BufferedInputStream(new FileInputStream(updateContent)); - int[] chunkLengths = readChunkLengths(stream); - installFile(new File(updateDir, seappContextsPath), stream, chunkLengths[0]); - installFile(new File(updateDir, propertyContextsPath), stream, chunkLengths[1]); - installFile(new File(updateDir, fileContextsPath), stream, chunkLengths[2]); - installFile(new File(updateDir, sepolicyPath), stream, chunkLengths[3]); + try { + int[] chunkLengths = readChunkLengths(stream); + installFile(new File(updateDir, seappContextsPath), stream, chunkLengths[0]); + installFile(new File(updateDir, propertyContextsPath), stream, chunkLengths[1]); + installFile(new File(updateDir, fileContextsPath), stream, chunkLengths[2]); + installFile(new File(updateDir, sepolicyPath), stream, chunkLengths[3]); + } finally { + IoUtils.closeQuietly(stream); + } } private void applyUpdate() throws IOException, ErrnoException { @@ -124,10 +128,10 @@ public class SELinuxPolicyInstallReceiver extends ConfigUpdateInstallReceiver { private void setEnforcingMode(Context context) { String mode = Settings.Global.getString(context.getContentResolver(), Settings.Global.SELINUX_STATUS); - if (mode.equals("1")) { + if ("1".equals(mode)) { Slog.i(TAG, "Setting enforcing mode"); SystemProperties.set("persist.selinux.enforcing", mode); - } else if (mode.equals("0")) { + } else if ("0".equals(mode)) { Slog.i(TAG, "Tried to set permissive mode, ignoring"); } else { Slog.e(TAG, "Got invalid enforcing mode: " + mode); diff --git a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java index 7ae0fb848da2..f5c4c343eb9b 100644 --- a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java +++ b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java @@ -18,9 +18,12 @@ package com.android.compatibilitytest; import android.app.ActivityManager; import android.app.ActivityManager.ProcessErrorStateInfo; +import android.app.ActivityManager.RunningAppProcessInfo; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.Bundle; import android.test.InstrumentationTestCase; import android.util.Log; @@ -28,9 +31,11 @@ import android.util.Log; import junit.framework.Assert; import java.util.Collection; +import java.util.List; /** - * Application Compatibility Test that launches an application and detects crashes. + * Application Compatibility Test that launches an application and detects + * crashes. */ public class AppCompatibility extends InstrumentationTestCase { @@ -49,10 +54,10 @@ public class AppCompatibility extends InstrumentationTestCase { private Bundle mArgs; @Override - public void setUp() throws Exception{ + public void setUp() throws Exception { super.setUp(); mRunner = (AppCompatibilityRunner) getInstrumentation(); - assertNotNull("Could not fetch InstrumentationTestRunner.",mRunner); + assertNotNull("Could not fetch InstrumentationTestRunner.", mRunner); mContext = mRunner.getTargetContext(); Assert.assertNotNull("Could not get the Context", mContext); @@ -83,7 +88,9 @@ public class AppCompatibility extends InstrumentationTestCase { } /** - * Actual test case that launches the package and throws an exception on the first error. + * Actual test case that launches the package and throws an exception on the + * first error. + * * @throws Exception */ public void testAppStability() throws Exception { @@ -91,9 +98,11 @@ public class AppCompatibility extends InstrumentationTestCase { if (packageName != null) { Log.d(TAG, "Launching app " + packageName); Collection<ProcessErrorStateInfo> err = launchActivity(packageName); - // Make sure there are no errors when launching the application, otherwise raise an + // Make sure there are no errors when launching the application, + // otherwise raise an // exception with the first error encountered. assertNull(getFirstError(err), err); + assertTrue("App crashed after launch.", processStillUp(packageName)); } else { Log.d(TAG, "Missing argument, use " + PACKAGE_TO_LAUNCH + " to specify the package to launch"); @@ -102,6 +111,7 @@ public class AppCompatibility extends InstrumentationTestCase { /** * Gets the first error in collection and return the long message for it. + * * @param in {@link Collection} of {@link ProcessErrorStateInfo} to parse. * @return {@link String} the long message of the error. */ @@ -118,8 +128,11 @@ public class AppCompatibility extends InstrumentationTestCase { /** * Launches and activity and queries for errors. - * @param packageName {@link String} the package name of the application to launch. - * @return {@link Collection} of {@link ProcessErrorStateInfo} detected during the app launch. + * + * @param packageName {@link String} the package name of the application to + * launch. + * @return {@link Collection} of {@link ProcessErrorStateInfo} detected + * during the app launch. */ private Collection<ProcessErrorStateInfo> launchActivity(String packageName) { Intent homeIntent = new Intent(Intent.ACTION_MAIN); @@ -129,14 +142,20 @@ public class AppCompatibility extends InstrumentationTestCase { Intent intent = mPackageManager.getLaunchIntentForPackage(packageName); // Skip if the apk does not have a launch intent. if (intent == null) { + Log.d(TAG, "Skipping " + packageName + "; missing launch intent"); return null; } - // We check for any Crash or ANR dialogs that are already up, and we ignore them. This is - // so that we don't report crashes that were caused by prior apps (which those particular - // tests should have caught and reported already). Otherwise, test failures would cascade - // from the initial broken app to many/all of the tests following that app's launch. - final Collection<ProcessErrorStateInfo> preErr = mActivityManager.getProcessesInErrorState(); + // We check for any Crash or ANR dialogs that are already up, and we + // ignore them. This is + // so that we don't report crashes that were caused by prior apps (which + // those particular + // tests should have caught and reported already). Otherwise, test + // failures would cascade + // from the initial broken app to many/all of the tests following that + // app's launch. + final Collection<ProcessErrorStateInfo> preErr = + mActivityManager.getProcessesInErrorState(); // Launch Activity mContext.startActivity(intent); @@ -155,15 +174,43 @@ public class AppCompatibility extends InstrumentationTestCase { // ignore } - // See if there are any errors. We wait until down here to give ANRs as much time as + // See if there are any errors. We wait until down here to give ANRs as + // much time as // possible to occur. final Collection<ProcessErrorStateInfo> postErr = mActivityManager.getProcessesInErrorState(); - // Take the difference between the error processes we see now, and the ones that were + // Take the difference between the error processes we see now, and the + // ones that were // present when we started if (preErr != null && postErr != null) { postErr.removeAll(preErr); } return postErr; } + + /** + * Determine if a given package is still running. + * + * @param packageName {@link String} package to look for + * @return True if package is running, false otherwise. + */ + private boolean processStillUp(String packageName) { + try { + PackageInfo packageInfo = mPackageManager.getPackageInfo(packageName, 0); + String processName = packageInfo.applicationInfo.processName; + List<RunningAppProcessInfo> runningApps = mActivityManager.getRunningAppProcesses(); + for (RunningAppProcessInfo app : runningApps) { + if (app.processName.equalsIgnoreCase(processName)) { + Log.d(TAG, "Found process " + app.processName); + return true; + } + } + Log.d(TAG, "Failed to find process " + processName + " with package name " + + packageName); + } catch (NameNotFoundException e) { + Log.w(TAG, "Failed to find package " + packageName); + return false; + } + return false; + } } |