diff options
231 files changed, 2736 insertions, 768 deletions
diff --git a/api/current.txt b/api/current.txt index 3b8fa2df92dd..22fe71ef5138 100644 --- a/api/current.txt +++ b/api/current.txt @@ -29528,6 +29528,7 @@ package android.view.accessibility { ctor public AccessibilityNodeProvider(); method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int); method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int); + method public android.view.accessibility.AccessibilityNodeInfo findFocus(int); method public boolean performAction(int, int, android.os.Bundle); } diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 3b88973940ca..961ee5768b94 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -758,6 +758,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + IBinder b = data.readStrongBinder(); + appNotRespondingViaProvider(b); + reply.writeNoException(); + return true; + } + case REMOVE_CONTENT_PROVIDER_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder b = data.readStrongBinder(); @@ -2891,6 +2899,7 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); return res; } + public void unstableProviderDied(IBinder connection) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -2902,6 +2911,18 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } + @Override + public void appNotRespondingViaProvider(IBinder connection) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(connection); + mRemote.transact(APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION, data, reply, 0); + reply.readException(); + data.recycle(); + reply.recycle(); + } + public void removeContentProvider(IBinder connection, boolean stable) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 6605b5b49c21..02faeac0b6bb 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4653,6 +4653,19 @@ public final class ActivityThread { } } + final void appNotRespondingViaProvider(IBinder provider) { + synchronized (mProviderMap) { + ProviderRefCount prc = mProviderRefCountMap.get(provider); + if (prc != null) { + try { + ActivityManagerNative.getDefault() + .appNotRespondingViaProvider(prc.holder.connection); + } catch (RemoteException e) { + } + } + } + } + private ProviderClientRecord installProviderAuthoritiesLocked(IContentProvider provider, ContentProvider localProvider, IActivityManager.ContentProviderHolder holder) { final String auths[] = PATTERN_SEMICOLON.split(holder.info.authority); diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 0ba2ac5fcea2..300424cbf871 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2200,5 +2200,10 @@ class ContextImpl extends Context { public void unstableProviderDied(IContentProvider icp) { mMainThread.handleUnstableProviderDied(icp.asBinder(), true); } + + @Override + public void appNotRespondingViaProvider(IContentProvider icp) { + mMainThread.appNotRespondingViaProvider(icp.asBinder()); + } } } diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index 800ead9b8944..b741cc5c85b3 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -16,6 +16,8 @@ package android.app; +import android.annotation.SdkConstant; +import android.annotation.SdkConstant.SdkConstantType; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; @@ -267,18 +269,21 @@ public class DownloadManager { /** * Broadcast intent action sent by the download manager when a download completes. */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public final static String ACTION_DOWNLOAD_COMPLETE = "android.intent.action.DOWNLOAD_COMPLETE"; /** * Broadcast intent action sent by the download manager when the user clicks on a running * download, either from a system notification or from the downloads UI. */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) public final static String ACTION_NOTIFICATION_CLICKED = "android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED"; /** * Intent action to launch an activity to display all downloads. */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public final static String ACTION_VIEW_DOWNLOADS = "android.intent.action.VIEW_DOWNLOADS"; /** diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 9a7737748d11..dfea73671dc3 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -139,6 +139,7 @@ public interface IActivityManager extends IInterface { public boolean refContentProvider(IBinder connection, int stableDelta, int unstableDelta) throws RemoteException; public void unstableProviderDied(IBinder connection) throws RemoteException; + public void appNotRespondingViaProvider(IBinder connection) throws RemoteException; public PendingIntent getRunningServiceControlPanel(ComponentName service) throws RemoteException; public ComponentName startService(IApplicationThread caller, Intent service, @@ -691,4 +692,5 @@ public interface IActivityManager extends IInterface { int TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+179; int RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+180; int GET_PERSISTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+181; + int APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+182; } diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 2172a7b20699..e2bc80aad66d 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -923,42 +923,6 @@ public final class BluetoothAdapter { } /** - * Create a listening, L2CAP Bluetooth socket. - * <p>A remote device connecting to this socket will optionally be - * authenticated and communication on this socket will optionally be - * encrypted. - * <p>Use {@link BluetoothServerSocket#accept} to retrieve incoming - * connections from a listening {@link BluetoothServerSocket}. - * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} - * @param secure whether security and authentication are required - * @param fixedChannel whether we're looking for a PSM-based connection or a fixed channel - * @param channel L2CAP PSM or channel to use - * @return a listening L2CAP BluetoothServerSocket - * @throws IOException on error, for example Bluetooth not available, or - * insufficient permissions, or channel in use. - * @hide - */ - public BluetoothServerSocket listenUsingL2CapOn(boolean secure, boolean fixedChannel, - int channel) throws IOException { - BluetoothServerSocket socket; - - if (fixedChannel) { - channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN; - } - - socket = new BluetoothServerSocket( - BluetoothSocket.TYPE_L2CAP, secure, secure, channel); - int errno = socket.mSocket.bindListen(); - if (errno != 0) { - //TODO(BT): Throw the same exception error code - // that the previous code was using. - //socket.mSocket.throwErrnoNative(errno); - throw new IOException("Error: " + errno); - } - return socket; - } - - /** * Create a listening, secure RFCOMM Bluetooth socket. * <p>A remote device connecting to this socket will be authenticated and * communication on this socket will be encrypted. diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index 1efdc8186442..5eb642cafb09 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -1172,33 +1172,6 @@ public final class BluetoothDevice implements Parcelable { return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null); } - - /** - * Construct a L2CAP socket ready to start an outgoing connection. - * Call #connect on the returned #BluetoothSocket to begin the connection. - * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} - * - * @param secure select whether security will be required - * @param fixedChannel select if this will be a "fixed channel" L2CAP connection - * or a PSM-based connection - * @param channel fixed channel or PSM to connect to - * @return a L2CAP BluetoothSocket - * @throws IOException on error, for example Bluetooth not available, or - * insufficient permissions. - * @hide - */ - public BluetoothSocket createL2CapSocket(boolean secure, boolean fixedChannel, int channel) - throws IOException { - - if (fixedChannel) { - channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN; - } - - return new BluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, secure, secure, this, - channel, null); - } - - /** * Check that a pin is valid and convert to byte array. * diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index 191bf67af340..d10eaea2fba1 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -103,8 +103,6 @@ public final class BluetoothSocket implements Closeable { /*package*/ static final int SEC_FLAG_ENCRYPT = 1; /*package*/ static final int SEC_FLAG_AUTH = 1 << 1; - /*package*/ static final int PORT_MASK_FIXED_CHAN = 1 << 16; - private final int mType; /* one of TYPE_RFCOMM etc */ private BluetoothDevice mDevice; /* remote device */ private String mAddress; /* remote address */ @@ -117,7 +115,7 @@ public final class BluetoothSocket implements Closeable { private LocalSocket mSocket; private InputStream mSocketIS; private OutputStream mSocketOS; - private int mPort; /* RFCOMM channel or L2CAP psm/channel */ + private int mPort; /* RFCOMM channel or L2CAP psm */ private int mFd; private String mServiceName; private static int PROXY_CONNECTION_TIMEOUT = 5000; diff --git a/core/java/android/content/AsyncTaskLoader.java b/core/java/android/content/AsyncTaskLoader.java index 612c67f01cc0..eb7426e4b261 100644 --- a/core/java/android/content/AsyncTaskLoader.java +++ b/core/java/android/content/AsyncTaskLoader.java @@ -26,6 +26,7 @@ import android.util.TimeUtils; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; /** * Abstract Loader that provides an {@link AsyncTask} to do the work. See @@ -123,6 +124,8 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> { } } + private final Executor mExecutor; + volatile LoadTask mTask; volatile LoadTask mCancellingTask; @@ -131,7 +134,13 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> { Handler mHandler; public AsyncTaskLoader(Context context) { + this(context, AsyncTask.THREAD_POOL_EXECUTOR); + } + + /** {@hide} */ + public AsyncTaskLoader(Context context, Executor executor) { super(context); + mExecutor = executor; } /** @@ -223,7 +232,7 @@ public abstract class AsyncTaskLoader<D> extends Loader<D> { } } if (DEBUG) Slog.v(TAG, "Executing: " + mTask); - mTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); + mTask.executeOnExecutor(mExecutor, (Void[]) null); } } diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index 065079835207..cefc27f331fd 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -16,15 +16,20 @@ package android.content; +import android.content.res.AssetFileDescriptor; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.os.CancellationSignal; import android.os.DeadObjectException; +import android.os.Handler; import android.os.ICancellationSignal; -import android.os.RemoteException; +import android.os.Looper; import android.os.ParcelFileDescriptor; -import android.content.res.AssetFileDescriptor; +import android.os.RemoteException; +import android.util.Log; + +import com.android.internal.annotations.GuardedBy; import dalvik.system.CloseGuard; @@ -45,26 +50,64 @@ import java.util.ArrayList; * until you are finished with the data they have returned. */ public class ContentProviderClient { - private final IContentProvider mContentProvider; + private static final String TAG = "ContentProviderClient"; + + @GuardedBy("ContentProviderClient.class") + private static Handler sAnrHandler; + private final ContentResolver mContentResolver; + private final IContentProvider mContentProvider; private final String mPackageName; private final boolean mStable; - private boolean mReleased; private final CloseGuard mGuard = CloseGuard.get(); - /** - * @hide - */ - ContentProviderClient(ContentResolver contentResolver, - IContentProvider contentProvider, boolean stable) { - mContentProvider = contentProvider; + private long mAnrTimeout; + private NotRespondingRunnable mAnrRunnable; + + private boolean mReleased; + + /** {@hide} */ + ContentProviderClient( + ContentResolver contentResolver, IContentProvider contentProvider, boolean stable) { mContentResolver = contentResolver; + mContentProvider = contentProvider; mPackageName = contentResolver.mPackageName; mStable = stable; + mGuard.open("release"); } + /** {@hide} */ + public void setDetectNotResponding(long timeoutMillis) { + synchronized (ContentProviderClient.class) { + mAnrTimeout = timeoutMillis; + + if (timeoutMillis > 0) { + if (mAnrRunnable == null) { + mAnrRunnable = new NotRespondingRunnable(); + } + if (sAnrHandler == null) { + sAnrHandler = new Handler(Looper.getMainLooper(), null, true /* async */); + } + } else { + mAnrRunnable = null; + } + } + } + + private void beforeRemote() { + if (mAnrRunnable != null) { + sAnrHandler.postDelayed(mAnrRunnable, mAnrTimeout); + } + } + + private void afterRemote() { + if (mAnrRunnable != null) { + sAnrHandler.removeCallbacks(mAnrRunnable); + } + } + /** See {@link ContentProvider#query ContentProvider.query} */ public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs, String sortOrder) throws RemoteException { @@ -72,28 +115,31 @@ public class ContentProviderClient { } /** See {@link ContentProvider#query ContentProvider.query} */ - public Cursor query(Uri url, String[] projection, String selection, - String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal) - throws RemoteException { - ICancellationSignal remoteCancellationSignal = null; - if (cancellationSignal != null) { - cancellationSignal.throwIfCanceled(); - remoteCancellationSignal = mContentProvider.createCancellationSignal(); - cancellationSignal.setRemote(remoteCancellationSignal); - } + public Cursor query(Uri url, String[] projection, String selection, String[] selectionArgs, + String sortOrder, CancellationSignal cancellationSignal) throws RemoteException { + beforeRemote(); try { - return mContentProvider.query(mPackageName, url, projection, selection, selectionArgs, + ICancellationSignal remoteCancellationSignal = null; + if (cancellationSignal != null) { + cancellationSignal.throwIfCanceled(); + remoteCancellationSignal = mContentProvider.createCancellationSignal(); + cancellationSignal.setRemote(remoteCancellationSignal); + } + return mContentProvider.query(mPackageName, url, projection, selection, selectionArgs, sortOrder, remoteCancellationSignal); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#getType ContentProvider.getType} */ public String getType(Uri url) throws RemoteException { + beforeRemote(); try { return mContentProvider.getType(url); } catch (DeadObjectException e) { @@ -101,11 +147,14 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#getStreamTypes ContentProvider.getStreamTypes} */ public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException { + beforeRemote(); try { return mContentProvider.getStreamTypes(url, mimeTypeFilter); } catch (DeadObjectException e) { @@ -113,11 +162,14 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#canonicalize} */ public final Uri canonicalize(Uri url) throws RemoteException { + beforeRemote(); try { return mContentProvider.canonicalize(mPackageName, url); } catch (DeadObjectException e) { @@ -125,11 +177,14 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#uncanonicalize} */ public final Uri uncanonicalize(Uri url) throws RemoteException { + beforeRemote(); try { return mContentProvider.uncanonicalize(mPackageName, url); } catch (DeadObjectException e) { @@ -137,12 +192,14 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#insert ContentProvider.insert} */ - public Uri insert(Uri url, ContentValues initialValues) - throws RemoteException { + public Uri insert(Uri url, ContentValues initialValues) throws RemoteException { + beforeRemote(); try { return mContentProvider.insert(mPackageName, url, initialValues); } catch (DeadObjectException e) { @@ -150,11 +207,14 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#bulkInsert ContentProvider.bulkInsert} */ public int bulkInsert(Uri url, ContentValues[] initialValues) throws RemoteException { + beforeRemote(); try { return mContentProvider.bulkInsert(mPackageName, url, initialValues); } catch (DeadObjectException e) { @@ -162,12 +222,15 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#delete ContentProvider.delete} */ public int delete(Uri url, String selection, String[] selectionArgs) throws RemoteException { + beforeRemote(); try { return mContentProvider.delete(mPackageName, url, selection, selectionArgs); } catch (DeadObjectException e) { @@ -175,12 +238,15 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#update ContentProvider.update} */ public int update(Uri url, ContentValues values, String selection, String[] selectionArgs) throws RemoteException { + beforeRemote(); try { return mContentProvider.update(mPackageName, url, values, selection, selectionArgs); } catch (DeadObjectException e) { @@ -188,6 +254,8 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } @@ -212,19 +280,22 @@ public class ContentProviderClient { */ public ParcelFileDescriptor openFile(Uri url, String mode, CancellationSignal signal) throws RemoteException, FileNotFoundException { - ICancellationSignal remoteSignal = null; - if (signal != null) { - signal.throwIfCanceled(); - remoteSignal = mContentProvider.createCancellationSignal(); - signal.setRemote(remoteSignal); - } + beforeRemote(); try { + ICancellationSignal remoteSignal = null; + if (signal != null) { + signal.throwIfCanceled(); + remoteSignal = mContentProvider.createCancellationSignal(); + signal.setRemote(remoteSignal); + } return mContentProvider.openFile(mPackageName, url, mode, remoteSignal); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } @@ -249,19 +320,22 @@ public class ContentProviderClient { */ public AssetFileDescriptor openAssetFile(Uri url, String mode, CancellationSignal signal) throws RemoteException, FileNotFoundException { - ICancellationSignal remoteSignal = null; - if (signal != null) { - signal.throwIfCanceled(); - remoteSignal = mContentProvider.createCancellationSignal(); - signal.setRemote(remoteSignal); - } + beforeRemote(); try { + ICancellationSignal remoteSignal = null; + if (signal != null) { + signal.throwIfCanceled(); + remoteSignal = mContentProvider.createCancellationSignal(); + signal.setRemote(remoteSignal); + } return mContentProvider.openAssetFile(mPackageName, url, mode, remoteSignal); } catch (DeadObjectException e) { if (!mStable) { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } @@ -275,13 +349,14 @@ public class ContentProviderClient { public final AssetFileDescriptor openTypedAssetFileDescriptor(Uri uri, String mimeType, Bundle opts, CancellationSignal signal) throws RemoteException, FileNotFoundException { - ICancellationSignal remoteSignal = null; - if (signal != null) { - signal.throwIfCanceled(); - remoteSignal = mContentProvider.createCancellationSignal(); - signal.setRemote(remoteSignal); - } + beforeRemote(); try { + ICancellationSignal remoteSignal = null; + if (signal != null) { + signal.throwIfCanceled(); + remoteSignal = mContentProvider.createCancellationSignal(); + signal.setRemote(remoteSignal); + } return mContentProvider.openTypedAssetFile( mPackageName, uri, mimeType, opts, remoteSignal); } catch (DeadObjectException e) { @@ -289,12 +364,15 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#applyBatch ContentProvider.applyBatch} */ public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations) throws RemoteException, OperationApplicationException { + beforeRemote(); try { return mContentProvider.applyBatch(mPackageName, operations); } catch (DeadObjectException e) { @@ -302,12 +380,14 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } /** See {@link ContentProvider#call(String, String, Bundle)} */ - public Bundle call(String method, String arg, Bundle extras) - throws RemoteException { + public Bundle call(String method, String arg, Bundle extras) throws RemoteException { + beforeRemote(); try { return mContentProvider.call(mPackageName, method, arg, extras); } catch (DeadObjectException e) { @@ -315,6 +395,8 @@ public class ContentProviderClient { mContentResolver.unstableProviderDied(mContentProvider); } throw e; + } finally { + afterRemote(); } } @@ -359,7 +441,7 @@ public class ContentProviderClient { } /** {@hide} */ - public static void closeQuietly(ContentProviderClient client) { + public static void releaseQuietly(ContentProviderClient client) { if (client != null) { try { client.release(); @@ -367,4 +449,12 @@ public class ContentProviderClient { } } } + + private class NotRespondingRunnable implements Runnable { + @Override + public void run() { + Log.w(TAG, "Detected provider not responding: " + mContentProvider); + mContentResolver.appNotRespondingViaProvider(mContentProvider); + } + } } diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index f659e20f4940..fbf1fd0aa362 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -287,6 +287,11 @@ public abstract class ContentResolver { /** @hide */ public abstract void unstableProviderDied(IContentProvider icp); + /** @hide */ + public void appNotRespondingViaProvider(IContentProvider icp) { + throw new UnsupportedOperationException("appNotRespondingViaProvider"); + } + /** * Return the MIME type of the given content URL. * diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 798ad7b7fc13..f5ee367c70ca 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -369,10 +369,30 @@ public final class CameraManager { } mDeviceIdList = new ArrayList<String>(); + CameraMetadataNative info = new CameraMetadataNative(); for (int i = 0; i < numCameras; ++i) { // Non-removable cameras use integers starting at 0 for their // identifiers - mDeviceIdList.add(String.valueOf(i)); + boolean isDeviceSupported = false; + try { + mCameraService.getCameraCharacteristics(i, info); + if (!info.isEmpty()) { + isDeviceSupported = true; + } else { + throw new AssertionError("Expected to get non-empty characteristics"); + } + } catch(IllegalArgumentException e) { + // Got a BAD_VALUE from service, meaning that this + // device is not supported. + } catch(CameraRuntimeException e) { + throw e.asChecked(); + } catch(RemoteException e) { + // impossible + } + + if (isDeviceSupported) { + mDeviceIdList.add(String.valueOf(i)); + } } } diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index be556c3d8543..1d6ff7db869b 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -19,6 +19,7 @@ package android.hardware.camera2; import android.hardware.camera2.impl.CameraMetadataNative; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -105,7 +106,9 @@ public abstract class CameraMetadata { Field[] fields = type.getDeclaredFields(); for (Field field : fields) { - if (field.getDeclaringClass().isAssignableFrom(Key.class)) { + // Filter for Keys that are public + if (field.getType().isAssignableFrom(Key.class) && + (field.getModifiers() & Modifier.PUBLIC) != 0) { Key<?> key; try { key = (Key<?>) field.get(instance); diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 30bffc45c9f9..c9626f1b074e 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -60,6 +60,11 @@ public final class CaptureResult extends CameraMetadata { @Override public <T> T get(Key<T> key) { + if (key == STATISTICS_FACES) { // Don't throw IllegalArgumentException + // TODO: Implement android.statistics.faces + return null; + } + return mResults.get(key); } diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index 85ec80368c2a..8bf6e4faf686 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -635,17 +635,18 @@ public final class DocumentsContract { documentUri.getAuthority()); try { return getDocumentThumbnail(client, documentUri, size, signal); - } catch (RemoteException e) { + } catch (Exception e) { + Log.w(TAG, "Failed to load thumbnail for " + documentUri + ": " + e); return null; } finally { - ContentProviderClient.closeQuietly(client); + ContentProviderClient.releaseQuietly(client); } } /** {@hide} */ public static Bitmap getDocumentThumbnail( ContentProviderClient client, Uri documentUri, Point size, CancellationSignal signal) - throws RemoteException { + throws RemoteException, IOException { final Bundle openOpts = new Bundle(); openOpts.putParcelable(DocumentsContract.EXTRA_THUMBNAIL_SIZE, size); @@ -693,9 +694,6 @@ public final class DocumentsContract { } return BitmapFactory.decodeFileDescriptor(fd, null, opts); } - } catch (IOException e) { - Log.w(TAG, "Failed to load thumbnail for " + documentUri + ": " + e); - return null; } finally { IoUtils.closeQuietly(afd); } @@ -717,55 +715,53 @@ public final class DocumentsContract { parentDocumentUri.getAuthority()); try { return createDocument(client, parentDocumentUri, mimeType, displayName); + } catch (Exception e) { + Log.w(TAG, "Failed to create document", e); + return null; } finally { - ContentProviderClient.closeQuietly(client); + ContentProviderClient.releaseQuietly(client); } } /** {@hide} */ public static Uri createDocument(ContentProviderClient client, Uri parentDocumentUri, - String mimeType, String displayName) { + String mimeType, String displayName) throws RemoteException { final Bundle in = new Bundle(); in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(parentDocumentUri)); in.putString(Document.COLUMN_MIME_TYPE, mimeType); in.putString(Document.COLUMN_DISPLAY_NAME, displayName); - try { - final Bundle out = client.call(METHOD_CREATE_DOCUMENT, null, in); - return buildDocumentUri( - parentDocumentUri.getAuthority(), out.getString(Document.COLUMN_DOCUMENT_ID)); - } catch (Exception e) { - Log.w(TAG, "Failed to create document", e); - return null; - } + final Bundle out = client.call(METHOD_CREATE_DOCUMENT, null, in); + return buildDocumentUri( + parentDocumentUri.getAuthority(), out.getString(Document.COLUMN_DOCUMENT_ID)); } /** * Delete the given document. * * @param documentUri document with {@link Document#FLAG_SUPPORTS_DELETE} + * @return if the document was deleted successfully. */ public static boolean deleteDocument(ContentResolver resolver, Uri documentUri) { final ContentProviderClient client = resolver.acquireUnstableContentProviderClient( documentUri.getAuthority()); try { - return deleteDocument(client, documentUri); + deleteDocument(client, documentUri); + return true; + } catch (Exception e) { + Log.w(TAG, "Failed to delete document", e); + return false; } finally { - ContentProviderClient.closeQuietly(client); + ContentProviderClient.releaseQuietly(client); } } /** {@hide} */ - public static boolean deleteDocument(ContentProviderClient client, Uri documentUri) { + public static void deleteDocument(ContentProviderClient client, Uri documentUri) + throws RemoteException { final Bundle in = new Bundle(); in.putString(Document.COLUMN_DOCUMENT_ID, getDocumentId(documentUri)); - try { - final Bundle out = client.call(METHOD_DELETE_DOCUMENT, null, in); - return true; - } catch (Exception e) { - Log.w(TAG, "Failed to delete document", e); - return false; - } + client.call(METHOD_DELETE_DOCUMENT, null, in); } } diff --git a/core/java/android/provider/MediaStore.java b/core/java/android/provider/MediaStore.java index ad6839b63f3f..f69cad096d38 100644 --- a/core/java/android/provider/MediaStore.java +++ b/core/java/android/provider/MediaStore.java @@ -118,6 +118,7 @@ public final class MediaStore { * sense for apps that can support large-scale search of music, such as services connected * to an online database of music which can be streamed and played on the device. */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH = "android.media.action.MEDIA_PLAY_FROM_SEARCH"; @@ -134,6 +135,7 @@ public final class MediaStore { * sense for apps that can support large-scale search of text media, such as services connected * to an online database of books and/or magazines which can be read on the device. */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String INTENT_ACTION_TEXT_OPEN_FROM_SEARCH = "android.media.action.TEXT_OPEN_FROM_SEARCH"; @@ -150,6 +152,7 @@ public final class MediaStore { * sense for apps that can support large-scale search of video, such as services connected to an * online database of videos which can be streamed and played on the device. */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String INTENT_ACTION_VIDEO_PLAY_FROM_SEARCH = "android.media.action.VIDEO_PLAY_FROM_SEARCH"; @@ -202,6 +205,7 @@ public final class MediaStore { /** * The name of the Intent action used to launch a camera in still image mode. */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA"; /** @@ -216,12 +220,14 @@ public final class MediaStore { * this flag is used, so launching more than one activity is strongly * discouraged. */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE = "android.media.action.STILL_IMAGE_CAMERA_SECURE"; /** * The name of the Intent action used to launch a camera in video mode. */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA"; /** @@ -235,6 +241,7 @@ public final class MediaStore { * value of EXTRA_OUTPUT. * @see #EXTRA_OUTPUT */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public final static String ACTION_IMAGE_CAPTURE = "android.media.action.IMAGE_CAPTURE"; /** @@ -256,6 +263,7 @@ public final class MediaStore { * @see #ACTION_IMAGE_CAPTURE * @see #EXTRA_OUTPUT */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_IMAGE_CAPTURE_SECURE = "android.media.action.IMAGE_CAPTURE_SECURE"; @@ -274,6 +282,7 @@ public final class MediaStore { * @see #EXTRA_SIZE_LIMIT * @see #EXTRA_DURATION_LIMIT */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public final static String ACTION_VIDEO_CAPTURE = "android.media.action.VIDEO_CAPTURE"; /** diff --git a/core/java/android/util/Log.java b/core/java/android/util/Log.java index 6a6f027f8088..8c1cf5fec8a1 100644 --- a/core/java/android/util/Log.java +++ b/core/java/android/util/Log.java @@ -84,14 +84,14 @@ public final class Log { public static final int ASSERT = 7; /** - * Exception class used to capture a stack trace in {@link #wtf()}. + * Exception class used to capture a stack trace in {@link #wtf}. */ private static class TerribleFailure extends Exception { TerribleFailure(String msg, Throwable cause) { super(msg, cause); } } /** - * Interface to handle terrible failures from {@link #wtf()}. + * Interface to handle terrible failures from {@link #wtf}. * * @hide */ @@ -257,6 +257,15 @@ public final class Log { } /** + * Like {@link #wtf(String, String)}, but also writes to the log the full + * call stack. + * @hide + */ + public static int wtfStack(String tag, String msg) { + return wtfStack(LOG_ID_MAIN, tag, msg); + } + + /** * What a Terrible Failure: Report an exception that should never happen. * Similar to {@link #wtf(String, String)}, with an exception to log. * @param tag Used to identify the source of a log message. @@ -274,8 +283,18 @@ public final class Log { * @param tr An exception to log. May be null. */ public static int wtf(String tag, String msg, Throwable tr) { + return wtf(LOG_ID_MAIN, tag, msg, tr); + } + + static int wtfStack(int logId, String tag, String msg) { + TerribleFailure here = new TerribleFailure("here", null); + here.fillInStackTrace(); + return wtf(logId, tag, msg, here); + } + + static int wtf(int logId, String tag, String msg, Throwable tr) { TerribleFailure what = new TerribleFailure(msg, tr); - int bytes = println_native(LOG_ID_MAIN, ASSERT, tag, msg + '\n' + getStackTraceString(tr)); + int bytes = println_native(logId, ASSERT, tag, msg + '\n' + getStackTraceString(tr)); sWtfHandler.onTerribleFailure(tag, what); return bytes; } diff --git a/core/java/android/util/Slog.java b/core/java/android/util/Slog.java index ecf5ea153c2e..a5c22ffbacd1 100644 --- a/core/java/android/util/Slog.java +++ b/core/java/android/util/Slog.java @@ -78,6 +78,22 @@ public final class Slog { msg + '\n' + Log.getStackTraceString(tr)); } + public static int wtf(String tag, String msg) { + return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, null); + } + + public static int wtfStack(String tag, String msg) { + return Log.wtfStack(Log.LOG_ID_SYSTEM, tag, msg); + } + + public static int wtf(String tag, Throwable tr) { + return Log.wtf(Log.LOG_ID_SYSTEM, tag, tr.getMessage(), tr); + } + + public static int wtf(String tag, String msg, Throwable tr) { + return Log.wtf(Log.LOG_ID_SYSTEM, tag, msg, tr); + } + public static int println(int priority, String tag, String msg) { return Log.println_native(Log.LOG_ID_SYSTEM, priority, tag, msg); } diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index e835a9708169..41d37001b848 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -423,9 +423,15 @@ final class AccessibilityInteractionController { } } break; case AccessibilityNodeInfo.FOCUS_INPUT: { - // Input focus cannot go to virtual views. View target = root.findFocus(); - if (target != null && isShown(target)) { + if (target == null || !isShown(target)) { + break; + } + AccessibilityNodeProvider provider = target.getAccessibilityNodeProvider(); + if (provider != null) { + focused = provider.findFocus(focusType); + } + if (focused == null) { focused = target.createAccessibilityNodeInfo(); } } break; diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index c283170ad3dd..316cbf0f3760 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -483,7 +483,7 @@ public class SurfaceView extends View { | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE ; if (!getContext().getResources().getCompatibilityInfo().supportsScreen()) { - mLayout.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; + mLayout.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; } mLayout.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index c4ce6541ae33..9a47cd441a96 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5381,6 +5381,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, info.setAccessibilityFocused(isAccessibilityFocused()); info.setSelected(isSelected()); info.setLongClickable(isLongClickable()); + info.setLiveRegion(getAccessibilityLiveRegion()); // TODO: These make sense only if we are in an AdapterView but all // views can be selected. Maybe from accessibility perspective diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 0e17b7254d0c..b66b0bc74671 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -82,7 +82,6 @@ import java.io.OutputStream; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashSet; -import java.util.Locale; /** * The top of a view hierarchy, implementing the needed protocol between View @@ -468,7 +467,7 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_LAYOUT) Log.d(TAG, "WindowLayout in setView:" + attrs); if (!compatibilityInfo.supportsScreen()) { - attrs.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; + attrs.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; mLastInCompatMode = true; } @@ -750,7 +749,7 @@ public final class ViewRootImpl implements ViewParent, mClientWindowLayoutFlags = attrs.flags; // preserve compatible window flag if exists. int compatibleWindowFlag = - mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; + mWindowAttributes.flags & WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; // transfer over system UI visibility values as they carry current state. attrs.systemUiVisibility = mWindowAttributes.systemUiVisibility; attrs.subtreeSystemUiVisibility = mWindowAttributes.subtreeSystemUiVisibility; @@ -1147,10 +1146,10 @@ public final class ViewRootImpl implements ViewParent, mFullRedrawNeeded = true; mLayoutRequested = true; if (mLastInCompatMode) { - params.flags &= ~WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; + params.flags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; mLastInCompatMode = false; } else { - params.flags |= WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; + params.flags |= WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; mLastInCompatMode = true; } } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index c9c74e7603e0..53f4d773b40d 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -841,6 +841,15 @@ public interface WindowManager extends ViewManager { // ----- HIDDEN FLAGS. // These start at the high bit and go down. + /** + * Flag for a window in local focus mode. + * Window in local focus mode can control focus independent of window manager using + * {@link Window#setLocalFocus(boolean, boolean)}. + * Usually window in this mode will not get touch/key events from window manager, but will + * get events only via local injection using {@link Window#injectInputEvent(InputEvent)}. + */ + public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000; + /** Window flag: Enable touches to slide out of a window into neighboring * windows in mid-gesture instead of being captured for the duration of * the gesture. @@ -851,7 +860,7 @@ public interface WindowManager extends ViewManager { * * {@hide} */ - public static final int FLAG_SLIPPERY = 0x04000000; + public static final int FLAG_SLIPPERY = 0x20000000; /** * Flag for a window belonging to an activity that responds to {@link KeyEvent#KEYCODE_MENU} @@ -864,29 +873,8 @@ public interface WindowManager extends ViewManager { * * {@hide} */ - public static final int FLAG_NEEDS_MENU_KEY = 0x08000000; + public static final int FLAG_NEEDS_MENU_KEY = 0x40000000; - /** - * Flag for a window in local focus mode. - * Window in local focus mode can control focus independent of window manager using - * {@link Window#setLocalFocus(boolean, boolean)}. - * Usually window in this mode will not get touch/key events from window manager, but will - * get events only via local injection using {@link Window#injectInputEvent(InputEvent)}. - */ - public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000; - - /** Window flag: special flag to limit the size of the window to be - * original size ([320x480] x density). Used to create window for applications - * running under compatibility mode. - * - * {@hide} */ - public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000; - - /** Window flag: a special option intended for system dialogs. When - * this flag is set, the window will demand focus unconditionally when - * it is created. - * {@hide} */ - public static final int FLAG_SYSTEM_ERROR = 0x40000000; /** * Various behavioral options/flags. Default is none. @@ -1045,6 +1033,19 @@ public interface WindowManager extends ViewManager { * {@hide} */ public static final int PRIVATE_FLAG_NO_MOVE_ANIMATION = 0x00000040; + /** Window flag: special flag to limit the size of the window to be + * original size ([320x480] x density). Used to create window for applications + * running under compatibility mode. + * + * {@hide} */ + public static final int PRIVATE_FLAG_COMPATIBLE_WINDOW = 0x00000080; + + /** Window flag: a special option intended for system dialogs. When + * this flag is set, the window will demand focus unconditionally when + * it is created. + * {@hide} */ + public static final int PRIVATE_FLAG_SYSTEM_ERROR = 0x00000100; + /** * Control flags that are private to the platform. * @hide @@ -1783,7 +1784,7 @@ public interface WindowManager extends ViewManager { sb.append(" rotAnim="); sb.append(rotationAnimation); } - if ((flags & FLAG_COMPATIBLE_WINDOW) != 0) { + if ((flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0) { sb.append(" compatible=true"); } if (systemUiVisibility != 0) { diff --git a/core/java/android/view/accessibility/AccessibilityNodeProvider.java b/core/java/android/view/accessibility/AccessibilityNodeProvider.java index 688cbdf3c9f7..718c32fd8d25 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeProvider.java +++ b/core/java/android/view/accessibility/AccessibilityNodeProvider.java @@ -132,4 +132,19 @@ public abstract class AccessibilityNodeProvider { int virtualViewId) { return null; } + + /** + * Find the virtual view, i.e. a descendant of the host View, that has the + * specified focus type. + * + * @param focus The focus to find. One of + * {@link AccessibilityNodeInfo#FOCUS_INPUT} or + * {@link AccessibilityNodeInfo#FOCUS_ACCESSIBILITY}. + * @return The node info of the focused view or null. + * @see AccessibilityNodeInfo#FOCUS_INPUT + * @see AccessibilityNodeInfo#FOCUS_ACCESSIBILITY + */ + public AccessibilityNodeInfo findFocus(int focus) { + return null; + } } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 4680267ab8e1..636641d9ca70 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2254,6 +2254,13 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } } else { isScrap[0] = true; + + // Clear any system-managed transient state so that we can + // recycle this view and bind it to different data. + if (child.isAccessibilityFocused()) { + child.clearAccessibilityFocus(); + } + child.dispatchFinishTemporaryDetach(); } } else { @@ -5073,6 +5080,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te count++; int position = firstPosition + i; if (position >= headerViewsCount && position < footerViewsStart) { + // The view will be rebound to new data, clear any + // system-managed transient state. + if (child.isAccessibilityFocused()) { + child.clearAccessibilityFocus(); + } mRecycler.addScrapView(child, position); } } @@ -5091,6 +5103,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te count++; int position = firstPosition + i; if (position >= headerViewsCount && position < footerViewsStart) { + // The view will be rebound to new data, clear any + // system-managed transient state. + if (child.isAccessibilityFocused()) { + child.clearAccessibilityFocus(); + } mRecycler.addScrapView(child, position); } } @@ -6664,8 +6681,8 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te lp.scrappedFromPosition = position; - // Don't scrap header or footer views, or views that should - // otherwise not be recycled. + // Remove but don't scrap header or footer views, or views that + // should otherwise not be recycled. final int viewType = lp.viewType; if (!shouldRecycleViewType(viewType)) { return; @@ -6704,6 +6721,11 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te mScrapViews[viewType].add(scrap); } + // Clear any system-managed transient state. + if (scrap.isAccessibilityFocused()) { + scrap.clearAccessibilityFocus(); + } + scrap.setAccessibilityDelegate(null); if (mRecyclerListener != null) { diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java index bb4a4cff902c..30752e00d542 100644 --- a/core/java/android/widget/EdgeEffect.java +++ b/core/java/android/widget/EdgeEffect.java @@ -68,6 +68,8 @@ public class EdgeEffect { // Minimum velocity that will be absorbed private static final int MIN_VELOCITY = 100; + // Maximum velocity, clamps at this value + private static final int MAX_VELOCITY = 10000; private static final float EPSILON = 0.001f; @@ -115,7 +117,7 @@ public class EdgeEffect { private static final float PULL_DISTANCE_ALPHA_GLOW_FACTOR = 1.1f; private static final int VELOCITY_EDGE_FACTOR = 8; - private static final int VELOCITY_GLOW_FACTOR = 16; + private static final int VELOCITY_GLOW_FACTOR = 12; private int mState = STATE_IDLE; @@ -283,10 +285,10 @@ public class EdgeEffect { */ public void onAbsorb(int velocity) { mState = STATE_ABSORB; - velocity = Math.max(MIN_VELOCITY, Math.abs(velocity)); + velocity = Math.min(Math.max(MIN_VELOCITY, Math.abs(velocity)), MAX_VELOCITY); mStartTime = AnimationUtils.currentAnimationTimeMillis(); - mDuration = 0.1f + (velocity * 0.03f); + mDuration = 0.15f + (velocity * 0.02f); // The edge should always be at least partially visible, regardless // of velocity. @@ -294,7 +296,7 @@ public class EdgeEffect { mEdgeScaleY = mEdgeScaleYStart = 0.f; // The glow depends more on the velocity, and therefore starts out // nearly invisible. - mGlowAlphaStart = 0.5f; + mGlowAlphaStart = 0.3f; mGlowScaleYStart = 0.f; // Factor the velocity by 8. Testing on device shows this works best to diff --git a/core/java/com/android/internal/app/ProcessStats.java b/core/java/com/android/internal/app/ProcessStats.java index a95bac818c8b..430e43a2c59b 100644 --- a/core/java/com/android/internal/app/ProcessStats.java +++ b/core/java/com/android/internal/app/ProcessStats.java @@ -44,6 +44,7 @@ import java.util.Objects; public final class ProcessStats implements Parcelable { static final String TAG = "ProcessStats"; static final boolean DEBUG = false; + static final boolean DEBUG_PARCEL = false; public static final String SERVICE_NAME = "procstats"; @@ -1076,7 +1077,7 @@ public final class ProcessStats implements Parcelable { final int[] table = new int[size]; for (int i=0; i<size; i++) { table[i] = in.readInt(); - if (DEBUG) Slog.i(TAG, "Reading in " + name + " table #" + i + ": " + if (DEBUG_PARCEL) Slog.i(TAG, "Reading in " + name + " table #" + i + ": " + ProcessStats.printLongOffset(table[i])); if (!validateLongOffset(table[i])) { Slog.w(TAG, "Ignoring existing stats; bad " + what + " table entry: " @@ -1294,10 +1295,10 @@ public final class ProcessStats implements Parcelable { byte[] data = new byte[initialAvail > 0 ? (initialAvail+1) : 16384]; while (true) { int amt = stream.read(data, pos, data.length-pos); - if (DEBUG) Slog.i("foo", "Read " + amt + " bytes at " + pos + if (DEBUG_PARCEL) Slog.i("foo", "Read " + amt + " bytes at " + pos + " of avail " + data.length); if (amt < 0) { - if (DEBUG) Slog.i("foo", "**** FINISHED READING: pos=" + pos + if (DEBUG_PARCEL) Slog.i("foo", "**** FINISHED READING: pos=" + pos + " len=" + data.length); outLen[0] = pos; return data; @@ -1305,7 +1306,7 @@ public final class ProcessStats implements Parcelable { pos += amt; if (pos >= data.length) { byte[] newData = new byte[pos+16384]; - if (DEBUG) Slog.i(TAG, "Copying " + pos + " bytes to new array len " + if (DEBUG_PARCEL) Slog.i(TAG, "Copying " + pos + " bytes to new array len " + newData.length); System.arraycopy(data, 0, newData, 0, pos); data = newData; @@ -1422,12 +1423,13 @@ public final class ProcessStats implements Parcelable { return; } } - if (DEBUG) Slog.d(TAG, "Adding process: " + procName + " " + uid + " " + proc); + if (DEBUG_PARCEL) Slog.d(TAG, "Adding process: " + procName + " " + uid + + " " + proc); mProcesses.put(procName, uid, proc); } } - if (DEBUG) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); + if (DEBUG_PARCEL) Slog.d(TAG, "Read " + mProcesses.getMap().size() + " processes"); int NPKG = in.readInt(); if (NPKG < 0) { @@ -1468,10 +1470,10 @@ public final class ProcessStats implements Parcelable { return; } int hasProc = in.readInt(); - if (DEBUG) Slog.d(TAG, "Reading package " + pkgName + " " + uid + if (DEBUG_PARCEL) Slog.d(TAG, "Reading package " + pkgName + " " + uid + " process " + procName + " hasProc=" + hasProc); ProcessState commonProc = mProcesses.get(procName, uid); - if (DEBUG) Slog.d(TAG, "Got common proc " + procName + " " + uid + if (DEBUG_PARCEL) Slog.d(TAG, "Got common proc " + procName + " " + uid + ": " + commonProc); if (commonProc == null) { mReadError = "no common proc: " + procName; @@ -1493,11 +1495,11 @@ public final class ProcessStats implements Parcelable { return; } } - if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: " + if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " + procName + " " + uid + " " + proc); pkgState.mProcesses.put(procName, proc); } else { - if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " process: " + if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " process: " + procName + " " + uid + " " + commonProc); pkgState.mProcesses.put(procName, commonProc); } @@ -1522,7 +1524,7 @@ public final class ProcessStats implements Parcelable { if (!serv.readFromParcel(in)) { return; } - if (DEBUG) Slog.d(TAG, "Adding package " + pkgName + " service: " + if (DEBUG_PARCEL) Slog.d(TAG, "Adding package " + pkgName + " service: " + serviceName + " " + uid + " " + serv); pkgState.mServices.put(serviceName, serv); } @@ -1531,7 +1533,7 @@ public final class ProcessStats implements Parcelable { mIndexToCommonString = null; - if (DEBUG) Slog.d(TAG, "Successfully read procstats!"); + if (DEBUG_PARCEL) Slog.d(TAG, "Successfully read procstats!"); } int addLongData(int index, int type, int num) { @@ -1577,7 +1579,7 @@ public final class ProcessStats implements Parcelable { if (idx >= LONGS_SIZE) { return false; } - if (DEBUG) Slog.d(TAG, "Validated long " + printLongOffset(off) + if (DEBUG_PARCEL) Slog.d(TAG, "Validated long " + printLongOffset(off) + ": " + getLong(off, 0)); return true; } @@ -1639,13 +1641,16 @@ public final class ProcessStats implements Parcelable { if (commonProc == null) { commonProc = new ProcessState(this, packageName, uid, processName); mProcesses.put(processName, uid, commonProc); + if (DEBUG) Slog.d(TAG, "GETPROC created new common " + commonProc); } if (!commonProc.mMultiPackage) { if (packageName.equals(commonProc.mPackage)) { // This common process is not in use by multiple packages, and // is for the calling package, so we can just use it directly. ps = commonProc; + if (DEBUG) Slog.d(TAG, "GETPROC also using for pkg " + commonProc); } else { + if (DEBUG) Slog.d(TAG, "GETPROC need to split common proc!"); // This common process has not been in use by multiple packages, // but it was created for a different package than the caller. // We need to convert it to a multi-package process. @@ -1659,22 +1664,39 @@ public final class ProcessStats implements Parcelable { // that under the now unique state for its original package name. final PackageState commonPkgState = getPackageStateLocked(commonProc.mPackage, uid); if (commonPkgState != null) { - commonPkgState.mProcesses.put(commonProc.mName, commonProc.clone( - commonProc.mPackage, now)); + ProcessState cloned = commonProc.clone(commonProc.mPackage, now); + if (DEBUG) Slog.d(TAG, "GETPROC setting clone to pkg " + commonProc.mPackage + + ": " + cloned); + commonPkgState.mProcesses.put(commonProc.mName, cloned); + // If this has active services, we need to update their process pointer + // to point to the new package-specific process state. + for (int i=commonPkgState.mServices.size()-1; i>=0; i--) { + ServiceState ss = commonPkgState.mServices.valueAt(i); + if (ss.mProc == commonProc) { + if (DEBUG) Slog.d(TAG, "GETPROC switching service to cloned: " + + ss); + ss.mProc = cloned; + } else if (DEBUG) { + Slog.d(TAG, "GETPROC leaving proc of " + ss); + } + } } else { Slog.w(TAG, "Cloning proc state: no package state " + commonProc.mPackage + "/" + uid + " for proc " + commonProc.mName); } // And now make a fresh new process state for the new package name. ps = new ProcessState(commonProc, packageName, uid, processName, now); + if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); } } else { // The common process is for multiple packages, we need to create a // separate object for the per-package data. ps = new ProcessState(commonProc, packageName, uid, processName, SystemClock.uptimeMillis()); + if (DEBUG) Slog.d(TAG, "GETPROC created new pkg " + ps); } pkgState.mProcesses.put(processName, ps); + if (DEBUG) Slog.d(TAG, "GETPROC adding new pkg " + ps); return ps; } @@ -1683,12 +1705,14 @@ public final class ProcessStats implements Parcelable { final ProcessStats.PackageState as = getPackageStateLocked(packageName, uid); ProcessStats.ServiceState ss = as.mServices.get(className); if (ss != null) { + if (DEBUG) Slog.d(TAG, "GETSVC: returning existing " + ss); return ss; } final ProcessStats.ProcessState ps = processName != null ? getProcessStateLocked(packageName, uid, processName) : null; ss = new ProcessStats.ServiceState(this, packageName, className, processName, ps); as.mServices.put(className, ss); + if (DEBUG) Slog.d(TAG, "GETSVC: creating " + ss + " in " + ps); return ss; } @@ -1719,7 +1743,7 @@ public final class ProcessStats implements Parcelable { } public void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpSummary, - boolean dumpAll) { + boolean dumpAll, boolean activeOnly) { long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, mStartTime, now); ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); @@ -1746,6 +1770,11 @@ public final class ProcessStats implements Parcelable { if (!dumpSummary || dumpAll) { for (int iproc=0; iproc<NPROCS; iproc++) { ProcessState proc = pkgState.mProcesses.valueAt(iproc); + if (activeOnly && !proc.isInUse()) { + pw.print(" (Not active: "); + pw.print(pkgState.mProcesses.keyAt(iproc)); pw.println(")"); + continue; + } pw.print(" Process "); pw.print(pkgState.mProcesses.keyAt(iproc)); pw.print(" ("); @@ -1761,12 +1790,22 @@ public final class ProcessStats implements Parcelable { } else { ArrayList<ProcessState> procs = new ArrayList<ProcessState>(); for (int iproc=0; iproc<NPROCS; iproc++) { - procs.add(pkgState.mProcesses.valueAt(iproc)); + ProcessState proc = pkgState.mProcesses.valueAt(iproc); + if (activeOnly && !proc.isInUse()) { + continue; + } + procs.add(proc); } dumpProcessSummaryLocked(pw, " ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ, NON_CACHED_PROC_STATES, now, totalTime); } for (int isvc=0; isvc<NSRVS; isvc++) { + ServiceState svc = pkgState.mServices.valueAt(isvc); + if (activeOnly && !svc.isInUse()) { + pw.print(" (Not active: "); + pw.print(pkgState.mServices.keyAt(isvc)); pw.println(")"); + continue; + } if (dumpAll) { pw.print(" Service "); } else { @@ -1774,7 +1813,6 @@ public final class ProcessStats implements Parcelable { } pw.print(pkgState.mServices.keyAt(isvc)); pw.println(":"); - ServiceState svc = pkgState.mServices.valueAt(isvc); pw.print(" Process: "); pw.println(svc.mProcessName); dumpServiceStats(pw, " ", " ", " ", "Running", svc, svc.mRunCount, ServiceState.SERVICE_RUN, svc.mRunState, @@ -1789,7 +1827,9 @@ public final class ProcessStats implements Parcelable { svc.mExecCount, ServiceState.SERVICE_EXEC, svc.mExecState, svc.mExecStartTime, now, totalTime, !dumpSummary || dumpAll); if (dumpAll) { - pw.print(" mActive="); pw.println(svc.mActive); + if (svc.mOwner != null) { + pw.print(" mOwner="); pw.println(svc.mOwner); + } } } } @@ -1816,6 +1856,10 @@ public final class ProcessStats implements Parcelable { pw.println("Per-Process Stats:"); printedHeader = true; } + if (activeOnly && !proc.isInUse()) { + pw.print(" (Not active: "); pw.print(procName); pw.println(")"); + continue; + } pw.print(" * "); pw.print(procName); pw.print(" / "); UserHandle.formatUid(pw, uid); pw.print(" ("); pw.print(proc.mDurationsTableSize); @@ -1838,7 +1882,7 @@ public final class ProcessStats implements Parcelable { pw.println(); if (dumpSummary) { pw.println("Summary:"); - dumpSummaryLocked(pw, reqPackage, now); + dumpSummaryLocked(pw, reqPackage, now, activeOnly); } else { dumpTotalsLocked(pw, now); } @@ -1916,11 +1960,11 @@ public final class ProcessStats implements Parcelable { } } - public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now) { + public void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now, boolean activeOnly) { long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor, mStartTime, now); dumpFilteredSummaryLocked(pw, null, " ", ALL_SCREEN_ADJ, ALL_MEM_ADJ, - ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage); + ALL_PROC_STATES, NON_CACHED_PROC_STATES, now, totalTime, reqPackage, activeOnly); pw.println(); dumpTotalsLocked(pw, now); } @@ -1961,9 +2005,9 @@ public final class ProcessStats implements Parcelable { void dumpFilteredSummaryLocked(PrintWriter pw, String header, String prefix, int[] screenStates, int[] memStates, int[] procStates, - int[] sortProcStates, long now, long totalTime, String reqPackage) { + int[] sortProcStates, long now, long totalTime, String reqPackage, boolean activeOnly) { ArrayList<ProcessState> procs = collectProcessesLocked(screenStates, memStates, - procStates, sortProcStates, now, reqPackage); + procStates, sortProcStates, now, reqPackage, activeOnly); if (procs.size() > 0) { if (header != null) { pw.println(); @@ -1975,7 +2019,8 @@ public final class ProcessStats implements Parcelable { } public ArrayList<ProcessState> collectProcessesLocked(int[] screenStates, int[] memStates, - int[] procStates, int sortProcStates[], long now, String reqPackage) { + int[] procStates, int sortProcStates[], long now, String reqPackage, + boolean activeOnly) { ArraySet<ProcessState> foundProcs = new ArraySet<ProcessState>(); ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap(); for (int ip=0; ip<pkgMap.size(); ip++) { @@ -1987,6 +2032,9 @@ public final class ProcessStats implements Parcelable { PackageState state = procs.valueAt(iu); for (int iproc=0; iproc<state.mProcesses.size(); iproc++) { ProcessState proc = state.mProcesses.valueAt(iproc); + if (activeOnly && !proc.isInUse()) { + continue; + } foundProcs.add(proc.mCommonProcess); } } @@ -1994,8 +2042,7 @@ public final class ProcessStats implements Parcelable { ArrayList<ProcessState> outProcs = new ArrayList<ProcessState>(foundProcs.size()); for (int i=0; i<foundProcs.size(); i++) { ProcessState proc = foundProcs.valueAt(i); - if (computeProcessTimeLocked(proc, screenStates, memStates, - procStates, now) > 0) { + if (computeProcessTimeLocked(proc, screenStates, memStates, procStates, now) > 0) { outProcs.add(proc); if (procStates != sortProcStates) { computeProcessTimeLocked(proc, screenStates, memStates, sortProcStates, now); @@ -2229,7 +2276,7 @@ public final class ProcessStats implements Parcelable { void writeDurationsToParcel(Parcel out) { out.writeInt(mDurationsTableSize); for (int i=0; i<mDurationsTableSize; i++) { - if (DEBUG) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": " + if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " dur #" + i + ": " + printLongOffset(mDurationsTable[i])); out.writeInt(mDurationsTable[i]); } @@ -2350,6 +2397,7 @@ public final class ProcessStats implements Parcelable { pnew.mAvgCachedKillPss = mAvgCachedKillPss; pnew.mMaxCachedKillPss = mMaxCachedKillPss; pnew.mActive = mActive; + pnew.mNumActiveServices = mNumActiveServices; pnew.mNumStartedServices = mNumStartedServices; return pnew; } @@ -2396,7 +2444,7 @@ public final class ProcessStats implements Parcelable { if (!mDead) { return; } - throw new IllegalStateException("ProcessState dead: name=" + mName + Slog.wtfStack(TAG, "ProcessState dead: name=" + mName + " pkg=" + mPackage + " uid=" + mUid + " common.name=" + mCommonProcess.mName); } @@ -2405,7 +2453,7 @@ public final class ProcessStats implements Parcelable { writeDurationsToParcel(out); out.writeInt(mPssTableSize); for (int i=0; i<mPssTableSize; i++) { - if (DEBUG) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": " + if (DEBUG_PARCEL) Slog.i(TAG, "Writing in " + mName + " pss #" + i + ": " + printLongOffset(mPssTable[i])); out.writeInt(mPssTable[i]); } @@ -2424,11 +2472,11 @@ public final class ProcessStats implements Parcelable { if (fully) { mMultiPackage = multiPackage; } - if (DEBUG) Slog.d(TAG, "Reading durations table..."); + if (DEBUG_PARCEL) Slog.d(TAG, "Reading durations table..."); if (!readDurationsFromParcel(in)) { return false; } - if (DEBUG) Slog.d(TAG, "Reading pss table..."); + if (DEBUG_PARCEL) Slog.d(TAG, "Reading pss table..."); mPssTable = mStats.readTableFromParcel(in, mName, "pss"); if (mPssTable == BAD_TABLE) { return false; @@ -2512,21 +2560,34 @@ public final class ProcessStats implements Parcelable { mStartTime = now; } - void incActiveServices() { + void incActiveServices(String serviceName) { + if (DEBUG && "".equals(mName)) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Slog.d(TAG, "incActiveServices: " + this + " service=" + serviceName + + " to " + (mNumActiveServices+1), here); + } if (mCommonProcess != this) { - mCommonProcess.incActiveServices(); + mCommonProcess.incActiveServices(serviceName); } mNumActiveServices++; } - void decActiveServices() { + void decActiveServices(String serviceName) { + if (DEBUG && "".equals(mName)) { + RuntimeException here = new RuntimeException("here"); + here.fillInStackTrace(); + Slog.d(TAG, "decActiveServices: " + this + " service=" + serviceName + + " to " + (mNumActiveServices-1), here); + } if (mCommonProcess != this) { - mCommonProcess.decActiveServices(); + mCommonProcess.decActiveServices(serviceName); } mNumActiveServices--; if (mNumActiveServices < 0) { - throw new IllegalStateException("Proc active services underrun: pkg=" - + mPackage + " uid=" + mUid + " name=" + mName); + Slog.wtfStack(TAG, "Proc active services underrun: pkg=" + mPackage + + " uid=" + mUid + " proc=" + mName + " service=" + serviceName); + mNumActiveServices = 0; } } @@ -2548,8 +2609,9 @@ public final class ProcessStats implements Parcelable { if (mNumStartedServices == 0 && mCurState == STATE_SERVICE_RESTARTING) { setState(STATE_NOTHING, memFactor, now, null); } else if (mNumStartedServices < 0) { - throw new IllegalStateException("Proc started services underrun: pkg=" + Slog.wtfStack(TAG, "Proc started services underrun: pkg=" + mPackage + " uid=" + mUid + " name=" + mName); + mNumStartedServices = 0; } } @@ -2689,8 +2751,7 @@ public final class ProcessStats implements Parcelable { // The array map is still pointing to a common process state // that is now shared across packages. Update it to point to // the new per-package state. - ProcessState proc = mStats.mPackages.get(pkgName, - mUid).mProcesses.get(mName); + ProcessState proc = mStats.mPackages.get(pkgName, mUid).mProcesses.get(mName); if (proc == null) { throw new IllegalStateException("Didn't create per-package process"); } @@ -2717,11 +2778,13 @@ public final class ProcessStats implements Parcelable { PackageState pkg = mStats.mPackages.get(pkgList.keyAt(index), proc.mUid); if (pkg == null) { throw new IllegalStateException("No existing package " - + pkgList.keyAt(index) + " for multi-proc " + proc.mName); + + pkgList.keyAt(index) + "/" + proc.mUid + + " for multi-proc " + proc.mName); } proc = pkg.mProcesses.get(proc.mName); if (proc == null) { - throw new IllegalStateException("Didn't create per-package process"); + throw new IllegalStateException("Didn't create per-package process " + + proc.mName + " in pkg " + pkg.mPackageName + "/" + pkg.mUid); } pkgList.setValueAt(index, proc); } @@ -2770,6 +2833,17 @@ public final class ProcessStats implements Parcelable { int idx = binarySearch(mPssTable, mPssTableSize, state); return idx >= 0 ? mStats.getLong(mPssTable[idx], PSS_USS_MAXIMUM) : 0; } + + public String toString() { + StringBuilder sb = new StringBuilder(128); + sb.append("ProcessState{").append(Integer.toHexString(System.identityHashCode(this))) + .append(" ").append(mName).append("/").append(mUid) + .append(" pkg=").append(mPackage); + if (mMultiPackage) sb.append(" (multi)"); + if (mCommonProcess != this) sb.append(" (sub)"); + sb.append("}"); + return sb.toString(); + } } public static final class ServiceState extends DurationsTable { @@ -2777,7 +2851,7 @@ public final class ProcessStats implements Parcelable { public final String mProcessName; ProcessState mProc; - int mActive = 0; + Object mOwner; public static final int SERVICE_RUN = 0; public static final int SERVICE_STARTED = 1; @@ -2809,27 +2883,69 @@ public final class ProcessStats implements Parcelable { mProc = proc; } - public void makeActive() { - if (mActive == 0) { - mProc.incActiveServices(); + public void applyNewOwner(Object newOwner) { + if (mOwner != newOwner) { + if (mOwner == null) { + mOwner = newOwner; + mProc.incActiveServices(mName); + } else { + // There was already an old owner, reset this object for its + // new owner. + mOwner = newOwner; + if (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING + || mExecState != STATE_NOTHING) { + long now = SystemClock.uptimeMillis(); + if (mStartedState != STATE_NOTHING) { + if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner + + " from " + mOwner + " while started: pkg=" + + mPackage + " service=" + mName + " proc=" + mProc); + setStarted(false, 0, now); + } + if (mBoundState != STATE_NOTHING) { + if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner + + " from " + mOwner + " while bound: pkg=" + + mPackage + " service=" + mName + " proc=" + mProc); + setBound(false, 0, now); + } + if (mExecState != STATE_NOTHING) { + if (DEBUG) Slog.d(TAG, "Service has new owner " + newOwner + + " from " + mOwner + " while executing: pkg=" + + mPackage + " service=" + mName + " proc=" + mProc); + setExecuting(false, 0, now); + } + } + } } - mActive++; } - public void makeInactive() { - /* - RuntimeException here = new RuntimeException("here"); - here.fillInStackTrace(); - Slog.i(TAG, "Making " + this + " inactive", here); - */ - mActive--; - if (mActive == 0) { - mProc.decActiveServices(); + public void clearCurrentOwner(Object owner) { + if (mOwner == owner) { + mOwner = null; + mProc.decActiveServices(mName); + if (mStartedState != STATE_NOTHING || mBoundState != STATE_NOTHING + || mExecState != STATE_NOTHING) { + long now = SystemClock.uptimeMillis(); + if (mStartedState != STATE_NOTHING) { + Slog.wtfStack(TAG, "Service owner " + owner + " cleared while started: pkg=" + + mPackage + " service=" + mName + " proc=" + mProc); + setStarted(false, 0, now); + } + if (mBoundState != STATE_NOTHING) { + Slog.wtfStack(TAG, "Service owner " + owner + " cleared while bound: pkg=" + + mPackage + " service=" + mName + " proc=" + mProc); + setBound(false, 0, now); + } + if (mExecState != STATE_NOTHING) { + Slog.wtfStack(TAG, "Service owner " + owner + " cleared while exec: pkg=" + + mPackage + " service=" + mName + " proc=" + mProc); + setExecuting(false, 0, now); + } + } } } public boolean isInUse() { - return mActive > 0; + return mOwner != null; } void add(ServiceState other) { @@ -2904,8 +3020,8 @@ public final class ProcessStats implements Parcelable { } public void setStarted(boolean started, int memFactor, long now) { - if (mActive <= 0) { - throw new IllegalStateException("Service " + this + " has mActive=" + mActive); + if (mOwner == null) { + Slog.wtf(TAG, "Starting service " + this + " without owner"); } final boolean wasStarted = mStartedState != STATE_NOTHING; final int state = started ? memFactor : STATE_NOTHING; @@ -2931,8 +3047,8 @@ public final class ProcessStats implements Parcelable { } public void setBound(boolean bound, int memFactor, long now) { - if (mActive <= 0) { - throw new IllegalStateException("Service " + this + " has mActive=" + mActive); + if (mOwner == null) { + Slog.wtf(TAG, "Binding service " + this + " without owner"); } final int state = bound ? memFactor : STATE_NOTHING; if (mBoundState != state) { @@ -2949,8 +3065,8 @@ public final class ProcessStats implements Parcelable { } public void setExecuting(boolean executing, int memFactor, long now) { - if (mActive <= 0) { - throw new IllegalStateException("Service " + this + " has mActive=" + mActive); + if (mOwner == null) { + Slog.wtf(TAG, "Executing service " + this + " without owner"); } final int state = executing ? memFactor : STATE_NOTHING; if (mExecState != state) { @@ -2974,6 +3090,12 @@ public final class ProcessStats implements Parcelable { } return time; } + + public String toString() { + return "ServiceState{" + Integer.toHexString(System.identityHashCode(this)) + + " " + mName + " pkg=" + mPackage + " proc=" + + Integer.toHexString(System.identityHashCode(this)) + "}"; + } } public static final class PackageState { diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 05fd613ee659..cd853b62e622 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -100,8 +100,20 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte @Override protected void onCreate(Bundle savedInstanceState) { - onCreate(savedInstanceState, makeMyIntent(), - getResources().getText(com.android.internal.R.string.whichApplication), + // Use a specialized prompt when we're handling the 'Home' app startActivity() + final int titleResource; + final Intent intent = makeMyIntent(); + final Set<String> categories = intent.getCategories(); + if (Intent.ACTION_MAIN.equals(intent.getAction()) + && categories != null + && categories.size() == 1 + && categories.contains(Intent.CATEGORY_HOME)) { + titleResource = com.android.internal.R.string.whichHomeApplication; + } else { + titleResource = com.android.internal.R.string.whichApplication; + } + + onCreate(savedInstanceState, intent, getResources().getText(titleResource), null, null, true); } diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png Binary files differindex 266ac98358af..7de0448775ac 100644 --- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png +++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_dark.png diff --git a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png Binary files differindex 49b375f353e9..5b916c987f2e 100644 --- a/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png +++ b/core/res/res/drawable-hdpi/btn_check_on_pressed_holo_light.png diff --git a/core/res/res/drawable-hdpi/ic_grayedout_printer.png b/core/res/res/drawable-hdpi/ic_grayedout_printer.png Binary files differnew file mode 100644 index 000000000000..5e54970d6b3f --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_grayedout_printer.png diff --git a/core/res/res/drawable-hdpi/overscroll_edge.png b/core/res/res/drawable-hdpi/overscroll_edge.png Binary files differindex 08fc02262971..1952e0ed3ac3 100644 --- a/core/res/res/drawable-hdpi/overscroll_edge.png +++ b/core/res/res/drawable-hdpi/overscroll_edge.png diff --git a/core/res/res/drawable-hdpi/overscroll_glow.png b/core/res/res/drawable-hdpi/overscroll_glow.png Binary files differindex 8f0c2cb04f0e..45c01353296e 100644 --- a/core/res/res/drawable-hdpi/overscroll_glow.png +++ b/core/res/res/drawable-hdpi/overscroll_glow.png diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png Binary files differindex af5c463c2963..eafc5538be7f 100644 --- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png +++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_dark.png diff --git a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png Binary files differindex 819c55258756..6583e99b044f 100644 --- a/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png +++ b/core/res/res/drawable-mdpi/btn_check_on_pressed_holo_light.png diff --git a/core/res/res/drawable-mdpi/ic_grayedout_printer.png b/core/res/res/drawable-mdpi/ic_grayedout_printer.png Binary files differnew file mode 100644 index 000000000000..5e54970d6b3f --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_grayedout_printer.png diff --git a/core/res/res/drawable-mdpi/overscroll_edge.png b/core/res/res/drawable-mdpi/overscroll_edge.png Binary files differindex 4c87a8bce61f..baf2d0c400af 100644 --- a/core/res/res/drawable-mdpi/overscroll_edge.png +++ b/core/res/res/drawable-mdpi/overscroll_edge.png diff --git a/core/res/res/drawable-mdpi/overscroll_glow.png b/core/res/res/drawable-mdpi/overscroll_glow.png Binary files differindex 8389ef4c5820..c6cddd42220d 100644 --- a/core/res/res/drawable-mdpi/overscroll_glow.png +++ b/core/res/res/drawable-mdpi/overscroll_glow.png diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png Binary files differindex 0e1b9484e510..028eed6a3645 100644 --- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png +++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_dark.png diff --git a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png Binary files differindex 8d8aabc78097..61efd3ab2784 100644 --- a/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png +++ b/core/res/res/drawable-xhdpi/btn_check_on_pressed_holo_light.png diff --git a/core/res/res/drawable-xhdpi/ic_grayedout_printer.png b/core/res/res/drawable-xhdpi/ic_grayedout_printer.png Binary files differnew file mode 100644 index 000000000000..5e54970d6b3f --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_grayedout_printer.png diff --git a/core/res/res/drawable-xhdpi/overscroll_edge.png b/core/res/res/drawable-xhdpi/overscroll_edge.png Binary files differindex 4fe6c273717c..b5e6e61cd02c 100644 --- a/core/res/res/drawable-xhdpi/overscroll_edge.png +++ b/core/res/res/drawable-xhdpi/overscroll_edge.png diff --git a/core/res/res/drawable-xhdpi/overscroll_glow.png b/core/res/res/drawable-xhdpi/overscroll_glow.png Binary files differindex 75c3eb487714..779c3a590309 100644 --- a/core/res/res/drawable-xhdpi/overscroll_glow.png +++ b/core/res/res/drawable-xhdpi/overscroll_glow.png diff --git a/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png b/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png Binary files differindex 81b0f8797c72..668548b11ee0 100644 --- a/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png +++ b/core/res/res/drawable-xxhdpi/btn_check_on_pressed_holo_dark.png diff --git a/core/res/res/drawable-xxhdpi/overscroll_edge.png b/core/res/res/drawable-xxhdpi/overscroll_edge.png Binary files differindex 1a927373cbe2..734bfa762777 100644 --- a/core/res/res/drawable-xxhdpi/overscroll_edge.png +++ b/core/res/res/drawable-xxhdpi/overscroll_edge.png diff --git a/core/res/res/drawable-xxhdpi/overscroll_glow.png b/core/res/res/drawable-xxhdpi/overscroll_glow.png Binary files differindex c187e95e7b37..dc1f2795f9ba 100644 --- a/core/res/res/drawable-xxhdpi/overscroll_glow.png +++ b/core/res/res/drawable-xxhdpi/overscroll_glow.png diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 3f3b0bf0ccae..8d4bec8ef79e 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"gaan in by Bluetooth-instellings"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Laat die program toe om die plaaslike Bluetooth-tablet op te stel, en om met afstandbeheer toestelle saam te bind."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Laat die program toe om die plaaslike Bluetooth-foon op te stel en te ontdek en met afgeleë toestelle saam te bind."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"laat program saambind deur Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Laat die program sonder gebruikerinteraksie met afgeleë toestelle saambind."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Laat die program sonder gebruikerinteraksie met afgeleë toestelle saambind."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"koppel aan en ontkoppel van WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Laat die program toe om te bepaal of WiMAX geaktiveer is en of enige WiMAX-netwerke gekoppel is."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Verander WiMAX-status"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Probeer later weer"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Sleep van bo af na onder om volskerm te verlaat"</string> + <string name="done_label" msgid="2093726099505892398">"Klaar"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Ure se sirkelglyer"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Minute se sirkelglyer"</string> + <string name="select_hours" msgid="6043079511766008245">"Kies ure"</string> + <string name="select_minutes" msgid="3974345615920336087">"Kies minute"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Maandrooster van dae"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Jaarlys"</string> + <string name="select_day" msgid="7774759604701773332">"Kies maand en dag"</string> + <string name="select_year" msgid="7952052866994196170">"Kies jaar"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> gekies"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> uitgevee"</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index b263bec50391..9214d117fb42 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"የብሉቱዝ ቅንብሮችን ድረስባቸው"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"የአካባቢውን ብሉቱዝ ጡባዊ ለማዋቀር እና አግኝቶ ከሩቅ መሣሪያዎች ጋር ለማጣመር ለመተግበሪያው ይፈቅዳሉ።"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"የአካባቢውን ብሉቱዝ ጡባዊ ለማዋቀር እና አግኝቶ ከሩቅ መሣሪያዎች ጋር ለማጣመር ለመተግበሪያው ይፈቅዳሉ።"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"በመተግበሪያ የብሉቱዝ ማጣመር ይፍቀዱ"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"መተግበሪያው ያለተጠቃሚ ጣልቃ-ገብነት ከርቀት መሣሪያዎች ጋር እንዲጣመር ያስችለዋል።"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"መተግበሪያው ያለተጠቃሚ ጣልቃ-ገብነት ከርቀት መሣሪያዎች ጋር እንዲጣመር ያስችለዋል።"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"ከWiMAX ጋር ይገናኙ እና ያላቅቁ"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"መተግበሪያው WiMAX እንደነቃ እና ስለማናቸውም የተገናኙ የWiMAX አውታረ መረቦች መረጃ እንዲወስን ይፈቅድለታል።"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"የWiMAX ሁኔታ ለውጥ"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"ቆይተው እንደገና ይሞክሩ"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"ከሙሉ ገጽ ማያ ለመውጣት ከላይ ወደታች ጣትዎን ያንቀሳቅሱ"</string> + <string name="done_label" msgid="2093726099505892398">"ተከናውኗል"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"የሰዓታት ክብ ተንሸራታች"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"የደቂቃዎች ክብ ተንሸራታች"</string> + <string name="select_hours" msgid="6043079511766008245">"ሰዓታትን ይምረጡ"</string> + <string name="select_minutes" msgid="3974345615920336087">"ደቂቃዎችን ይምረጡ"</string> + <string name="day_picker_description" msgid="8990847925961297968">"የቀናት የወር ፍርግርግ"</string> + <string name="year_picker_description" msgid="5524331207436052403">"የዓመት ዝርዝር"</string> + <string name="select_day" msgid="7774759604701773332">"ወር እና ቀን ይምረጡ"</string> + <string name="select_year" msgid="7952052866994196170">"ዓመት ይምረጡ"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ተመርጧል"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ተሰርዟል"</string> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index f311875150d3..3309b9db1da7 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"الدخول إلى إعدادات بلوتوث"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"للسماح للتطبيق بتهيئة لوحة البلوتوث المحلي، واكتشاف أجهزة التحكم عن بعد والاقتران بها."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"للسماح للتطبيق بتهيئة هاتف البلوتوث المحلي، واكتشاف أجهزة التحكم عن بعد والاقتران بها."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"السماح بإقران البلوتوث مع التطبيق"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"للسماح بإقران لتطبيق مع الأجهزة البعيدة بدون تدخل المستخدم."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"للسماح بإقران لتطبيق مع الأجهزة البعيدة بدون تدخل المستخدم."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"الاتصال بـشبكة WiMAX وقطع الاتصال بها"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"للسماح للتطبيق بتحديد ما إذا تم تمكين WiMAX وتحديد معلومات حول أية شبكات WiMAX متصلة."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغيير حالة WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"أعد المحاولة لاحقًا"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"التمرير من أعلى لأسفل للخروج من وضع ملء الشاشة"</string> + <string name="done_label" msgid="2093726099505892398">"تم"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"شريط التمرير الدائري للساعات"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"شريط التمرير الدائري للدقائق"</string> + <string name="select_hours" msgid="6043079511766008245">"تحديد الساعات"</string> + <string name="select_minutes" msgid="3974345615920336087">"تحديد الدقائق"</string> + <string name="day_picker_description" msgid="8990847925961297968">"شبكة الشهر مكونة من الأيام"</string> + <string name="year_picker_description" msgid="5524331207436052403">"قائمة الأعوام"</string> + <string name="select_day" msgid="7774759604701773332">"تحديد الشهر واليوم"</string> + <string name="select_year" msgid="7952052866994196170">"تحديد العام"</string> + <string name="item_is_selected" msgid="949687401682476608">"تم تحديد <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"تم حذف <xliff:g id="KEY">%1$s</xliff:g>"</string> </resources> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index e92e549c699f..245079626fd5 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -645,6 +645,12 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"атрыманне доступу да налад прылады Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Дазваляе прыкладанням наладжваць лакальны планшэт Bluetooth, выяўляць і падлучаць выдаленыя прылады."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Дазваляе прыкладанням наладжваць лакальны тэлефон Bluetooth, а таксама знаходзіць выдаленыя прылады i падлучацца да ix."</string> + <!-- no translation found for permlab_bluetoothPriv (4009494246009513828) --> + <skip /> + <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) --> + <skip /> + <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) --> + <skip /> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"падключаць да WiMAX i адключаць ад яго"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Дазваляе прыкладанню вызначаць, ці ўключаны WiMAX, і інфармацыю пра любую сетку WiMAX, якая спалучана з iншымi."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Змяніць стан WiMAX"</string> @@ -1791,4 +1797,26 @@ <skip /> <!-- no translation found for transient_navigation_confirmation (8554991488096662508) --> <skip /> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index aea6ed495ae4..609ac4d1a523 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"достъп до настройките за Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Разрешава на приложението да конфигурира локалния таблет с Bluetooth, както и да открива и да се сдвоява с отдалечени устройства."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Разрешава на приложението да конфигурира локалния телефон с Bluetooth, както и да открива и да се сдвоява с отдалечени устройства."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"разрешаване на сдвояване чрез Bluetooth от приложението"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Разрешава на приложението да се сдвоява с отдалечени устройства без потребителско взаимодействие."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Разрешава на приложението да се сдвоява с отдалечени устройства без потребителско взаимодействие."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"установяване и прекратяване на връзката с WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Разрешава на приложението да определя дали WiMAX мрежата е активирана, както и информация за всички такива мрежи, които са свързани."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Промяна на състоянието на WiMAX мрежата"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Опитайте отново по-късно"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"За изх. от цял екр. прeк. пръст отгоре надолу"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 4bbf33a3b8cd..3f512eea6259 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -249,7 +249,7 @@ <string name="permlab_install_shortcut" msgid="4279070216371564234">"instal·la dreceres"</string> <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Permet que una aplicació afegeixi dreceres a la pantalla d\'inici sense la intervenció de l\'usuari."</string> <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"desinstal·la dreceres"</string> - <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permet que l\'aplicació suprimeixi les dreceres a la pantalla d\'inici sense la intervenció de l\'usuari."</string> + <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Permet que l\'aplicació suprimeixi les dreceres de la pantalla d\'inici sense la intervenció de l\'usuari."</string> <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"desviació de les trucades sortints"</string> <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Permet que l\'aplicació processi les trucades sortints i que canviï el número que es marcarà. Aquest permís permet que l\'aplicació supervisi, redirigeixi o bloquegi les trucades sortints."</string> <string name="permlab_receiveSms" msgid="8673471768947895082">"recepció de missatges de text (SMS)"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accés a la configuració de Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permet que l\'aplicació configuri la tauleta Bluetooth local i que detecti i emparelli dispositius remots."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permet que l\'aplicació configuri el telèfon Bluetooth local i que detecti i emparelli dispositius remots."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permet l\'emparellament de l\'aplicació mitjançant Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permet que l\'aplicació s\'emparelli amb dispositius remots sense la interacció de l\'usuari."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permet que l\'aplicació s\'emparelli amb dispositius remots sense la interacció de l\'usuari."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"connecta i desconnecta de WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permet que l\'aplicació determini si WiMAX està activat i que vegi la informació sobre totes les xarxes WiMAX que estan connectades."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Canvia l\'estat de WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Torna-ho a provar més tard"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Fes llis. dit avall per sortir de pant. comp."</string> + <string name="done_label" msgid="2093726099505892398">"Fet"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Control circular de les hores"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Control circular dels minuts"</string> + <string name="select_hours" msgid="6043079511766008245">"Selecciona les hores"</string> + <string name="select_minutes" msgid="3974345615920336087">"Selecciona els minuts"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Graella mensual de dies"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Llista anual"</string> + <string name="select_day" msgid="7774759604701773332">"Selecciona un mes i un dia"</string> + <string name="select_year" msgid="7952052866994196170">"Selecciona un any"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionat"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> suprimit"</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 56015a4b000c..31d5323572a8 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"přístup do nastavení Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Umožňuje aplikaci konfigurovat místní tablet s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Umožňuje aplikaci konfigurovat místní telefon s rozhraním Bluetooth a vyhledávat a párovat vzdálená zařízení."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"povolit párování Bluetooth prostřednictvím aplikace"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Povoluje aplikaci provést be zásahu uživatele spárování se vzdálenými zařízeními."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Povoluje aplikaci provést be zásahu uživatele spárování se vzdálenými zařízeními."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"připojení a odpojení od sítě WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Umožňuje aplikaci zjistit, zda je povoleno připojení WiMAX, a také získat informace o všech připojených sítích WiMAX."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Změnit stav připojení WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Zkuste to znovu později"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Režim celé obrazovky ukončíte přejetím dolů"</string> + <string name="done_label" msgid="2093726099505892398">"Hotovo"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Kruhový posuvník hodin"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Kruhový posuvník minut"</string> + <string name="select_hours" msgid="6043079511766008245">"Zvolte hodiny"</string> + <string name="select_minutes" msgid="3974345615920336087">"Zvolte minuty"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Dny uspořádané po měsících"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Seznam roků"</string> + <string name="select_day" msgid="7774759604701773332">"Vyberte měsíc a den"</string> + <string name="select_year" msgid="7952052866994196170">"Vyberte rok"</string> + <string name="item_is_selected" msgid="949687401682476608">"Vybrána položka <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"Číslice <xliff:g id="KEY">%1$s</xliff:g> byla smazána"</string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 039a6e1612fa..ad48c48045b5 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"få adgang til Bluetooth-indstillinger"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tillader, at appen kan konfigurere den lokale Bluetooth-tablet samt finde og parre med fjerne enheder."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tillader, at appen kan konfigurere den lokale Bluetooth-telefon samt finde og parre med eksterne enheder."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"tillader Bluetooth-parring efter applikation"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Tillader, at appen parrer med eksterne enheder uden brugerinteraktion."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Tillader, at appen parrer med eksterne enheder uden brugerinteraktion."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"tilslut og afbryd fra WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tillader, at appen kan bestemme, hvorvidt WiMAX er aktiveret, og oplysninger om eventuelle WiMAX-netværk, der er forbundet."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Skift WiMAX-tilstand"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Prøv igen senere"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Stryg ned fra toppen for at stoppe fuld skærm"</string> + <string name="done_label" msgid="2093726099505892398">"Udfør"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Cirkulær timevælger"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Cirkulær minutvælger"</string> + <string name="select_hours" msgid="6043079511766008245">"Vælg timer"</string> + <string name="select_minutes" msgid="3974345615920336087">"Vælg minutter"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Månedsgitter med dage"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Liste over år"</string> + <string name="select_day" msgid="7774759604701773332">"Vælg måned og dag"</string> + <string name="select_year" msgid="7952052866994196170">"Vælg år"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> er valgt"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> er slettet"</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index fc2f86b54f4e..ee60e054800c 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Auf Bluetooth-Einstellungen zugreifen"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ermöglicht der App, das lokale Bluetooth-Tablet zu konfigurieren, Remote-Geräte zu erkennen und eine Verbindung zu diesen herzustellen"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ermöglicht der App, das lokale Bluetooth-Telefon zu konfigurieren, Remote-Geräte zu erkennen und eine Verbindung zu diesen herzustellen"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth-Pairing nach App ermöglichen"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Ermöglicht der App, Pairing mit Remote-Geräten ohne Eingriff des Nutzers durchzuführen"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Ermöglicht der App, Pairing mit Remote-Geräten ohne Eingriff des Nutzers durchzuführen"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-Verbindungen herstellen und trennen"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ermöglicht der App festzustellen, ob WiMAX aktiviert ist. Zudem kann sie Informationen zu verbundenen WiMAX-Netzwerken abrufen."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-Status ändern"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Später erneut versuchen"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Zum Schließen des Vollbilds von oben nach unten wischen"</string> + <string name="done_label" msgid="2093726099505892398">"Fertig"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Kreisförmiger Schieberegler für Stunden"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Kreisförmiger Schieberegler für Minuten"</string> + <string name="select_hours" msgid="6043079511766008245">"Stunden auswählen"</string> + <string name="select_minutes" msgid="3974345615920336087">"Minuten auswählen"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Monatsraster mit einzelnen Tagen"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Jahresliste"</string> + <string name="select_day" msgid="7774759604701773332">"Monat und Tag auswählen"</string> + <string name="select_year" msgid="7952052866994196170">"Jahr auswählen"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ausgewählt"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> gelöscht"</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 8318f6f91f9c..f88143e4c2ee 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"πρόσβαση στις ρυθμίσεις Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"να επιτρέπεται η σύζευξη Bluetooth ανά εφαρμογή"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Επιτρέπει στην εφαρμογή τη σύζευξη με απομακρυσμένες συσκευές χωρίς αλληλεπίδραση του χρήστη."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Επιτρέπει στην εφαρμογή τη σύζευξη με απομακρυσμένες συσκευές χωρίς αλληλεπίδραση του χρήστη."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"σύνδεση και αποσύνδεση από το WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Επιτρέπει στην εφαρμογή να προσδιορίζει εάν το WiMAX είναι ενεργοποιημένο και πληροφορίες σχετικά με τυχόν δίκτυα WiMAX που είναι συνδεδεμένα."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Αλλαγή κατάστασης WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Δοκιμάστε ξανά αργότερα"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Σάρωση προς τα κάτω για έξοδο από πλήρη οθόνη"</string> + <string name="done_label" msgid="2093726099505892398">"Τέλος"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Κυκλικό ρυθμιστικό ωρών"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Κυκλικό ρυθμιστικό λεπτών"</string> + <string name="select_hours" msgid="6043079511766008245">"Επιλογή ωρών"</string> + <string name="select_minutes" msgid="3974345615920336087">"Επιλογή λεπτών"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Πλέγμα ημερών του μήνα"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Λίστα ετών"</string> + <string name="select_day" msgid="7774759604701773332">"Επιλογή μήνα και ημέρας"</string> + <string name="select_year" msgid="7952052866994196170">"Επιλογή έτους"</string> + <string name="item_is_selected" msgid="949687401682476608">"Επιλέχτηκε το στοιχείο <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> διαγράφηκε"</string> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index c634adc4be87..d5486ad0ee04 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -611,6 +611,9 @@ <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> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"allow Bluetooth pairing by Application"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"connect and disconnect from WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Allows the app to determine whether WiMAX is enabled and information about any WiMAX networks that are connected."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"change WiMAX state"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Swipe down from the top to exit full screen"</string> + <string name="done_label" msgid="2093726099505892398">"Finished"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Hours circular slider"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Minutes circular slider"</string> + <string name="select_hours" msgid="6043079511766008245">"Select hours"</string> + <string name="select_minutes" msgid="3974345615920336087">"Select minutes"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Month grid of days"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Year list"</string> + <string name="select_day" msgid="7774759604701773332">"Select month and day"</string> + <string name="select_year" msgid="7952052866994196170">"Select year"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selected"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> deleted"</string> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index c634adc4be87..d5486ad0ee04 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -611,6 +611,9 @@ <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> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"allow Bluetooth pairing by Application"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Allows the app to pair with remote devices without user interaction."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"connect and disconnect from WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Allows the app to determine whether WiMAX is enabled and information about any WiMAX networks that are connected."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"change WiMAX state"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Swipe down from the top to exit full screen"</string> + <string name="done_label" msgid="2093726099505892398">"Finished"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Hours circular slider"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Minutes circular slider"</string> + <string name="select_hours" msgid="6043079511766008245">"Select hours"</string> + <string name="select_minutes" msgid="3974345615920336087">"Select minutes"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Month grid of days"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Year list"</string> + <string name="select_day" msgid="7774759604701773332">"Select month and day"</string> + <string name="select_year" msgid="7952052866994196170">"Select year"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selected"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> deleted"</string> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 2dca772e415e..5b5076ca6edd 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"acceder a la configuración de Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que la aplicación configure la tablet Bluetooth local y descubra y se sincronice con dispositivos remotos."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que la aplicación configure el dispositivo Bluetooth local y descubra y se sincronice con dispositivos remotos."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir que la aplicación realice la sincronización por Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"conectarse y desconectarse de WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que la aplicación determine si está activada la conexión WiMAX y que obtenga información sobre las redes WiMAX que están conectadas."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Cambiar el estado de WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Vuelve a intentar más tarde."</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Salir de pantalla completa: deslizar abajo"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index ebc8b0dcab16..c78577237320 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -132,8 +132,8 @@ <string name="low_memory" product="tablet" msgid="6494019234102154896">"Se ha agotado el espacio de almacenamiento del tablet. Elimina algunos archivos para liberar espacio."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"Se ha agotado el espacio de almacenamiento del teléfono. Elimina algunos archivos para liberar espacio."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"Es posible que la red esté supervisada"</string> - <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"De un tercero desconocido"</string> - <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"De <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> + <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por un tercero desconocido"</string> + <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Por <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string> <string name="me" msgid="6545696007631404292">"Yo"</string> <string name="power_dialog" product="tablet" msgid="8545351420865202853">"Opciones del tablet"</string> <string name="power_dialog" product="default" msgid="1319919075463988638">"Opciones del teléfono"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"acceder a los ajustes de Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que la aplicación configure el tablet Bluetooth local y que detecte dispositivos remotos y se vincule con ellos."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que la aplicación configure el teléfono Bluetooth local y que detecte dispositivos remotos y se vincule con ellos."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Permitir que la aplicación sincronice el Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que la aplicación se sincronice con dispositivos remotos sin la interacción del usuario."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"conectarse a WiMAX y desconectarse de esta red"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que la aplicación determine si está habilitada la conexión WiMAX y obtenga información sobre las redes WiMAX que están conectadas."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Cambiar estado de WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Volver a intentar más tarde"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Desliza hacia abajo para salir de la pantalla completa"</string> + <string name="done_label" msgid="2093726099505892398">"Listo"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Control deslizante circular de horas"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Control deslizante circular de minutos"</string> + <string name="select_hours" msgid="6043079511766008245">"Seleccionar horas"</string> + <string name="select_minutes" msgid="3974345615920336087">"Seleccionar minutos"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Cuadrícula mensual de días"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Lista de años"</string> + <string name="select_day" msgid="7774759604701773332">"Seleccionar mes y día"</string> + <string name="select_year" msgid="7952052866994196170">"Seleccionar año"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> seleccionado"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string> </resources> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 6e5834963cff..0becbc3a6096 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"juurdepääs Bluetoothi seadetele"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Võimaldab rakendusel seadistada kohalikku Bluetooth-tahvelarvutit ning leida ja siduda seda kaugseadmetega."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Võimaldab rakendusel seadistada kohalikku Bluetooth-telefoni ning leida ja siduda seda kaugseadmetega."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"luba Bluetoothi sidumist rakendusega"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Lubab rakendusel siduda ennast kaugseadmetega kasutaja sekkumiseta."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Lubab rakendusel siduda ennast kaugseadmetega kasutaja sekkumiseta."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-iga ühenduse loomine ja ühenduse katkestamine"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Võimaldab rakendusel määrata, kas WiMAX on lubatud, ja vaadata teavet kõikide ühendatud WiMAX-võrkude kohta."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-i oleku muutmine"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Proovige hiljem uuesti"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Täisekraani sulgemiseks pühkige ülevalt alla"</string> + <string name="done_label" msgid="2093726099505892398">"Valmis"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Ringikujuline tunniliugur"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Ringikujuline minutiliugur"</string> + <string name="select_hours" msgid="6043079511766008245">"Tundide valimine"</string> + <string name="select_minutes" msgid="3974345615920336087">"Minutite valimine"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Päevad kuu ruudustikus"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Aastate loend"</string> + <string name="select_day" msgid="7774759604701773332">"Kuu ja päeva valimine"</string> + <string name="select_year" msgid="7952052866994196170">"Aasta valimine"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valitud"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> on kustutatud"</string> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index e294014315d7..3512e3e43fbe 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"دسترسی به تنظیمات بلوتوث"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"به برنامه اجازه میدهد تا رایانهٔ لوحی بلوتوث محلی را پیکربندی کرده، دستگاههای راه دور را شناسایی کرده و با آنها جفت شود."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"به برنامه اجازه میدهد تا تلفن بلوتوث محلی را پیکربندی کند و دستگاههای راه دور را پیدا کند و با آنها جفت شود."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"امکان جفتسازی بلوتوث از طریق برنامه"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"به برنامه امکان میدهد بدون تعامل کاربر با دستگاههای راه دور جفت شود."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"به برنامه امکان میدهد بدون تعامل کاربر با دستگاههای راه دور جفت شود."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"اتصال و قطع اتصال از WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"به برنامه امکان میدهد فعال بودن وایمکس و اطلاعات مربوط به هر یک از شبکههای وایمکس متصل را مشخص کند."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"تغییر وضعیت WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"بعداً دوباره امتحان کنید"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"برای خروج از تمام صفحه از بالا به پایین بکشید"</string> + <string name="done_label" msgid="2093726099505892398">"انجام شد"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"لغزنده دایرهای ساعت"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"لغزنده دایرهای دقیقه"</string> + <string name="select_hours" msgid="6043079511766008245">"انتخاب ساعت"</string> + <string name="select_minutes" msgid="3974345615920336087">"انتخاب دقیقه"</string> + <string name="day_picker_description" msgid="8990847925961297968">"روزهای ماه به صورت جدول"</string> + <string name="year_picker_description" msgid="5524331207436052403">"لیست سالها"</string> + <string name="select_day" msgid="7774759604701773332">"انتخاب ماه و روز"</string> + <string name="select_year" msgid="7952052866994196170">"انتخاب سال"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> انتخاب شد"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> حذف شد"</string> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 7876316e808f..d498af41e623 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"käytä Bluetooth-asetuksia"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Antaa sovelluksen määrittää paikallisen Bluetooth-tabletin asetukset sekä tunnistaa muita laitteita ja muodostaa niiden kanssa laitepareja."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Antaa sovelluksen määrittää paikallisen Bluetooth-puhelimen asetukset sekä tunnistaa muita laitteita ja muodostaa niiden kanssa laitepareja."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"anna sovelluksen muodostaa Bluetooth-laitepari"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Antaa sovelluksen muodostaa laiteparin etälaitteiden kanssa ilman käyttäjän toimia."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Antaa sovelluksen muodostaa laiteparin etälaitteiden kanssa ilman käyttäjän toimia."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"muodosta yhteys WiMAXiin ja katkaise yhteys"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Antaa sovelluksen määrittää, onko WiMAX käytössä, sekä saada selville tietoja WiMAX-verkoista, joihin on muodostettu yhteys."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Vaihda WiMAX-verkon tilaa"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Yritä myöhemmin uudelleen"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Poistu koko näytön tilasta liu\'uttamalla alas"</string> + <string name="done_label" msgid="2093726099505892398">"Valmis"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Tuntien ympyränmuotoinen liukusäädin"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Minuuttien ympyränmuotoinen liukusäädin"</string> + <string name="select_hours" msgid="6043079511766008245">"Valitse tunnit"</string> + <string name="select_minutes" msgid="3974345615920336087">"Valitse minuutit"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Päiväruudukko kuukausittain"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Vuosiluettelo"</string> + <string name="select_day" msgid="7774759604701773332">"Valitse kuukausi ja päivä"</string> + <string name="select_year" msgid="7952052866994196170">"Valitse vuosi"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> on valittu"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> poistettiin"</string> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 8c4c8bf518ce..ea56e9b9f2a7 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accéder aux paramètres Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permet à l\'application de configurer la tablette Bluetooth locale, d\'identifier des appareils distants et de les associer à la tablette."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permet à l\'application de configurer le téléphone Bluetooth local, d\'identifier des appareils distants et de les associer au téléphone."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"autoriser l\'application à s\'associer par Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permet à l\'application de s\'associer aux appareils à distance sans interaction avec l\'utilisateur."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permet à l\'application de s\'associer aux appareils à distance sans interaction avec l\'utilisateur."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"se connecter au réseau WiMAX et s\'en déconnecter"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permet à l\'application de déterminer si le WiMAX est activé et d\'obtenir des détails sur tous les réseaux WiMAX connectés."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifier l\'état du WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Réessayez plus tard"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Balayez vers le bas pour quitter plein écran"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 654810d638d7..b4792d8884b7 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accéder aux paramètres Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permet à l\'application de configurer la tablette Bluetooth locale, d\'identifier des appareils distants et de les associer à la tablette."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permet à l\'application de configurer le téléphone Bluetooth local, d\'identifier des appareils distants et de les associer au téléphone."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"autoriser l\'application à s\'associer via le Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permettre à l\'application de s\'associer aux appareils à distance sans intervention de l\'utilisateur"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permettre à l\'application de s\'associer aux appareils à distance sans intervention de l\'utilisateur"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"se connecter au réseau WiMAX et s\'en déconnecter"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permet à l\'application de déterminer si le WiMAX est activé et d\'obtenir des informations sur tous les réseaux WiMAX connectés."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifier l\'état du WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Veuillez réessayer ultérieurement."</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Balayer vers le bas pour quitter le plein écran"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 4b0d15682f32..ee01622f0267 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth सेटिंग पर पहुंचें"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"किसी एप्स को स्थानीय Bluetooth टेबलेट कॉन्फ़िगर करने की और रिमोट उपकरणों के साथ खोजने और युग्मित करने देता है."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"एप्स को स्थानीय Bluetooth फ़ोन कॉन्फ़िगर करने देता है, और रिमोट उपकरणों के साथ खोजने और युग्मित करने देता है."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"एप्लिकेशन के द्वारा Bluetooth युग्मन करने देती है"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"एप्लिकेशन को उपयोगकर्ता के इंटरैक्शन के बिना दूरस्थ उपकरणों के साथ युग्मित करने देती है."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"एप्लिकेशन को उपयोगकर्ता के इंटरैक्शन के बिना दूरस्थ उपकरणों के साथ युग्मित करने देती है."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX से कनेक्ट और डिस्कनेक्ट करें"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"एप्स को WiMAX सक्षम है या नहीं और कनेक्ट किए गए किसी WiMAX नेटवर्क के बारे में जानकारी निर्धारित करने देता है."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX स्थिति बदलें"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"बाद में पुनः प्रयास करें"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"पूर्ण स्क्रीन से बाहर आने हेतु ऊपर से नीचे स्वाइप करें"</string> + <string name="done_label" msgid="2093726099505892398">"पूर्ण"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"घंटो का चक्राकार स्लाइडर"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"मिनटों का चक्राकार स्लाइडर"</string> + <string name="select_hours" msgid="6043079511766008245">"घंटे चुनें"</string> + <string name="select_minutes" msgid="3974345615920336087">"मिनट चुनें"</string> + <string name="day_picker_description" msgid="8990847925961297968">"दिनों की माह ग्रिड"</string> + <string name="year_picker_description" msgid="5524331207436052403">"वर्ष की सूची"</string> + <string name="select_day" msgid="7774759604701773332">"माह और दिन चुनें"</string> + <string name="select_year" msgid="7952052866994196170">"वर्ष चुनें"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> चयनित"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> को हटा दिया गया"</string> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index bf7dd60468b6..1df215e74793 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"pristupanje postavkama Bluetootha"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Aplikaciji omogućuje konfiguraciju lokalnog tabletnog računala s Bluetoothom te otkrivanje i uparivanje s udaljenim uređajima."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Aplikaciji omogućuje konfiguraciju lokalnog Bluetooth telefona i otkrivanje i uparivanje s udaljenim uređajima."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"omogući aplikaciji uparivanje putem Bluetootha"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Aplikaciji se omogućuje uparivanje s udaljenim uređajima bez interakcije korisnika."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Aplikaciji se omogućuje uparivanje s udaljenim uređajima bez interakcije korisnika."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"uspostavljanje i prekidanje veze s WiMAX-om"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Aplikaciji omogućuje utvrđivanje omogućenosti WiMAX mreže te daje informaciju o tome je li spojena neka WiMAX mreža."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Promjena stanja WiMAX mreže"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Pokušajte ponovo kasnije"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Prijeđite prstom s vrha prema dolje za izlaz"</string> + <string name="done_label" msgid="2093726099505892398">"Gotovo"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Kružni klizač sati"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Kružni klizač minuta"</string> + <string name="select_hours" msgid="6043079511766008245">"Odaberite sate"</string> + <string name="select_minutes" msgid="3974345615920336087">"Odaberite minute"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Mreža dana u mjesecu"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Popis godina"</string> + <string name="select_day" msgid="7774759604701773332">"Odaberite mjesec i dan"</string> + <string name="select_year" msgid="7952052866994196170">"Odaberite godinu"</string> + <string name="item_is_selected" msgid="949687401682476608">"Odabrana je stavka <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"Izbrisan je broj <xliff:g id="KEY">%1$s</xliff:g>"</string> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index aa4a9d411c01..a13c12c6ef19 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth-beállítások elérése"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Lehetővé teszi az alkalmazás számára, hogy konfigurálja a helyi Bluetooth-t, valamint hogy távoli eszközöket fedezzen fel és párosítson."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Lehetővé teszi az alkalmazás számára, hogy konfigurálja a helyi Bluetooth telefont, valamint hogy távoli eszközöket fedezzen fel és párosítson."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth-párosítás engedélyezése az alkalmazás számára"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Lehetővé teszi az alkalmazás számára a távoli eszközök párosítását felhasználói beavatkozás nélkül."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Lehetővé teszi az alkalmazás számára a távoli eszközök párosítását felhasználói beavatkozás nélkül."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-kapcsolódás és a kapcsolat bontása"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Lehetővé teszi az alkalmazás számára, hogy ellenőrizze, a WiMax engedélyezve van-e, valamint hogy információt gyűjtsön a csatlakoztatott WiMax-hálózatokról."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-állapot módosítása"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Próbálkozzon később"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"A kilépéshez húzza ujját a tetejétől lefelé"</string> + <string name="done_label" msgid="2093726099505892398">"Kész"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Óra kör alakú csúszkája"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Perc kör alakú csúszkája"</string> + <string name="select_hours" msgid="6043079511766008245">"Óra kiválasztása"</string> + <string name="select_minutes" msgid="3974345615920336087">"Perc kiválasztása"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Napok havi leosztásban"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Évek listája"</string> + <string name="select_day" msgid="7774759604701773332">"Válassza ki a hónapot és a napot"</string> + <string name="select_year" msgid="7952052866994196170">"Válassza ki az évet"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> kiválasztva"</string> + <string name="deleted_key" msgid="7659477886625566590">"A(z) <xliff:g id="KEY">%1$s</xliff:g> érték törölve"</string> </resources> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index dd3fe096d58e..0d16903aca82 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"մուտք գործել Bluetooth-ի կարգավորումներ"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Թույլ է տալիս հավելվածին կարգավորել տեղային Bluetooth գրասալիկը և հայտնաբերել ու զուգակցվել հեռակա սարքերի հետ:"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Թույլ է տալիս հավելվածին կարգավորել տեղային Bluetooth հեռախոսը և հայտնաբերել ու զուգակցվել հեռակա սարքերի հետ:"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"թույլ տալ Bluetooth զուգավորումը՝ հավելվածի միջոցով"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Թույլ է տալիս, որ հավելվածը զուգավորվի հեռավոր սարքերի հետ՝ առանց օգտվողի փոխազդեցության:"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Թույլ է տալիս, որ հավելվածը զուգավորվի հեռավոր սարքերի հետ՝ առանց օգտվողի փոխազդեցության:"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"միանալ WiMAX-ին և անջատվել դրանից"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Թույլ է տալիս հավելվածին պարզել, արդյոք WiMAX-ը միացված է և ցանկացած միացված WiMAX ցանցի մասին տեղեկություններ:"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Փոխել WiMAX-ի կարգավիճակը"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Կրկին փորձեք մի փոքր ուշ"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Սահահարվածեք վերից վար՝ ամբողջական էկրանից դուրս գալու համար"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 13d861da894d..5c369e8f2b87 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"akses setelan Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Mengizinkan apl mengonfigurasi tablet Bluetooth lokal, dan menemukan serta menyandingkan dengan perangkat jarak jauh."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Mengizinkan apl mengonfigurasi ponsel Bluetooth lokal, dan menemukan serta menyandingkan dengan perangkat jarak jauh."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"memungkinkan penyandingan Bluetooth oleh Aplikasi"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Memungkinkan aplikasi disandingkan dengan perangkat jarak jauh tanpa interaksi pengguna."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Memungkinkan aplikasi disandingkan dengan perangkat jarak jauh tanpa interaksi pengguna."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"sambungkan dan putuskan dari WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Memungkinkan aplikasi menentukan apakah WiMAX diaktifkan dan informasi tentang jaringan WiMAX apa saja yang tersambung."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Ubah status WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Coba lagi nanti"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Gesek ke bawah untuk keluar dari layar penuh"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 7c68638bdcfa..a9e78ba6cda5 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accesso alle impostazioni Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Consente all\'applicazione di configurare il tablet Bluetooth locale e di rilevare ed effettuare l\'accoppiamento con dispositivi remoti."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Consente all\'applicazione di configurare il telefono Bluetooth locale e di rilevare ed effettuare l\'accoppiamento con dispositivi remoti."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"accoppiamento Bluetooth dall\'applicazione"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Consente l\'accoppiamento dell\'app con dispositivi remoti senza l\'interazione dell\'utente."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Consente l\'accoppiamento dell\'app con dispositivi remoti senza l\'interazione dell\'utente."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"connessione e disconnessione da WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Consente all\'applicazione di determinare se WiMAX è abilitato e informazioni su eventuali reti WiMAX che sono connesse."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Modifica stato WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Riprova più tardi"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Uscita schermo intero: scorri in basso da alto"</string> + <string name="done_label" msgid="2093726099505892398">"Fine"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Dispositivo di scorrimento circolare per le ore"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Dispositivo di scorrimento circolare per i minuti"</string> + <string name="select_hours" msgid="6043079511766008245">"Seleziona le ore"</string> + <string name="select_minutes" msgid="3974345615920336087">"Seleziona i minuti"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Griglia di giorni suddivisi per mese"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Elenco degli anni"</string> + <string name="select_day" msgid="7774759604701773332">"Seleziona mese e giorno"</string> + <string name="select_year" msgid="7952052866994196170">"Seleziona anno"</string> + <string name="item_is_selected" msgid="949687401682476608">"Elemento selezionato: <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminato"</string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 09b7a54c28b8..63c430c2ff34 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"גישה להגדרות Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"מאפשר לאפליקציה להגדיר את תצורתו של הטאבלט המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"מאפשר לאפליקציה להגדיר את תצורתו של הטלפון המקומי מסוג Bluetooth וכן לגלות מכשירים מרוחקים ולבצע התאמה איתם."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"אפשר התאמת Bluetooth על ידי האפליקציה"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"מאפשרת לאפליקציה לבצע התאמה עם מכשירים מרוחקים ללא התערבות המשתמש."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"מאפשרת לאפליקציה לבצע התאמה עם מכשירים מרוחקים ללא התערבות המשתמש."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"התחברות והתנתקות מ-WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"מאפשר לאפליקציה לדעת האם WiNMAX מופעל, כמו גם לקבל מידע האם רשתות WiNMAX כלשהן מחוברות."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"שנה את מצב WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"נסה שוב מאוחר יותר"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"החלק מטה מהחלק העליון כדי לצאת ממסך מלא"</string> + <string name="done_label" msgid="2093726099505892398">"בוצע"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"מחוון שעות מעגלי"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"מחוון דקות מעגלי"</string> + <string name="select_hours" msgid="6043079511766008245">"בחר שעות"</string> + <string name="select_minutes" msgid="3974345615920336087">"בחר דקות"</string> + <string name="day_picker_description" msgid="8990847925961297968">"בחירת ימים בחודש בתצוגת רשת"</string> + <string name="year_picker_description" msgid="5524331207436052403">"רשימת שנים"</string> + <string name="select_day" msgid="7774759604701773332">"בחר חודש ויום"</string> + <string name="select_year" msgid="7952052866994196170">"בחר שנה"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> נבחר"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> נמחק"</string> </resources> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 4feb55c0cccc..33ce32a24507 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -132,7 +132,7 @@ <string name="low_memory" product="tablet" msgid="6494019234102154896">"タブレットのストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string> <string name="low_memory" product="default" msgid="3475999286680000541">"端末のストレージに空き領域がありません。ファイルを削除して空き領域を確保してください。"</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"ネットワークが監視される場合があります"</string> - <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"不明な第三者によって監視される場合があります"</string> + <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"不明な第三者"</string> <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>によって監視される場合があります"</string> <string name="me" msgid="6545696007631404292">"自分"</string> <string name="power_dialog" product="tablet" msgid="8545351420865202853">"タブレットオプション"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetoothの設定へのアクセス"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ローカルのBluetoothタブレットを設定することと、リモート端末を検出してペアに設定することをアプリに許可します。"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ローカルのBluetooth携帯端末を設定することと、リモート端末を検出してペアに設定することをアプリに許可します。"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"アプリによるBluetoothペア設定を許可"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ユーザーの操作なしでリモート端末とペア設定することをアプリに許可します。"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ユーザーの操作なしでリモート端末とペア設定することをアプリに許可します。"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAXへの接続と切断"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"WiMAXがONになっているかどうかを識別し、接続されているWiMAXネットワークの情報を表示することをアプリに許可します。"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX状態の変更"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"しばらくしてから再試行"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"全画面表示を終了するには、上から下にスワイプ"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index f23395749446..30a02c377180 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth-ის პარამეტრებზე წვდომა"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"აპს შეეძლება ადგილობრივი Bluetooth ტაბლეტის პარამეტრების დაყენება და დისტანციური მოწყობილობების აღმოჩენა და დაწყვილება."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"აპს შეეძლება ტელეფონის ადგილობრივი Bluetooth პარამეტრების დაყენება და დისტანციური მოწყობილობების აღმოჩენა და დაწყვილება."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"აპლიკაციის მიერ Bluetooth დაწყვილების განხორციელების ნების დართვა"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"უფლებას ანიჭებს აპს დააწყვილოს დისტანციური მოწყობილობები მომხმარებელთან ინტერაქციის გარეშე."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"უფლებას ანიჭებს აპს დააწყვილოს დისტანციური მოწყობილობები მომხმარებელთან ინტერაქციის გარეშე."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-თან დაკავშირება და კავშირის გაწყვეტა"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"აპს შეეძლება განსაზღვროს, WiMAX არის თუ არა ჩართული და ასევე ინფორმაცია ნებისმიერი დაკავშირებული WiMAX ქსელის შესახებ."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX მდგომარეობის შეცვლა"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"სცადეთ მოგვიანებით"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"ჩამოასრიალეთ ზევიდან სრული ეკრანის დასახურად"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 366cc619f2d2..de0aaead0c6d 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -163,9 +163,9 @@ <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"របៀបស្ងាត់"</string> <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"បិទសំឡេង"</string> <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"បើកសំឡេង"</string> - <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"របៀបជិះយន្តហោះ"</string> + <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"ពេលជិះយន្តហោះ"</string> <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"បានបើករបៀបពេលជិះយន្តហោះ"</string> - <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បានបិទរបៀបយន្តហោះ"</string> + <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"បានបិទរបៀបពេលជិះយន្តហោះ"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="safeMode" msgid="2788228061547930246">"របៀបសុវត្ថិភាព"</string> <string name="android_system_label" msgid="6577375335728551336">"ប្រព័ន្ធ Android"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ចូលដំណើរការការកំណត់ប៊្លូធូស"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ឲ្យកម្មវិធីកំណត់រចនាសម្ព័ន្ធកុំព្យូទ័របន្ទះប៊្លូធូសមូលដ្ឋាន និងរកមើល ព្រមទាំងផ្គូផ្គងជាមួយឧបករណ៍ពីចម្ងាយ។"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ឲ្យកម្មវិធីមើលការកំណត់រចនាសម្ព័ន្ធប៊្លូធូសក្នុងទូរស័ព្ទ ដើម្បីរកមើល និងផ្គូផ្គងជាមួយឧបករណ៍ពីចម្ងាយ។"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ឲ្យប៊្លូធូសផ្គូផ្គងជាមួយកម្មវិធី"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ឲ្យកម្មវិធីផ្គូផ្គងជាមួយឧបករណ៍ពីចម្ងាយដោយគ្មានអំពើពីអ្នកប្រើ។"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ឲ្យកម្មវិធីផ្គូផ្គងជាមួយឧបករណ៍ពីចម្ងាយដោយគ្មានអំពើពីអ្នកប្រើ។"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"ភ្ជាប់ និងផ្ដាច់ពី WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ឲ្យកម្មវិធីកំណត់ថាតើ WiMAX ត្រូវបានបើក និងព័ត៌មានអំពីបណ្ដាញ WiMAX ដែលត្រូវបានតភ្ជាប់។"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ប្ដូរស្ថានភាព WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"សូមព្យាយាមម្ដងទៀតនៅពេលក្រោយ។"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"អូសចុះក្រោម ដើម្បីចេញពីការបង្ហាញពេញអេក្រង់"</string> + <string name="done_label" msgid="2093726099505892398">"រួចរាល់"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"គ្រាប់រំកិលរង្វង់ម៉ោង"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"គ្រាប់រំកិលរង្វង់នាទី"</string> + <string name="select_hours" msgid="6043079511766008245">"ជ្រើសម៉ោង"</string> + <string name="select_minutes" msgid="3974345615920336087">"ជ្រើសនាទី"</string> + <string name="day_picker_description" msgid="8990847925961297968">"ក្រឡាខែនៃថ្ងៃ"</string> + <string name="year_picker_description" msgid="5524331207436052403">"បញ្ជីឆ្នាំ"</string> + <string name="select_day" msgid="7774759604701773332">"ជ្រើសខែ និងថ្ងៃ"</string> + <string name="select_year" msgid="7952052866994196170">"ជ្រើសឆ្នាំ"</string> + <string name="item_is_selected" msgid="949687401682476608">"បានជ្រើស <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"បានលុប <xliff:g id="KEY">%1$s</xliff:g>"</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 1033a423bfa5..fb3fa683b33c 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -132,7 +132,7 @@ <string name="low_memory" product="tablet" msgid="6494019234102154896">"태블릿 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장 여유 공간을 늘리세요."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"휴대전화 저장공간이 꽉 찼습니다. 일부 파일을 삭제하여 저장공간을 늘리세요."</string> <string name="ssl_ca_cert_warning" msgid="5848402127455021714">"네트워크가 모니터링될 수 있음"</string> - <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"알 수 없는 제3자가 모니터링"</string> + <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"알 수 없는 제3자의 모니터링"</string> <string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"<xliff:g id="MANAGING_DOMAIN">%s</xliff:g>에서 모니터링"</string> <string name="me" msgid="6545696007631404292">"나"</string> <string name="power_dialog" product="tablet" msgid="8545351420865202853">"태블릿 옵션"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"블루투스 설정에 액세스"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"앱이 로컬 블루투스 태블릿을 설정한 다음 원격 기기를 검색하여 페어링할 수 있도록 허용합니다."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"앱이 로컬 블루투스 휴대전화를 설정한 다음 원격 기기를 검색하여 페어링할 수 있도록 허용합니다."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"애플리케이션에서 블루투스 페어링 허용"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"앱이 사용자 상호작용 없이 원격 기기와 페어링할 수 있도록 허용합니다."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"앱이 사용자 상호작용 없이 원격 기기와 페어링할 수 있도록 허용합니다."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX 연결 및 연결 해제"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"앱이 WiMAX를 사용하도록 설정했는지 여부와 연결된 WiMAX 네트워크에 대한 정보를 결정할 수 있도록 허용합니다."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX 상태 변경"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"나중에 다시 시도"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"전체화면을 종료하려면 위에서 아래로 스와이프"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index 0d0bb79224d2..b04c319c1b6d 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -145,7 +145,7 @@ <string name="silent_mode_silent" msgid="319298163018473078">"ປິດສຽງຣິງໂທນ"</string> <string name="silent_mode_vibrate" msgid="7072043388581551395">"ສັ່ນພ້ອມສຽງຣິງໂທນ"</string> <string name="silent_mode_ring" msgid="8592241816194074353">"ເປີດສຽງໂທເຂົ້າແລ້ວ"</string> - <string name="shutdown_progress" msgid="2281079257329981203">"ກຳລັງປິດລົງ..."</string> + <string name="shutdown_progress" msgid="2281079257329981203">"ກຳລັງປິດລະບົບລົງ..."</string> <string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"ແທັບເລັດຂອງທ່ານຈະຖືກປິດ."</string> <string name="shutdown_confirm" product="default" msgid="649792175242821353">"ໂທລະສັບຂອງທ່ານຈະຖືກປິດ."</string> <string name="shutdown_confirm_question" msgid="2906544768881136183">"ທ່ານຕ້ອງການທີ່ຈະປິດບໍ່?"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"ເຂົ້າເຖິງການຕັ້ງຄ່າ Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"ອະນຸຍາດໃຫ້ແອັບຯຕັ້ງຄ່າແທັບເລັດ Bluetooth ພາຍໃນ ແລະຊອກຫາ ແລະເຊື່ອມຕໍ່ໄວ້ກັບອຸປະກອນພາຍນອກ."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"ອະນຸຍາດໃຫ້ແອັບຯຕັ້ງຄ່າ Bluetooth ໃນໂທລະສັບ ເພື່ອຊອກຫາ ແລະການເຊື່ອມຕໍ່ກັບອຸປະກອນໄຮ້ສາຍພາຍນອກ."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນຈັບຄູ່ Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"ອະນຸຍາດໃຫ້ແອັບຯ ຈັບຄູ່ອຸປະກອນຈາກໄລຍະໄກ ໂດຍຜູ່ໃຊ້ບໍ່ຕ້ອງເຮັດຫຍັງ."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"ອະນຸຍາດໃຫ້ແອັບຯ ຈັບຄູ່ອຸປະກອນຈາກໄລຍະໄກ ໂດຍຜູ່ໃຊ້ບໍ່ຕ້ອງເຮັດຫຍັງ."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"ເຊື່ອມຕໍ່ ແລະຕັດການເຊື່ອມຕໍ່ຈາກ WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"ອະນຸຍາດໃຫ້ແອັບຯກວດເບິ່ງວ່າ WiMAX ຖືກເປີດນຳໃຊ້ຢູ່ບໍ່ ແລະຂໍ້ມູນກ່ຽວກັບເຄືອຂ່າຍ WiMAX ອື່ນໆທີ່ກຳລັງເຊື່ອມຕໍ່ຢູ່."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ປ່ຽນສະຖານະ WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"ລອງໃໝ່ອີກຄັ້ງໃນພາຍຫລັງ."</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"ປັດລົງຈາກເທິງສຸດເພື່ອອກຈາກໂໝດເຕັມໜ້າຈໍ"</string> + <string name="done_label" msgid="2093726099505892398">"ແລ້ວໆ"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"ໂຕໝຸນປັບຊົ່ວໂມງ"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"ໂຕໝຸນປັບນາທີ"</string> + <string name="select_hours" msgid="6043079511766008245">"ເລືອກຊົ່ວໂມງ"</string> + <string name="select_minutes" msgid="3974345615920336087">"ເລືອກນາທີ"</string> + <string name="day_picker_description" msgid="8990847925961297968">"ຕາຕາລາງວັນທີເດືອນປີ"</string> + <string name="year_picker_description" msgid="5524331207436052403">"ລາຍການປີ"</string> + <string name="select_day" msgid="7774759604701773332">"ເລືອກເດືອນ ແລະ ວັນ"</string> + <string name="select_year" msgid="7952052866994196170">"ເລືອກປີ"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> ຖືກເລືອກແລ້ວ"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> ຖືກລຶບແລ້ວ"</string> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index b9cd13ad2597..10cce954ccb7 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"pasiekti „Bluetooth“ nustatymus"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Leidžiama programai konfigūruoti vietinį „Bluetooth“ planšetinį kompiuterį ir atrasti nuotolinius įrenginius bei su jais susieti."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Leidžiama programai konfigūruoti vietinį „Bluetooth“ telefoną ir atrasti bei susieti su nuotoliniais įrenginiais."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"leisti „Bluetooth“ susiejimą naudojant programą"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Leidžiama programai susieti su nuotolinio valdymo įrenginiais be naudotojo įsikišimo."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Leidžiama programai susieti su nuotolinio valdymo įrenginiais be naudotojo įsikišimo."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"prisijungti prie WiMAX ir atsijungti nuo jo"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Leidžiama programai nustatyti, ar įgalintas „WiMAX“, ir informaciją apie visus prijungtus tinklus."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Keisti „WiMAX“ būseną"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Vėliau bandykite dar kartą"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Perbr. žemyn, kad išeit. iš viso ekr. rež."</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 17bbafbf2df1..79be527d346a 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"piekļūt Bluetooth iestatījumiem"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ļauj lietotnei konfigurēt vietējo Bluetooth planšetdatoru, kā arī atklāt attālas ierīces un savienot tās pārī."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ļauj lietotnei konfigurēt vietējo Bluetooth tālruni, kā arī atklāt attālas ierīces un savienot tās pārī."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth ierīču savienošana pārī, izmantojot lietojumprogrammu"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Ļauj lietotnei izveidot savienojumu pārī ar tālvadības ierīcēm bez lietotāju mijiedarbības."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Ļauj lietotnei izveidot savienojumu pārī ar tālvadības ierīcēm bez lietotāju mijiedarbības."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX savienojuma izveide un pārtraukšana"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ļauj lietotnei noteikt, vai WiMAX ir iespējots, un sniedz informāciju par visiem WiMAX tīkliem, ar kuriem ir izveidots savienojums."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX statusa mainīšana"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Vēlāk mēģiniet vēlreiz."</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Lai izietu no pilnekr., velc. no augšas lejup."</string> + <string name="done_label" msgid="2093726099505892398">"Gatavs"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Stundu apļveida slīdnis"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Minūšu apļveida slīdnis"</string> + <string name="select_hours" msgid="6043079511766008245">"Atlasiet stundas."</string> + <string name="select_minutes" msgid="3974345615920336087">"Atlasiet minūtes."</string> + <string name="day_picker_description" msgid="8990847925961297968">"Režģis ar mēneša dienām"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Gadu saraksts"</string> + <string name="select_day" msgid="7774759604701773332">"Atlasiet mēnesi un dienu."</string> + <string name="select_year" msgid="7952052866994196170">"Atlasiet gadu."</string> + <string name="item_is_selected" msgid="949687401682476608">"Atlasīts: <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> tika dzēsts."</string> </resources> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 2ff211904e6c..24d730936244 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Блютүүт тохиргоонд хандах"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Апп нь дотоод блютүүт таблетын тохиргоог харах боломжтой ба хос болох төхөөрөмжтэй холболтыг зөвшөөрөх болон хийх боломжтой"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Апп нь утасны дотоод блютүүтыг тохируулах боломжтой ба гадаад төхөөрөмжийг олох болон хос үүсгэх боломжтой."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Аппликешнд Блютүүт хоallow Bluetooth pairing by Application"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Апп-д хэрэглэгчтэй харьцахгүйгээр зайны төхөөрөмжүүдтэй хослох боломж олгоно."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-д холбогдох болон салах"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Апп нь WiMAX идэвхтэй эсэх болон холбогдсон WiMAX сүлжээний талаар мэдээллийг тодорхойлох боломжтой."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX статусыг өөрчлөх"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Дараа дахин оролдоно уу"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Бүтэн дэлгэцээс гарахын тулд дээрээс нь эхлэн доош шудрана уу"</string> + <string name="done_label" msgid="2093726099505892398">"Дууссан"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Цаг гүйлгэгч"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Минут гүйлгэгч"</string> + <string name="select_hours" msgid="6043079511766008245">"Цаг сонгоно уу"</string> + <string name="select_minutes" msgid="3974345615920336087">"Минут сонгоно уу"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Өдрүүдийг сараар"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Жилийн жагсаалт"</string> + <string name="select_day" msgid="7774759604701773332">"Сар болон өдрийг сонгоно уу"</string> + <string name="select_year" msgid="7952052866994196170">"Жилийг сонгоно уу"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> сонгогдсон"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> устсан"</string> </resources> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index d787536ac3b1..8bd9a9785d77 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -249,7 +249,7 @@ <string name="permlab_install_shortcut" msgid="4279070216371564234">"pasang pintasan"</string> <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Membenarkan aplikasi menambah pintasan Skrin Laman Utama tanpa campur tangan pengguna."</string> <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"nyahpasang pintasan"</string> - <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Membenarkan aplikasi memadam pintasan Skrin Laman Utama tanpa campur tangan pengguna."</string> + <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Membenarkan aplikasi mengalih keluar pintasan Skrin Laman Utama tanpa campur tangan pengguna."</string> <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"tukar laluan panggilan keluar"</string> <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Membenarkan apl memproses panggilan keluar dan menukar nombor yang perlu didail. Kebenaran ini membolehkan apl memantau, mengalih atau menghalang panggilan keluar."</string> <string name="permlab_receiveSms" msgid="8673471768947895082">"terima mesej teks (SMS)"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"akses tetapan Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Membenarkan apl mengkonfigurasikan tablet Bluetooth setempat dan menemui serta berpasangan dengan peranti jauh."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Membenarkan apl mengkonfigurasikan telefon Bluetooth setempat dan menemui serta berpasangan dengan peranti jauh."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"benarkan perpasangan Bluetooth oleh Aplikasi"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Membenarkan apl berpasangan dengan peranti jauh tanpa interaksi pengguna."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Membenarkan apl berpasangan dengan peranti jauh tanpa interaksi pengguna."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"sambung dan putuskan sambungan WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Membenarkan apl menentukan sama ada WiMaX didayakan dan maklumat tentang sebarang rangkaian WiMaX yang disambungkan."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Tukar keadaan WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Cuba sebentar lagi"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Leret ke bawah untuk keluar dari skrin penuh"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 3540c0fc0cfb..f948dd6f946b 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"endre Bluetooth-innstillinger"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Lar appen konfigurere det lokale Bluetooth-nettbrettet, samt oppdage og koble sammen med eksterne enheter."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Lar appen konfigurere den lokale Bluetooth-telefonen, samt oppdage og koble sammen med eksterne enheter."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"tillate Bluetooth-sammenkobling av appen"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Lar appen koble til eksterne enheter uten medvirkning fra brukeren."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Lar appen koble til eksterne enheter uten medvirkning fra brukeren."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"koble til eller fra WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Lar appen avgjøre hvorvidt WiMAX er aktivert og finne informasjon om eventuelle tilkoblede WiMAX-nettverk."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Endre WiMAX-status"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Prøv på nytt senere"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Sveip ned for å avslutte fullskjermvisning"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 6a85d9282271..0f5d72d0f80d 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth-instellingen openen"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Hiermee kan de app de lokale Bluetooth-tablet configureren en externe apparaten zoeken en koppelen."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Hiermee kan de app de lokale Bluetooth-telefoon configureren en externe apparaten zoeken en koppelen."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Bluetooth-koppeling door app toestaan"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"De app toestaan te koppelen met externe apparaten zonder tussenkomst van de gebruiker."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"De app toestaan te koppelen met externe apparaten zonder tussenkomst van de gebruiker."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX-verbinding maken en verbreken"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Hiermee kan de app bepalen of WiMAX is ingeschakeld en informatie bekijken over alle WiMAX-netwerken waarmee verbinding is gemaakt."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX-status wijzigen"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Probeer het later opnieuw"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Van boven omlaag vegen: voll. scherm sluiten"</string> + <string name="done_label" msgid="2093726099505892398">"Gereed"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Ronde schuifregelaar voor uren"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Ronde schuifregelaar voor minuten"</string> + <string name="select_hours" msgid="6043079511766008245">"Uren selecteren"</string> + <string name="select_minutes" msgid="3974345615920336087">"Minuten selecteren"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Maandraster van dagen"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Jaarlijst"</string> + <string name="select_day" msgid="7774759604701773332">"Maand en dag selecteren"</string> + <string name="select_year" msgid="7952052866994196170">"Jaar selecteren"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> geselecteerd"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> verwijderd"</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 525e75432b74..e4099f4a3d1d 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"uzyskiwanie dostępu do ustawień Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Pozwala aplikacji na konfigurowanie lokalnego tabletu z funkcją Bluetooth oraz na wykrywanie urządzeń zdalnych i parowanie z nimi."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Pozwala aplikacji na konfigurowanie lokalnego telefonu z funkcją Bluetooth oraz na wykrywanie urządzeń zdalnych i parowanie z nimi."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"zezwól aplikacji na parowanie się przez Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Umożliwia aplikacji parowanie się z urządzeniami zdalnymi bez interakcji użytkownika."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Umożliwia aplikacji parowanie się z urządzeniami zdalnymi bez interakcji użytkownika."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"łączenie się i rozłączanie z siecią WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Pozawala aplikacji określić, czy obsługa WiMAX jest włączona, oraz uzyskać informacje o wszystkich podłączonych sieciach WiMAX."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"zmienianie stanu WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Spróbuj ponownie później"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Przesuń z góry w dół, by zamknąć pełny ekran"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index b7fe21fafb16..852dddf5e6b4 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"aceder às definições de Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite à aplicação configurar o tablet Bluetooth local, bem como descobrir e emparelhar com dispositivos remotos."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que a aplicação configure o telemóvel Bluetooth local, bem como descobrir e emparelhar com dispositivos remotos."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir a sincronização Bluetooth por aplicação"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que a aplicação seja sincronizada com dispositivos remotos sem interação do utilizador."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que a aplicação seja sincronizada com dispositivos remotos sem interação do utilizador."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"ligar e desligar do WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que a aplicação determine se o WiMAX está ativado e aceda a informações acerca de qualquer rede WiMAX que esteja ligada."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Alterar estado do WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Deslize para baixo para sair do ecrã inteiro"</string> + <string name="done_label" msgid="2093726099505892398">"Concluído"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Controlo de deslize circular das horas"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Controlo de deslize circular dos minutos"</string> + <string name="select_hours" msgid="6043079511766008245">"Selecionar horas"</string> + <string name="select_minutes" msgid="3974345615920336087">"Selecionar minutos"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Grelha de dias do mês"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Lista de anos"</string> + <string name="select_day" msgid="7774759604701773332">"Selecionar mês e dia"</string> + <string name="select_year" msgid="7952052866994196170">"Selecionar ano"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> selecionado"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> eliminado"</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index d889331dcd1b..3554ccfd1908 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"acessar configurações de Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite que um aplicativo configure o tablet Bluetooth local, descubra dispositivos remotos e emparelhe com eles."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite que um aplicativo configure o telefone Bluetooth local, descubra e emparelhe com dispositivos remotos."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permitir pareamento via Bluetooth pelo aplicativo"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite que o aplicativo faça pareamento com dispositivos remotos sem interação com o usuário."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite que o aplicativo faça pareamento com dispositivos remotos sem interação com o usuário."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"conectar e desconectar do WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite que o aplicativo determine se o WiMAX está ativado e acesse informações sobre as redes WiMAX conectadas."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Alterar estado do WiMAX"</string> @@ -639,7 +642,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permite que o aplicativo grave novas palavras no dicionário do usuário."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"ler conteúdo do armaz. USB"</string> <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"ler conteúdo do cartão SD"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Permite que o aplicativo leia o conteúdo do cartão SD."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Perm. que app leia cartão SD."</string> <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Permite que o aplicativo leia o conteúdo do cartão SD."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificar ou excluir conteúdo do armazenamento USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar ou excluir o conteúdo do cartão SD"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Deslize para baixo para sair da tela inteira"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index 25e3c4f72b12..ae52b93d01bc 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -1025,6 +1025,12 @@ <skip /> <!-- no translation found for permdesc_bluetoothAdmin (8931682159331542137) --> <skip /> + <!-- no translation found for permlab_bluetoothPriv (4009494246009513828) --> + <skip /> + <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) --> + <skip /> + <!-- no translation found for permdesc_bluetoothPriv (8045735193417468857) --> + <skip /> <!-- no translation found for permlab_accessWimaxState (4195907010610205703) --> <skip /> <!-- no translation found for permdesc_accessWimaxState (6360102877261978887) --> @@ -2728,4 +2734,26 @@ <skip /> <!-- no translation found for transient_navigation_confirmation (8554991488096662508) --> <skip /> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 965f22f60e57..087832faecb7 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"accesează setările Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Permite aplicaţiei să configureze tableta Bluetooth locală, să descopere şi să se împerecheze cu dispozitive la distanţă."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Permite aplicaţiei să configureze telefonul Bluetooth local, să descopere şi să se împerecheze cu dispozitive la distanţă."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"permiteți conectarea aplicației prin Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Permite aplicației să se conecteze la dispozitive de la distanță, fără intervenția utilizatorului."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Permite aplicației să se conecteze la dispozitive de la distanță, fără intervenția utilizatorului."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"se conectează şi se deconectează de la WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Permite aplicaţiei să stabilească dacă o reţea WiMAX este activată şi să vadă informaţiile cu privire la toate reţelele WiMAX conectate."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Schimbaţi starea WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Reîncercați mai târziu"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Glisați în jos pt. a ieși din ecran complet"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 9cf7724e46b7..db38dd26d6db 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Доступ к настройкам Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Приложение сможет настраивать параметры локального планшетного ПК с поддержкой Bluetooth, а также обнаруживать удаленные устройства и выполнять сопряжение с ними."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Приложение сможет настраивать параметры локального телефона с поддержкой Bluetooth, а также обнаруживать удаленные устройства и выполнять сопряжение с ними."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Подключение устройств через Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Приложение сможет самостоятельно подключаться к удаленным устройствам."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Приложение сможет самостоятельно подключаться к удаленным устройствам."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"подключать/отключать сеть WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Приложение сможет определять, активирован ли WiMAX, а также получать информацию о подключенных сетях WiMAX."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Изменение статуса WiMAX"</string> @@ -639,8 +642,8 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Приложение сможет добавлять слова в пользовательский словарь."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"Просмотр данных на USB-накопителе"</string> <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"Считывание содержимого SD-карты"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Приложение сможет считывать данные с USB-накопителя."</string> - <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Приложение сможет считывать содержимое SD-карты."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="3446988712598386079">"Приложение сможет считывать данные на USB-накопителе."</string> + <string name="permdesc_sdcardRead" product="default" msgid="2607362473654975411">"Приложение сможет считывать данные на SD-карте."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"Изменение/удаление данных на USB-накопителе"</string> <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Изменение или удаление содержимого SD-карты"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Приложение сможет записывать данные на USB-накопитель."</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Повторите попытку позже."</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Чтобы вернуться в обычный режим, проведите пальцем вниз"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 5c9072ecb0aa..efecfc62b5b2 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"pristupovať k nastaveniam Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Umožňuje aplikácii konfigurovať miestny tablet s rozhraním Bluetooth a vyhľadávať a spárovať vzdialené zariadenia."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Umožňuje aplikácii konfigurovať miestny telefón s rozhraním Bluetooth, vyhľadávať a spárovať vzdialené zariadenia."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"povoliť aplikácii párovanie prostredníctvom rozhrania Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Umožňuje aplikácii párovanie so vzdialenými zariadeniami bez zásahu používateľa."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Umožňuje aplikácii párovanie so vzdialenými zariadeniami bez zásahu používateľa."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"pripojiť a odpojiť od WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Umožňuje aplikácii určiť, či je povolený štandard WiMAX, a tiež informácie o všetkých pripojených sieťach WiMAX."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Zmeniť stav siete WiMAX"</string> @@ -1258,7 +1261,7 @@ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Všetky súbory uložené v ukladacom priestore USB budú vymazané. Táto akcia sa nedá vrátiť späť!"</string> <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Všetky údaje na vašej karte budú stratené."</string> <string name="extmedia_format_button_format" msgid="4131064560127478695">"Formát"</string> - <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez rozhranie USB pripojené"</string> + <string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez USB pripojené"</string> <string name="adb_active_notification_message" msgid="1016654627626476142">"Dotknutím zakážete ladenie USB."</string> <string name="select_input_method" msgid="4653387336791222978">"Zvoliť metódu vstupu"</string> <string name="configure_input_methods" msgid="9091652157722495116">"Nastavenie metód vstupu"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Skúste to znova neskôr"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Režim celej obraz. ukončíte posunutím nadol"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 59c8821223b5..ac685036f9a6 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"dostop do nastavitev Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Programu omogoča konfiguriranje lokalnega tabličnega računalnika Bluetooth ter zaznavanje oddaljenih naprav in združevanje z njimi."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Programu omogoča konfiguriranje lokalnega telefona s tehnologijo Bluetooth ter odkrivanje oddaljenih naprav in povezovanje z njimi."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"aplikaciji dovoli seznanjanje prek povezave Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Aplikaciji dovoljuje seznanjanje z oddaljenimi napravami brez interakcije uporabnika."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Aplikaciji dovoljuje seznanjanje z oddaljenimi napravami brez interakcije uporabnika."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"vzpostavitev povezave z omrežjem WiMax in prekinitev povezave z njim"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Aplikaciji omogoča, da ugotovi, ali je WiMAX omogočen, in ogled podatkov o povezanih omrežjih WiMAX."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Sprememba stanja omrežja WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Poskusite znova pozneje"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Povlecite z vrha, da zaprete celozas. način"</string> + <string name="done_label" msgid="2093726099505892398">"Dokončano"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Okrogli drsnik za ure"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Okrogli drsnik za minute"</string> + <string name="select_hours" msgid="6043079511766008245">"Izberite ure"</string> + <string name="select_minutes" msgid="3974345615920336087">"Izberite minute"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Mesečna mreža dni"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Seznam let"</string> + <string name="select_day" msgid="7774759604701773332">"Izberite mesec in dan"</string> + <string name="select_year" msgid="7952052866994196170">"Izberite leto"</string> + <string name="item_is_selected" msgid="949687401682476608">"Izbrano: <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"Številka <xliff:g id="KEY">%1$s</xliff:g> je izbrisana"</string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 81ffdd625dce..1a34c8917fc5 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"приступ Bluetooth подешавањима"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Дозвољава апликацији да конфигурише локални Bluetooth таблет, као и да открије даљинске уређаје и упари се са њима."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Дозвољава апликацији да конфигурише локални Bluetooth телефон, као и да открије даљинске уређаје и упари се са њима."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"омогућавање упаривања апликације преко Bluetooth-а"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Омогућава апликацији да се упарује са удаљеним уређајима без интеракције корисника."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Омогућава апликацији да се упарује са удаљеним уређајима без интеракције корисника."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"повезивање и прекид везе са WiMAX-ом"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Дозвољава апликацији да утврди да ли је WiMAX омогућен, као и информације о било којим повезаним WiMAX мрежама."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Промени WiMAX статус"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Покушајте поново касније"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Превуците надоле од врха за излаз из целог екрана"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index eb347041ef5e..dca9067e19e3 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"få åtkomst till Bluetooth-inställningar"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Tillåter att appen konfigurerar den lokala Bluetooth-surfplattan samt upptäcker och parkopplar den med fjärranslutna enheter."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Tillåter att appen konfigurerar den lokala Bluetooth-mobilen samt upptäcker och parkopplar den med fjärranslutna enheter."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"tillåt Bluetooth-koppling för appen"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Tillåter att appen kopplas till fjärrenheter utan interaktion med användare."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Tillåter att appen kopplas till fjärrenheter utan interaktion med användare."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"ansluta till och koppla från WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Tillåter att appen avgör om WiMAX är aktiverat och kommer åt information om eventuella anslutna WiMAX-nätverk."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"ändra WiMAX-status"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Försök igen senare"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Dra nedåt om du vill avbryta fullskärmsläget"</string> + <string name="done_label" msgid="2093726099505892398">"Klart"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Cirkelreglage för timmar"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Cirkelreglage för minuter"</string> + <string name="select_hours" msgid="6043079511766008245">"Välj timmar"</string> + <string name="select_minutes" msgid="3974345615920336087">"Välj minuter"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Rutnät för månad"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Lista över år"</string> + <string name="select_day" msgid="7774759604701773332">"Välj månad och dag"</string> + <string name="select_year" msgid="7952052866994196170">"Välj år"</string> + <string name="item_is_selected" msgid="949687401682476608">"<xliff:g id="ITEM">%1$s</xliff:g> har markerats"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> har tagits bort"</string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index b8391b995bc9..c67af9e8b327 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -247,9 +247,9 @@ <string name="permlab_expandStatusBar" msgid="1148198785937489264">"panua/kunja mwambaa hali"</string> <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Inaruhusu programu kupanua au kukunja upau wa hali."</string> <string name="permlab_install_shortcut" msgid="4279070216371564234">"sakinisha njia za mkato"</string> - <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Huruhusu programu kuongeza njia za mkato za Skrini ya nyumbani bila mtumiaji kuhusika."</string> + <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Huruhusu programu kuongeza njia za mkato za Skrini ya kwanza bila mtumiaji kuingilia."</string> <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"ondoa njia za mikato"</string> - <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Huruhusu programu kuondoa njia za mkato za Skrini ya nyumbani bila mtumiaji kuhusika."</string> + <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Huruhusu programu kuondoa njia za mkato za Skrini ya kwanza bila mtumiaji kuingilia."</string> <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"panga upya simu zinazotoka"</string> <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Inaruhusu programu kuchakata simu zinazotoka nje na kubadilisha nambari ya kupigwa. Idhini hii inaruhusu programu kuchunguza, kuelekeza upya, au kuzuia simu zinazotoka nje."</string> <string name="permlab_receiveSms" msgid="8673471768947895082">"pokea ujumbe wa maandishi wa SMS"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"fikia mipangilio ya Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Inaruhusu programu kusanidi kompyuta kibao ya karibu ya Bluetooth na kutambua na kuoanisha na vifaa vya kudhibiti."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Inaruhusu programu kusanidi simu ya karibu ya Bluetooth, na kutambua na kuoanisha na vifaa vya mbali."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"ruhusu uoanishaji wa Bluetooth kwa Programu"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Inaruhusu programu kuoanisha na vifaa vya mbali bila mtumiaji kuingilia."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Inaruhusu programu kuoanisha na vifaa vya mbali bila mtumiaji kuingilia."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"unganisha na uukate muunaganisho kutoka kwenye WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Inaruhusu programu kuthibitisha ikiwa WiMAX imewezeshwa na taarifa kuhusu mitandao yoyote ya WiMAX ambayo imeunganishwa."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Badilisha hali ya WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Jaribu tena baadaye"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Telezesha kidole kwa kasi chini kuanzia juu ili uondoke kwenye skrini kamili"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index d167471739f4..ad61bf689350 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"เข้าถึงการตั้งค่าบลูทูธ"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"อนุญาตให้แอปพลิเคชันกำหนดค่าแท็บเล็ตบลูทูธในตัวเครื่อง รวมทั้งค้นหาและจับคู่กับอุปกรณ์ที่อยู่ระยะไกล"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"อนุญาตให้แอปพลิเคชันกำหนดค่าโทรศัพท์บลูทูธในตัวเครื่อง ตลอดจนค้นหาและจับคู่กับอุปกรณ์ที่อยู่ระยะไกล"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"อนุญาตให้แอปพลิเคชันจับคู่บลูทูธ"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"อนุญาตให้แอปจับคู่กับอุปกรณ์ระยะไกลโดยไม่ต้องมีการโต้ตอบของผู้ใช้"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"อนุญาตให้แอปจับคู่กับอุปกรณ์ระยะไกลโดยไม่ต้องมีการโต้ตอบของผู้ใช้"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"เชื่อมต่อและเลิกเชื่อมต่อจาก WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"อนุญาตให้แอปพลิเคชันตรวจสอบว่า WiMAX เปิดใช้งานอยู่หรือไม่และข้อมูลเกี่ยวกับเครือข่าย WiMAX ใดๆ ที่เชื่อมต่ออยู่"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"เปลี่ยนสถานะของ WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"ลองอีกครั้งในภายหลัง"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"กวาดนิ้วจากบนลงล่างเพื่อออกจากโหมดเต็มหน้าจอ"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index b0b707e9fbd0..bd56c7804c91 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"I-access ang mga setting ng Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Pinapayagan ang app na i-configure ang lokal na Bluetooth tablet, at tumuklas ng at ipares sa mga malayuang device."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Pinapayagan ang app na i-configure ang lokal na Bluetooth na telepono, at tumuklas ng at ipares sa mga malayuang device."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"payagan ang pagpapares ng Bluetooth sa pamamagitan ng Application"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Pinapayagan ang app na pumares sa mga malayuang device nang walang pakikipag-ugnay sa user."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Pinapayagan ang app na pumares sa mga malayuang device nang walang pakikipag-ugnay sa user."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"kumonekta at magdiskonekta mula sa WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Pinapayagan ang app na tukuyin kung pinapagana ang WiMAX at impormasyon tungkol sa anumang mga WiMAX network na nakakonekta."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Baguhin ang katayuan ng WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Subukang muli sa ibang pagkakataon"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Mag-swipe pababa upang lumabas sa full screen"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 35c68d47287d..b0ce115180c6 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -246,10 +246,10 @@ <string name="permdesc_statusBarService" msgid="716113660795976060">"Uygulamaya, durum çubuğu olma izni verir."</string> <string name="permlab_expandStatusBar" msgid="1148198785937489264">"durum çubuğunu genişlet/daralt"</string> <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Uygulamaya, durum çubuğunu genişletip daraltma izni verir."</string> - <string name="permlab_install_shortcut" msgid="4279070216371564234">"kısayolları yükle"</string> - <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Uygulamaya, kullanıcı müdahalesi olmadan kısayolları Ana ekrana ekleme izni verir."</string> - <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"kısayolların yüklemesini kaldır"</string> - <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Uygulamaya, kullanıcının müdahalesi olmadan kısayolları Ana ekrandan kaldırma izni verir."</string> + <string name="permlab_install_shortcut" msgid="4279070216371564234">"kısayolları yükleme"</string> + <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Uygulamaya, kullanıcı müdahalesi olmadan kısayolları Ana Ekrana ekleme izni verir."</string> + <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"kısayolların yüklemesini kaldırma"</string> + <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Uygulamaya, kullanıcının müdahalesi olmadan kısayolları Ana Ekrandan kaldırma izni verir."</string> <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"giden çağrıları yeniden yönlendir"</string> <string name="permdesc_processOutgoingCalls" msgid="5331318931937402040">"Uygulamaya, yapılan çağrıları işleme ve aranacak numarayı değiştirme izni verir. Bu izin, uygulamanın yapılan çağrıları izlemesine, yönlendirmesine ve önlemesine olanak sağlar."</string> <string name="permlab_receiveSms" msgid="8673471768947895082">"kısa mesajları al (SMS)"</string> @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth ayarlara eriş"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Uygulamaya, yerel Bluetooth tabletini yapılandırma ve uzak cihazları keşfedip bunlarla eşleşme izni verir."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Uygulamaya, yerel Bluetooth telefonunu yapılandırma ve uzak cihazları keşfedip bunlarla eşleşme izni verir."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"Uygulama tarafından yapılan Bluetooth eşleştirmelerine izin ver"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Uygulamaya, kullanıcının müdahalesi olmadan uzak cihazlarla eşleme izni verir."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Uygulamaya, kullanıcının müdahalesi olmadan uzak cihazlarla eşleme izni verir."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"WiMAX\'e bağlan veya WiMAX bağlantısını kes"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Uygulamaya, WiMAX\'in etkin olup olmadığını belirleme ve bağlı tüm WiMAX ağlarıyla ilgili bilgilere erişme izni verir."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"WiMAX durumunu değiştir"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Daha sonra tekrar deneyin"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Tam ekrandan çıkmak için aşağıya hızlıca kaydırın"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 9fc8b5e36777..796de25eb6e6 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"отримувати доступ до налаштувань Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Дозволяє програмі налаштовувати планшетний ПК із локальним Bluetooth, а також знаходити віддалені пристрої та створювати з ними пару."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Дозволяє програмі налаштовувати телефон із локальним Bluetooth, а також знаходити віддалені пристрої та створювати з ними пару."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"дозволити програмі створювати пару з Bluetooth"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Дозволяє програмі самостійно підключатись до віддалених пристроїв."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Дозволяє програмі самостійно підключатись до віддалених пристроїв."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"під’єднуватися та від’єднуватися від WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Дозволяє програмі визначати, чи ввімкнено WiMAX, а також переглядати інформацію про будь-які під’єднані мережі WiMAX."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Змінити стан WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Спробуйте пізніше"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Проведіть пальцем зверху вниз, щоб зменшити"</string> + <string name="done_label" msgid="2093726099505892398">"Готово"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Вибір годин на циферблаті"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Вибір хвилин на циферблаті"</string> + <string name="select_hours" msgid="6043079511766008245">"Виберіть години"</string> + <string name="select_minutes" msgid="3974345615920336087">"Виберіть хвилини"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Дні місяця – ескізи"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Роки – список"</string> + <string name="select_day" msgid="7774759604701773332">"Виберіть місяць і день"</string> + <string name="select_year" msgid="7952052866994196170">"Виберіть рік"</string> + <string name="item_is_selected" msgid="949687401682476608">"Вибрано: <xliff:g id="ITEM">%1$s</xliff:g>"</string> + <string name="deleted_key" msgid="7659477886625566590">"<xliff:g id="KEY">%1$s</xliff:g> видалено"</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 348d8852a423..589fd6f21929 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"truy cập cài đặt Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Cho phép ứng dụng định cấu hình máy tính bảng Bluetooth cục bộ cũng như phát hiện và ghép nối với các thiết bị từ xa."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Cho phép ứng dụng định cấu hình điện thoại Bluetooth cục bộ cũng như phát hiện và ghép nối với các thiết bị từ xa."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"cho phép ghép nối Bluetooth theo ứng dụng"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Cho phép ứng dụng ghép nối với các thiết bị từ xa mà không cần tương tác của người dùng."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Cho phép ứng dụng ghép nối với các thiết bị từ xa mà không cần tương tác của người dùng."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"kết nối và ngắt kết nối khỏi WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Cho phép ứng dụng xác định liệu WiMAX đã được bật chưa và thông tin về bất kỳ mạng WiMAX nào được kết nối."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Thay đổi trạng thái WiMAX"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Hãy thử lại sau"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Vuốt từ trên xuống để thoát toàn màn hình"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index a06cf6a89bbf..ac52a2c69b25 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"访问蓝牙设置"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允许应用配置本地蓝牙平板电脑,以及发现远程设备并进行配对。"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"允许应用配置本地蓝牙手机,以及发现远程设备并进行配对。"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"允许应用进行蓝牙配对"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"允许应用自行与远程设备配对。"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"允许应用自行与远程设备配对。"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"建立或中断 WiMAX 网络连接"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"允许该应用确定是否启用了 WiMAX 以及连接的任何 WiMAX 网络的相关信息。"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"更改 WiMAX 状态"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"稍后重试"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"从顶部向下滑动即可退出全屏模式"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index c6d40a80b1c5..2df25dd397f0 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"存取藍牙設定"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允許應用程式設定本機藍牙平板電腦,以及與偵測到的遠端裝置配對。"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"允許應用程式設定本機藍牙手機,以及與偵測到的遠端裝置配對。"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"允許應用程式執行藍牙配對"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"允許應用程式繞過用戶授權直接與遠端裝置配對。"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"允許應用程式繞過用戶授權直接與遠端裝置配對。"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"建立或中斷與 WiMAX 網絡的連線"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"允許應用程式確定是否已啟用 WiMAX,以及判斷任何已連接 WiMAX 網絡的相關資訊。"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"更改 WiMAX 狀態"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"從頂端往下快速滑動即可退出全螢幕"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index c9c3262a361a..c2e8321649a2 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"存取藍牙設定"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"允許應用程式設定本機藍牙平板電腦,以及搜尋遠端裝置並配對連線。"</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"允許應用程式設定本機藍牙手機,以及搜尋遠端裝置並配對連線。"</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"允許應用程式執行藍牙配對"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"允許應用程式自動與遠端裝置配對。"</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"允許應用程式自動與遠端裝置配對。"</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"建立或中斷與 WiMAX 網路的連線"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"允許應用程式判斷是否已啟用 WiMAX,以及判讀任何已連上 WiMAX 網路的相關資訊。"</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"變更 WiMAX 狀態"</string> @@ -1647,4 +1650,26 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"從頂端往下滑動即可結束全螢幕"</string> + <!-- no translation found for done_label (2093726099505892398) --> + <skip /> + <!-- no translation found for hour_picker_description (6698199186859736512) --> + <skip /> + <!-- no translation found for minute_picker_description (8606010966873791190) --> + <skip /> + <!-- no translation found for select_hours (6043079511766008245) --> + <skip /> + <!-- no translation found for select_minutes (3974345615920336087) --> + <skip /> + <!-- no translation found for day_picker_description (8990847925961297968) --> + <skip /> + <!-- no translation found for year_picker_description (5524331207436052403) --> + <skip /> + <!-- no translation found for select_day (7774759604701773332) --> + <skip /> + <!-- no translation found for select_year (7952052866994196170) --> + <skip /> + <!-- no translation found for item_is_selected (949687401682476608) --> + <skip /> + <!-- no translation found for deleted_key (7659477886625566590) --> + <skip /> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index cf2389730ed8..e9cb99516c78 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -611,6 +611,9 @@ <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"finyelela kuzilungiselelo ze-Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ivumela uhlelo lokusebenza ukumisa ithebhulethi ye-Bluetooth yasendawni, nokuthola nokubhanqanisa namadivaysi okulawula okukude."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ivumela uhlelo lokusebenza ukumisa ifoni ye-Bluetooth yasendawni, nokuthola nokubhanqanisa namadivaysi okulawula okukude."</string> + <string name="permlab_bluetoothPriv" msgid="4009494246009513828">"vumela ukumataniswa kwe-Bluetooth ngohlelo lokusebenza"</string> + <string name="permdesc_bluetoothPriv" product="tablet" msgid="8045735193417468857">"Ivumela uhlelo lokusebenza ukuthi lubhanqwe ngamadivayisi wesilawuli kude ngaphandle kokuhlanganyela nomsebenzisi."</string> + <string name="permdesc_bluetoothPriv" product="default" msgid="8045735193417468857">"Ivumela uhlelo lokusebenza ukuthi lubhanqwe ngamadivayisi wesilawuli kude ngaphandle kokuhlanganyela nomsebenzisi."</string> <string name="permlab_accessWimaxState" msgid="4195907010610205703">"xhuma futhi unqamule kusuka ku-WiMAX"</string> <string name="permdesc_accessWimaxState" msgid="6360102877261978887">"Ivumela uhlelo lokusebenza ukucacisa ukuthi ingabe i-WiMAX inikwe amandla futhi ulwazi mayelana namanethiwekhi e-WiMAX axhunyiwe."</string> <string name="permlab_changeWimaxState" msgid="2405042267131496579">"Shintsha isimo se-WiMAX"</string> @@ -1647,4 +1650,15 @@ </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Zama futhi emva kwesikhathi"</string> <string name="transient_navigation_confirmation" msgid="8554991488096662508">"Swayipha ngezansi kusuka ngaphezulu ukuze uphume kusikrini esigcwele"</string> + <string name="done_label" msgid="2093726099505892398">"Kwenziwe"</string> + <string name="hour_picker_description" msgid="6698199186859736512">"Amahora weslayidi esiyindingilizi"</string> + <string name="minute_picker_description" msgid="8606010966873791190">"Amaminithi weslayidi esiyindingilizi"</string> + <string name="select_hours" msgid="6043079511766008245">"Khetha amahora"</string> + <string name="select_minutes" msgid="3974345615920336087">"Khetha amaminithi"</string> + <string name="day_picker_description" msgid="8990847925961297968">"Igridi yenyanga yezinsuku"</string> + <string name="year_picker_description" msgid="5524331207436052403">"Uhlu lonyaka"</string> + <string name="select_day" msgid="7774759604701773332">"Khetha inyanga nosuku"</string> + <string name="select_year" msgid="7952052866994196170">"Khetha unyaka"</string> + <string name="item_is_selected" msgid="949687401682476608">"I-<xliff:g id="ITEM">%1$s</xliff:g> ekhethiwe"</string> + <string name="deleted_key" msgid="7659477886625566590">"I-<xliff:g id="KEY">%1$s</xliff:g> isusiwe"</string> </resources> diff --git a/core/res/res/values/integers.xml b/core/res/res/values/integers.xml index 053fc851ca31..dc90bbff1aae 100644 --- a/core/res/res/values/integers.xml +++ b/core/res/res/values/integers.xml @@ -18,7 +18,5 @@ --> <resources> <integer name="kg_carousel_angle">75</integer> - <integer name="kg_security_flip_duration">100</integer> - <integer name="kg_security_fade_duration">100</integer> <integer name="kg_glowpad_rotation_offset">0</integer> </resources> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 93a132418c81..6d91833451ed 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3187,6 +3187,8 @@ <!-- Title of intent resolver dialog when selecting an application to run. --> <string name="whichApplication">Complete action using</string> + <!-- Title of intent resolver dialog when selecting a HOME application to run. --> + <string name="whichHomeApplication">Select a home app</string> <!-- Option to always use the selected application resolution in the future. See the "Complete action using" dialog title--> <string name="alwaysUse">Use by default for this action.</string> <!-- Text displayed when the user selects the check box for setting default application. See the "Use by default for this action" check box. --> @@ -4454,6 +4456,9 @@ <!-- Print fail reason: unknown. [CHAR LIMIT=25] --> <string name="reason_unknown">unknown</string> + <!-- Print fail reason: the print service that has to process the print job is not available. [CHAR LIMIT=none] --> + <string name="reason_service_unavailable">Print service not enabled</string> + <!-- Title for the notification that a print service was installed. [CHAR LIMIT=50] --> <string name="print_service_installed_title"><xliff:g id="name" example="Cloud Print">%s</xliff:g> service installed</string> <!-- Message for the notification that a print service was installed. [CHAR LIMIT=50] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a519bd2e8713..aaf8085d1639 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -801,6 +801,7 @@ <java-symbol type="string" name="web_user_agent_target_content" /> <java-symbol type="string" name="webpage_unresponsive" /> <java-symbol type="string" name="whichApplication" /> + <java-symbol type="string" name="whichHomeApplication" /> <java-symbol type="string" name="wifi_available_sign_in" /> <java-symbol type="string" name="network_available_sign_in" /> <java-symbol type="string" name="network_available_sign_in_detailed" /> @@ -928,6 +929,7 @@ <java-symbol type="string" name="mediasize_japanese_kahu" /> <java-symbol type="string" name="mediasize_japanese_kaku2" /> <java-symbol type="string" name="mediasize_japanese_you4" /> + <java-symbol type="string" name="reason_service_unavailable" /> <java-symbol type="string" name="reason_unknown" /> <java-symbol type="string" name="restr_pin_enter_admin_pin" /> <java-symbol type="string" name="restr_pin_enter_pin" /> @@ -1041,6 +1043,7 @@ <java-symbol type="drawable" name="ic_text_dot" /> <java-symbol type="drawable" name="ic_print" /> <java-symbol type="drawable" name="ic_print_error" /> + <java-symbol type="drawable" name="ic_grayedout_printer" /> <java-symbol type="drawable" name="indicator_code_lock_drag_direction_green_up" /> <java-symbol type="drawable" name="indicator_code_lock_drag_direction_red_up" /> <java-symbol type="drawable" name="indicator_code_lock_point_area_default_holo" /> diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd index ff194763e71d..1df2e22967b0 100644 --- a/docs/html/about/dashboards/index.jd +++ b/docs/html/about/dashboards/index.jd @@ -61,7 +61,7 @@ Platform Versions</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013. +<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013. <br/>Any versions with less than 0.1% distribution are not shown.</em> </p> @@ -92,7 +92,7 @@ Screens</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013 +<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013 <br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p> @@ -139,7 +139,7 @@ uses.</p> -<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013</em></p> +<p style="clear:both"><em>Data collected during a 7-day period ending on October 2, 2013</em></p> @@ -157,17 +157,17 @@ uses.</p> var VERSION_DATA = [ { - "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A2.4%2C30.7%2C0.1%2C21.7%2C45.1&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean", + "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A2.2%2C28.5%2C0.1%2C20.6%2C48.6&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean", "data": [ { "api": 8, "name": "Froyo", - "perc": "2.4" + "perc": "2.2" }, { "api": 10, "name": "Gingerbread", - "perc": "30.7" + "perc": "28.5" }, { "api": 13, @@ -177,17 +177,22 @@ var VERSION_DATA = { "api": 15, "name": "Ice Cream Sandwich", - "perc": "21.7" + "perc": "20.6" }, { "api": 16, "name": "Jelly Bean", - "perc": "36.6" + "perc": "36.5" }, { "api": 17, "name": "Jelly Bean", - "perc": "8.5" + "perc": "10.6" + }, + { + "api": 18, + "name": "Jelly Bean", + "perc": "1.5" } ] } @@ -202,21 +207,21 @@ var SCREEN_DATA = { "data": { "Large": { - "hdpi": "0.4", + "hdpi": "0.5", "ldpi": "0.6", - "mdpi": "3.4", + "mdpi": "3.5", "tvdpi": "1.2", - "xhdpi": "0.5" + "xhdpi": "0.6" }, "Normal": { - "hdpi": "33.6", + "hdpi": "33.5", "ldpi": "0.1", - "mdpi": "15.7", - "xhdpi": "23.1", - "xxhdpi": "7.1" + "mdpi": "15.3", + "xhdpi": "22.8", + "xxhdpi": "7.7" }, "Small": { - "ldpi": "9.5" + "ldpi": "9.4" }, "Xlarge": { "hdpi": "0.3", @@ -224,8 +229,8 @@ var SCREEN_DATA = "xhdpi": "0.1" } }, - "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A10.2%2C23.5%2C1.2%2C34.3%2C23.7%2C7.1&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi", - "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A4.8%2C6.1%2C79.6%2C9.5&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall" + "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A10.1%2C23.3%2C1.2%2C34.3%2C23.5%2C7.7&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi", + "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chf=bg%2Cs%2C00000000&chd=t%3A4.8%2C6.4%2C79.5%2C9.4&chl=Xlarge%7CLarge%7CNormal%7CSmall" } ]; diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java index e3a7e2bfa84e..818878254acb 100644 --- a/graphics/java/android/graphics/drawable/InsetDrawable.java +++ b/graphics/java/android/graphics/drawable/InsetDrawable.java @@ -202,7 +202,13 @@ public class InsetDrawable extends Drawable implements Drawable.Callback public void setColorFilter(ColorFilter cf) { mInsetState.mDrawable.setColorFilter(cf); } - + + /** {@hide} */ + @Override + public void setLayoutDirection(int layoutDirection) { + mInsetState.mDrawable.setLayoutDirection(layoutDirection); + } + @Override public int getOpacity() { return mInsetState.mDrawable.getOpacity(); diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java index 720494be4b7b..ab34c0fd5649 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -219,16 +219,15 @@ public class NinePatchDrawable extends Drawable { @Override public void draw(Canvas canvas) { final Rect bounds = getBounds(); - final boolean needMirroring = isAutoMirrored() && - getLayoutDirection() == LayoutDirection.RTL; - if (needMirroring) { + final boolean needsMirroring = needsMirroring(); + if (needsMirroring) { canvas.save(); // Mirror the 9patch canvas.translate(bounds.right - bounds.left, 0); canvas.scale(-1.0f, 1.0f); } mNinePatch.draw(canvas, bounds, mPaint); - if (needMirroring) { + if (needsMirroring) { canvas.restore(); } } @@ -240,7 +239,11 @@ public class NinePatchDrawable extends Drawable { @Override public boolean getPadding(Rect padding) { - padding.set(mPadding); + if (needsMirroring()) { + padding.set(mPadding.right, mPadding.top, mPadding.left, mPadding.bottom); + } else { + padding.set(mPadding); + } return true; } @@ -249,7 +252,12 @@ public class NinePatchDrawable extends Drawable { */ @Override public Insets getOpticalInsets() { - return mOpticalInsets; + if (needsMirroring()) { + return Insets.of(mOpticalInsets.right, mOpticalInsets.top, mOpticalInsets.right, + mOpticalInsets.bottom); + } else { + return mOpticalInsets; + } } @Override @@ -297,6 +305,10 @@ public class NinePatchDrawable extends Drawable { mNinePatchState.mAutoMirrored = mirrored; } + private boolean needsMirroring() { + return isAutoMirrored() && getLayoutDirection() == LayoutDirection.RTL; + } + @Override public boolean isAutoMirrored() { return mNinePatchState.mAutoMirrored; diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 3425c91aac07..84ea4c90d62b 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -2687,7 +2687,11 @@ public class AudioService extends IAudioService.Stub { */ private void queueMsgUnderWakeLock(Handler handler, int msg, int arg1, int arg2, Object obj, int delay) { + final long ident = Binder.clearCallingIdentity(); + // Always acquire the wake lock as AudioService because it is released by the + // message handler. mAudioEventWakeLock.acquire(); + Binder.restoreCallingIdentity(ident); sendMsg(handler, msg, SENDMSG_QUEUE, arg1, arg2, obj, delay); } diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index def9aa7f74e3..0abd5f861d43 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -2162,6 +2162,7 @@ public class MediaPlayer implements SubtitleController.Listener private static final int MEDIA_STARTED = 6; private static final int MEDIA_PAUSED = 7; private static final int MEDIA_STOPPED = 8; + private static final int MEDIA_SKIPPED = 9; private static final int MEDIA_TIMED_TEXT = 99; private static final int MEDIA_ERROR = 100; private static final int MEDIA_INFO = 200; @@ -2227,6 +2228,9 @@ public class MediaPlayer implements SubtitleController.Listener if (mOnSeekCompleteListener != null) { mOnSeekCompleteListener.onSeekComplete(mMediaPlayer); } + // fall through + + case MEDIA_SKIPPED: if (mTimeProvider != null) { mTimeProvider.onSeekComplete(mMediaPlayer); } @@ -2812,6 +2816,7 @@ public class MediaPlayer implements SubtitleController.Listener private Handler mEventHandler; private boolean mRefresh = false; private boolean mPausing = false; + private boolean mSeeking = false; private static final int NOTIFY = 1; private static final int NOTIFY_TIME = 0; private static final int REFRESH_AND_NOTIFY_TIME = 1; @@ -2849,7 +2854,15 @@ public class MediaPlayer implements SubtitleController.Listener } private void scheduleNotification(int type, long delayUs) { + // ignore time notifications until seek is handled + if (mSeeking && + (type == NOTIFY_TIME || type == REFRESH_AND_NOTIFY_TIME)) { + return; + } + if (DEBUG) Log.v(TAG, "scheduleNotification " + type + " in " + delayUs); + mStopped = type == NOTIFY_STOP; + mSeeking = type == NOTIFY_SEEK; mEventHandler.removeMessages(NOTIFY); Message msg = mEventHandler.obtainMessage(NOTIFY, type, 0); mEventHandler.sendMessageDelayed(msg, (int) (delayUs / 1000)); @@ -2876,7 +2889,6 @@ public class MediaPlayer implements SubtitleController.Listener synchronized(this) { if (DEBUG) Log.d(TAG, "onPaused: " + paused); if (mStopped) { // handle as seek if we were stopped - mStopped = false; scheduleNotification(NOTIFY_SEEK, 0 /* delay */); } else { mPausing = paused; // special handling if player disappeared @@ -2890,7 +2902,6 @@ public class MediaPlayer implements SubtitleController.Listener synchronized(this) { if (DEBUG) Log.d(TAG, "onStopped"); mPaused = true; - mStopped = true; scheduleNotification(NOTIFY_STOP, 0 /* delay */); } } @@ -2899,7 +2910,6 @@ public class MediaPlayer implements SubtitleController.Listener @Override public void onSeekComplete(MediaPlayer mp) { synchronized(this) { - mStopped = false; scheduleNotification(NOTIFY_SEEK, 0 /* delay */); } } @@ -2914,6 +2924,7 @@ public class MediaPlayer implements SubtitleController.Listener } private synchronized void notifySeek() { + mSeeking = false; try { long timeUs = getCurrentTimeUs(true, false); if (DEBUG) Log.d(TAG, "onSeekComplete at " + timeUs); @@ -3025,6 +3036,11 @@ public class MediaPlayer implements SubtitleController.Listener } long nextTimeUs = nowUs; + if (mSeeking) { + // skip timed-event notifications until seek is complete + return; + } + if (DEBUG) { StringBuilder sb = new StringBuilder(); sb.append("notifyTimedEvent(").append(mLastTimeUs).append(" -> ") @@ -3124,6 +3140,11 @@ public class MediaPlayer implements SubtitleController.Listener if (monotonic && mLastTimeUs < mLastReportedTime) { /* have to adjust time */ mTimeAdjustment = mLastReportedTime - mLastTimeUs; + if (mTimeAdjustment > 1000000) { + // schedule seeked event if time jumped significantly + // TODO: do this properly by introducing an exception + scheduleNotification(NOTIFY_SEEK, 0 /* delay */); + } } else { mTimeAdjustment = 0; } diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index 71a05673de0b..6faf7f870f59 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -2,6 +2,7 @@ package="com.android.documentsui"> <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" /> + <uses-permission android:name="android.permission.REMOVE_TASKS" /> <application android:name=".DocumentsApplication" diff --git a/packages/Keyguard/res/anim/keyguard_security_fade_in.xml b/packages/DocumentsUI/res/animator-ldrtl/dir_down.xml index c66c6049d52f..6c7e2244c712 100644 --- a/packages/Keyguard/res/anim/keyguard_security_fade_in.xml +++ b/packages/DocumentsUI/res/animator-ldrtl/dir_down.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 The Android Open Source Project +<!-- 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. @@ -14,9 +13,10 @@ limitations under the License. --> -<alpha xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@android:interpolator/decelerate_quad" - android:fromAlpha="0.0" android:toAlpha="1.0" - android:duration="@integer/kg_security_fade_duration" /> - - +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:valueFrom="-1" + android:valueTo="0" + android:propertyName="position" + android:valueType="floatType" + android:duration="@android:integer/config_mediumAnimTime" + android:interpolator="@android:interpolator/decelerate_quad" /> diff --git a/packages/Keyguard/res/anim/keyguard_security_fade_out.xml b/packages/DocumentsUI/res/animator-ldrtl/dir_up.xml index 6465b35fab65..8e2925c9760d 100644 --- a/packages/Keyguard/res/anim/keyguard_security_fade_out.xml +++ b/packages/DocumentsUI/res/animator-ldrtl/dir_up.xml @@ -1,5 +1,4 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 The Android Open Source Project +<!-- 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. @@ -13,9 +12,11 @@ See the License for the specific language governing permissions and limitations under the License. --> -<alpha xmlns:android="http://schemas.android.com/apk/res/android" - android:interpolator="@android:interpolator/accelerate_quad" - android:fromAlpha="1.0" - android:toAlpha="0.0" - android:duration="@integer/kg_security_fade_duration" -/> + +<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" + android:valueFrom="0" + android:valueTo="-1" + android:propertyName="position" + android:valueType="floatType" + android:duration="@android:integer/config_mediumAnimTime" + android:interpolator="@android:interpolator/accelerate_quad" /> diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow_am.9.png Binary files differindex 904d5253672c..904d5253672c 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow.9.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dir_shadow_am.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet_am.9.png Binary files differindex a1bbc8b7965d..a1bbc8b7965d 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet_am.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow_am.9.png Binary files differindex 068619be0b43..068619be0b43 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow.9.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dir_shadow_am.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet_am.9.png Binary files differindex fabb56ed2980..fabb56ed2980 100644 --- a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet_am.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow_am.9.png Binary files differindex e38a8685dcea..e38a8685dcea 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow.9.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dir_shadow_am.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet_am.9.png Binary files differindex 2c39a67ffc22..2c39a67ffc22 100644 --- a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet_am.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow_am.9.png Binary files differindex 0b332e410a77..0b332e410a77 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow.9.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dir_shadow_am.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet_am.9.png Binary files differindex 3c9579097fdf..3c9579097fdf 100644 --- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet_am.9.png diff --git a/packages/DocumentsUI/res/drawable/ic_dir_shadow.xml b/packages/DocumentsUI/res/drawable/ic_dir_shadow.xml new file mode 100644 index 000000000000..1153e693f4d3 --- /dev/null +++ b/packages/DocumentsUI/res/drawable/ic_dir_shadow.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + * 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. + */ +--> + +<nine-patch xmlns:android="http://schemas.android.com/apk/res/android" + android:src="@drawable/ic_dir_shadow_am" + android:autoMirrored="true"> +</nine-patch> diff --git a/packages/DocumentsUI/res/drawable/ic_drawer_shadow_tablet.xml b/packages/DocumentsUI/res/drawable/ic_drawer_shadow_tablet.xml new file mode 100644 index 000000000000..382ebff764af --- /dev/null +++ b/packages/DocumentsUI/res/drawable/ic_drawer_shadow_tablet.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* + * 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. + */ +--> + +<nine-patch xmlns:android="http://schemas.android.com/apk/res/android" + android:src="@drawable/ic_drawer_shadow_tablet_am" + android:autoMirrored="true"> +</nine-patch> diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml index b7dcb71ee76d..92c30baa0c60 100644 --- a/packages/DocumentsUI/res/values/strings.xml +++ b/packages/DocumentsUI/res/values/strings.xml @@ -64,6 +64,8 @@ <string name="save_error">Failed to save document</string> <!-- Toast shown when creating a folder failed with an error [CHAR LIMIT=48] --> <string name="create_error">Failed to create folder</string> + <!-- Error message shown when querying for a list of documents failed [CHAR LIMIT=48] --> + <string name="query_error">Failed to query documents</string> <!-- Title of storage root location that contains recently modified or used documents [CHAR LIMIT=24] --> <string name="root_recent">Recent</string> diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java index 48bfaf0d7c34..22dd6e40285f 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java @@ -16,10 +16,13 @@ package com.android.documentsui; +import static com.android.documentsui.DocumentsActivity.TAG; + import android.app.AlertDialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; @@ -29,6 +32,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; @@ -36,8 +40,6 @@ import android.widget.Toast; import com.android.documentsui.model.DocumentInfo; -import java.io.FileNotFoundException; - /** * Dialog to create a new directory. */ @@ -67,7 +69,12 @@ public class CreateDirectoryFragment extends DialogFragment { @Override public void onClick(DialogInterface dialog, int which) { final String displayName = text1.getText().toString(); - new CreateDirectoryTask(displayName).execute(); + + final DocumentsActivity activity = (DocumentsActivity) getActivity(); + final DocumentInfo cwd = activity.getCurrentDirectory(); + + new CreateDirectoryTask(displayName).executeOnExecutor( + ProviderExecutor.forAuthority(cwd.authority)); } }); builder.setNegativeButton(android.R.string.cancel, null); @@ -88,12 +95,19 @@ public class CreateDirectoryFragment extends DialogFragment { final ContentResolver resolver = activity.getContentResolver(); final DocumentInfo cwd = activity.getCurrentDirectory(); - final Uri childUri = DocumentsContract.createDocument( - resolver, cwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName); + + ContentProviderClient client = null; try { + client = DocumentsApplication.acquireUnstableProviderOrThrow( + resolver, cwd.derivedUri.getAuthority()); + final Uri childUri = DocumentsContract.createDocument( + client, cwd.derivedUri, Document.MIME_TYPE_DIR, mDisplayName); return DocumentInfo.fromUri(resolver, childUri); - } catch (FileNotFoundException e) { + } catch (Exception e) { + Log.w(TAG, "Failed to create directory", e); return null; + } finally { + ContentProviderClient.releaseQuietly(client); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index 1f11aed91358..59caad0ecf57 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -27,10 +27,12 @@ import static com.android.documentsui.model.DocumentInfo.getCursorInt; import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; +import android.app.ActivityManager; import android.app.Fragment; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.app.LoaderManager.LoaderCallbacks; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; @@ -112,6 +114,7 @@ public class DirectoryFragment extends Fragment { private boolean mHideGridTitles = false; + private boolean mSvelteRecents; private Point mThumbSize; private DocumentsAdapter mAdapter; @@ -203,6 +206,19 @@ public class DirectoryFragment extends Fragment { } @Override + public void onDestroyView() { + super.onDestroyView(); + + // Cancel any outstanding thumbnail requests + final ViewGroup target = (mListView.getAdapter() != null) ? mListView : mGridView; + final int count = target.getChildCount(); + for (int i = 0; i < count; i++) { + final View view = target.getChildAt(i); + mRecycleListener.onMovedToScrapHeap(view); + } + } + + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -224,6 +240,10 @@ public class DirectoryFragment extends Fragment { mHideGridTitles = (doc != null) && doc.isGridTitlesHidden(); } + final ActivityManager am = (ActivityManager) context.getSystemService( + Context.ACTIVITY_SERVICE); + mSvelteRecents = am.isLowRamDevice() && (mType == TYPE_RECENT_OPEN); + mCallbacks = new LoaderCallbacks<DirectoryResult>() { @Override public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) { @@ -259,7 +279,7 @@ public class DirectoryFragment extends Fragment { public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) { if (!isAdded()) return; - mAdapter.swapCursor(result.cursor); + mAdapter.swapResult(result); // Push latest state up to UI // TODO: if mode change was racing with us, don't overwrite it @@ -285,7 +305,7 @@ public class DirectoryFragment extends Fragment { @Override public void onLoaderReset(Loader<DirectoryResult> loader) { - mAdapter.swapCursor(null); + mAdapter.swapResult(null); } }; @@ -552,9 +572,16 @@ public class DirectoryFragment extends Fragment { continue; } - if (!DocumentsContract.deleteDocument(resolver, doc.derivedUri)) { + ContentProviderClient client = null; + try { + client = DocumentsApplication.acquireUnstableProviderOrThrow( + resolver, doc.derivedUri.getAuthority()); + DocumentsContract.deleteDocument(client, doc.derivedUri); + } catch (Exception e) { Log.w(TAG, "Failed to delete " + doc); hadTrouble = true; + } finally { + ContentProviderClient.releaseQuietly(client); } } @@ -646,13 +673,13 @@ public class DirectoryFragment extends Fragment { private List<Footer> mFooters = Lists.newArrayList(); - public void swapCursor(Cursor cursor) { - mCursor = cursor; - mCursorCount = cursor != null ? cursor.getCount() : 0; + public void swapResult(DirectoryResult result) { + mCursor = result != null ? result.cursor : null; + mCursorCount = mCursor != null ? mCursor.getCount() : 0; mFooters.clear(); - final Bundle extras = cursor != null ? cursor.getExtras() : null; + final Bundle extras = mCursor != null ? mCursor.getExtras() : null; if (extras != null) { final String info = extras.getString(DocumentsContract.EXTRA_INFO); if (info != null) { @@ -667,6 +694,11 @@ public class DirectoryFragment extends Fragment { } } + if (result != null && result.exception != null) { + mFooters.add(new MessageFooter( + 3, R.drawable.ic_dialog_alert, getString(R.string.query_error))); + } + if (isEmpty()) { mEmptyView.setVisibility(View.VISIBLE); } else { @@ -763,7 +795,7 @@ public class DirectoryFragment extends Fragment { final boolean supportsThumbnail = (docFlags & Document.FLAG_SUPPORTS_THUMBNAIL) != 0; final boolean allowThumbnail = (state.derivedMode == MODE_GRID) || MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, docMimeType); - final boolean showThumbnail = supportsThumbnail && allowThumbnail; + final boolean showThumbnail = supportsThumbnail && allowThumbnail && !mSvelteRecents; boolean cacheHit = false; if (showThumbnail) { @@ -777,7 +809,7 @@ public class DirectoryFragment extends Fragment { final ThumbnailAsyncTask task = new ThumbnailAsyncTask( uri, iconMime, iconThumb, mThumbSize); iconThumb.setTag(task); - task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + task.executeOnExecutor(ProviderExecutor.forAuthority(docAuthority)); } } @@ -970,20 +1002,26 @@ public class DirectoryFragment extends Fragment { @Override protected Bitmap doInBackground(Uri... params) { + if (isCancelled()) return null; + final Context context = mIconThumb.getContext(); + final ContentResolver resolver = context.getContentResolver(); + ContentProviderClient client = null; Bitmap result = null; try { - // TODO: switch to using unstable provider - result = DocumentsContract.getDocumentThumbnail( - context.getContentResolver(), mUri, mThumbSize, mSignal); + client = DocumentsApplication.acquireUnstableProviderOrThrow( + resolver, mUri.getAuthority()); + result = DocumentsContract.getDocumentThumbnail(client, mUri, mThumbSize, mSignal); if (result != null) { final ThumbnailCache thumbs = DocumentsApplication.getThumbnailsCache( context, mThumbSize); thumbs.put(mUri, result); } } catch (Exception e) { - Log.w(TAG, "Failed to load thumbnail: " + e); + Log.w(TAG, "Failed to load thumbnail for " + mUri + ": " + e); + } finally { + ContentProviderClient.releaseQuietly(client); } return result; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java index 0b3ecf84900e..163615d4b677 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java @@ -56,7 +56,7 @@ class DirectoryResult implements AutoCloseable { @Override public void close() { IoUtils.closeQuietly(cursor); - ContentProviderClient.closeQuietly(client); + ContentProviderClient.releaseQuietly(client); cursor = null; client = null; } @@ -79,7 +79,7 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { public DirectoryLoader(Context context, int type, RootInfo root, DocumentInfo doc, Uri uri, int userSortOrder) { - super(context); + super(context, ProviderExecutor.forAuthority(root.authority)); mType = type; mRoot = root; mDoc = doc; @@ -157,9 +157,11 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { Log.d(TAG, "userMode=" + userMode + ", userSortOrder=" + mUserSortOrder + " --> mode=" + result.mode + ", sortOrder=" + result.sortOrder); + ContentProviderClient client = null; try { - result.client = resolver.acquireUnstableContentProviderClient(authority); - cursor = result.client.query( + client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority); + + cursor = client.query( mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal); cursor.registerContentObserver(mObserver); @@ -173,11 +175,12 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { cursor = new SortingCursorWrapper(cursor, result.sortOrder); } + result.client = client; result.cursor = cursor; } catch (Exception e) { Log.w(TAG, "Failed to query", e); result.exception = e; - ContentProviderClient.closeQuietly(result.client); + ContentProviderClient.releaseQuietly(client); } finally { synchronized (this) { mSignal = null; diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java index 28e2bd90a155..b552e5aa838c 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java @@ -40,7 +40,7 @@ public class DirectoryView extends FrameLayout { public void setBackground(Drawable background) { final Rect rect = new Rect(); background.getPadding(rect); - final InsetDrawable inset = new InsetDrawable(background, -rect.left, 0, 0, 0); + final InsetDrawable inset = new InsetDrawable(background, -rect.left, 0, -rect.right, 0); super.setBackground(inset); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index 4caec8fb0ad2..76607796d60d 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -35,6 +35,7 @@ import android.app.FragmentManager; import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ComponentName; +import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.ContentValues; import android.content.Intent; @@ -90,6 +91,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; +import java.util.concurrent.Executor; public class DocumentsActivity extends Activity { public static final String TAG = "Documents"; @@ -214,7 +216,7 @@ public class DocumentsActivity extends Activity { if (!mState.restored) { if (mState.action == ACTION_MANAGE) { final Uri rootUri = getIntent().getData(); - new RestoreRootTask(rootUri).execute(); + new RestoreRootTask(rootUri).executeOnExecutor(getCurrentExecutor()); } else { new RestoreStackTask().execute(); } @@ -781,6 +783,15 @@ public class DocumentsActivity extends Activity { return mState.stack.peek(); } + public Executor getCurrentExecutor() { + final DocumentInfo cwd = getCurrentDirectory(); + if (cwd != null && cwd.authority != null) { + return ProviderExecutor.forAuthority(cwd.authority); + } else { + return AsyncTask.THREAD_POOL_EXECUTOR; + } + } + public State getDisplayState() { return mState; } @@ -854,7 +865,7 @@ public class DocumentsActivity extends Activity { mState.stackTouched = true; if (!mRoots.isRecentsRoot(root)) { - new PickRootTask(root).execute(); + new PickRootTask(root).executeOnExecutor(getCurrentExecutor()); } else { onCurrentDirectoryChanged(ANIM_SIDE); } @@ -878,6 +889,7 @@ public class DocumentsActivity extends Activity { mRoot.authority, mRoot.documentId); return DocumentInfo.fromUri(getContentResolver(), uri); } catch (FileNotFoundException e) { + Log.w(TAG, "Failed to find root", e); return null; } } @@ -930,7 +942,7 @@ public class DocumentsActivity extends Activity { onCurrentDirectoryChanged(ANIM_DOWN); } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { // Explicit file picked, return - new ExistingFinishTask(doc.derivedUri).execute(); + new ExistingFinishTask(doc.derivedUri).executeOnExecutor(getCurrentExecutor()); } else if (mState.action == ACTION_CREATE) { // Replace selected file SaveFragment.get(fm).setReplaceTarget(doc); @@ -964,16 +976,16 @@ public class DocumentsActivity extends Activity { for (int i = 0; i < size; i++) { uris[i] = docs.get(i).derivedUri; } - new ExistingFinishTask(uris).execute(); + new ExistingFinishTask(uris).executeOnExecutor(getCurrentExecutor()); } } public void onSaveRequested(DocumentInfo replaceTarget) { - new ExistingFinishTask(replaceTarget.derivedUri).execute(); + new ExistingFinishTask(replaceTarget.derivedUri).executeOnExecutor(getCurrentExecutor()); } public void onSaveRequested(String mimeType, String displayName) { - new CreateFinishTask(mimeType, displayName).execute(); + new CreateFinishTask(mimeType, displayName).executeOnExecutor(getCurrentExecutor()); } private void saveStackBlocking() { @@ -1035,12 +1047,26 @@ public class DocumentsActivity extends Activity { @Override protected Uri doInBackground(Void... params) { + final ContentResolver resolver = getContentResolver(); final DocumentInfo cwd = getCurrentDirectory(); - final Uri childUri = DocumentsContract.createDocument( - getContentResolver(), cwd.derivedUri, mMimeType, mDisplayName); + + ContentProviderClient client = null; + Uri childUri = null; + try { + client = DocumentsApplication.acquireUnstableProviderOrThrow( + resolver, cwd.derivedUri.getAuthority()); + childUri = DocumentsContract.createDocument( + client, cwd.derivedUri, mMimeType, mDisplayName); + } catch (Exception e) { + Log.w(TAG, "Failed to create document", e); + } finally { + ContentProviderClient.releaseQuietly(client); + } + if (childUri != null) { saveStackBlocking(); } + return childUri; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java index 960181afcb95..6b46e3a0d0ec 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsApplication.java @@ -19,13 +19,19 @@ package com.android.documentsui; import android.app.ActivityManager; import android.app.Application; import android.content.BroadcastReceiver; +import android.content.ContentProviderClient; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Point; import android.net.Uri; +import android.os.RemoteException; +import android.text.format.DateUtils; public class DocumentsApplication extends Application { + private static final long PROVIDER_ANR_TIMEOUT = 20 * DateUtils.SECOND_IN_MILLIS; + private RootsCache mRoots; private Point mThumbnailsSize; private ThumbnailCache mThumbnails; @@ -44,6 +50,17 @@ public class DocumentsApplication extends Application { return thumbnails; } + public static ContentProviderClient acquireUnstableProviderOrThrow( + ContentResolver resolver, String authority) throws RemoteException { + final ContentProviderClient client = resolver.acquireUnstableContentProviderClient( + authority); + if (client == null) { + throw new RemoteException("Failed to acquire provider for " + authority); + } + client.setDetectNotResponding(PROVIDER_ANR_TIMEOUT); + return client; + } + @Override public void onCreate() { final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); diff --git a/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java new file mode 100644 index 000000000000..2105cb41fc9a --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/ProviderExecutor.java @@ -0,0 +1,64 @@ +/* + * 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 com.android.documentsui; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.Preconditions; +import com.google.android.collect.Maps; + +import java.util.HashMap; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; + +public class ProviderExecutor extends Thread implements Executor { + + @GuardedBy("sExecutors") + private static HashMap<String, ProviderExecutor> sExecutors = Maps.newHashMap(); + + public static Executor forAuthority(String authority) { + synchronized (sExecutors) { + ProviderExecutor executor = sExecutors.get(authority); + if (executor == null) { + executor = new ProviderExecutor(); + executor.setName("ProviderExecutor: " + authority); + executor.start(); + sExecutors.put(authority, executor); + } + return executor; + } + } + + private final LinkedBlockingQueue<Runnable> mQueue = new LinkedBlockingQueue<Runnable>(); + + @Override + public void execute(Runnable command) { + Preconditions.checkNotNull(command); + mQueue.add(command); + } + + @Override + public void run() { + while (true) { + try { + final Runnable command = mQueue.take(); + command.run(); + } catch (InterruptedException e) { + // That was weird; let's go look for more tasks. + } + } + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java index 9a4fb7da725f..3a8a3fbdd103 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java @@ -19,11 +19,12 @@ package com.android.documentsui; import static com.android.documentsui.DocumentsActivity.TAG; import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED; +import android.app.ActivityManager; import android.content.AsyncTaskLoader; import android.content.ContentProviderClient; -import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; +import android.database.MatrixCursor; import android.database.MergeCursor; import android.net.Uri; import android.os.Bundle; @@ -48,17 +49,14 @@ import java.util.HashMap; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { private static final boolean LOGD = true; - // TODO: adjust for svelte devices - // TODO: add support for oneway queries to avoid wedging loader - private static final int MAX_OUTSTANDING_RECENTS = 2; + private static final int MAX_OUTSTANDING_RECENTS = 4; + private static final int MAX_OUTSTANDING_RECENTS_SVELTE = 2; /** * Time to wait for first pass to complete before returning partial results. @@ -74,21 +72,7 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { /** MIME types that should always be excluded from recents. */ private static final String[] RECENT_REJECT_MIMES = new String[] { Document.MIME_TYPE_DIR }; - private static final ExecutorService sExecutor = buildExecutor(); - - /** - * Create a bounded thread pool for fetching recents; it creates threads as - * needed (up to maximum) and reclaims them when finished. - */ - private static ExecutorService buildExecutor() { - // Create a bounded thread pool for fetching recents; it creates - // threads as needed (up to maximum) and reclaims them when finished. - final ThreadPoolExecutor executor = new ThreadPoolExecutor( - MAX_OUTSTANDING_RECENTS, MAX_OUTSTANDING_RECENTS, 10, TimeUnit.SECONDS, - new LinkedBlockingQueue<Runnable>()); - executor.allowCoreThreadTimeOut(true); - return executor; - } + private final Semaphore mQueryPermits; private final RootsCache mRoots; private final State mState; @@ -120,25 +104,41 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { public void run() { if (isCancelled()) return; - final ContentResolver resolver = getContext().getContentResolver(); - final ContentProviderClient client = resolver.acquireUnstableContentProviderClient( - authority); try { + mQueryPermits.acquire(); + } catch (InterruptedException e) { + return; + } + + try { + runInternal(); + } finally { + mQueryPermits.release(); + } + } + + public void runInternal() { + ContentProviderClient client = null; + try { + client = DocumentsApplication.acquireUnstableProviderOrThrow( + getContext().getContentResolver(), authority); + final Uri uri = DocumentsContract.buildRecentDocumentsUri(authority, rootId); final Cursor cursor = client.query( uri, null, null, null, DirectoryLoader.getQuerySortOrder(mSortOrder)); mWithRoot = new RootCursorWrapper(authority, rootId, cursor, MAX_DOCS_FROM_ROOT); - set(mWithRoot); - - mFirstPassLatch.countDown(); - if (mFirstPassDone) { - onContentChanged(); - } } catch (Exception e) { - setException(e); + Log.w(TAG, "Failed to load " + authority + ", " + rootId, e); } finally { - ContentProviderClient.closeQuietly(client); + ContentProviderClient.releaseQuietly(client); + } + + set(mWithRoot); + + mFirstPassLatch.countDown(); + if (mFirstPassDone) { + onContentChanged(); } } @@ -152,6 +152,13 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { super(context); mRoots = roots; mState = state; + + // Keep clients around on high-RAM devices, since we'd be spinning them + // up moments later to fetch thumbnails anyway. + final ActivityManager am = (ActivityManager) getContext().getSystemService( + Context.ACTIVITY_SERVICE); + mQueryPermits = new Semaphore( + am.isLowRamDevice() ? MAX_OUTSTANDING_RECENTS_SVELTE : MAX_OUTSTANDING_RECENTS); } @Override @@ -170,7 +177,7 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { mFirstPassLatch = new CountDownLatch(mTasks.size()); for (RecentTask task : mTasks.values()) { - sExecutor.execute(task); + ProviderExecutor.forAuthority(task.authority).execute(task); } try { @@ -184,11 +191,14 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { final long rejectBefore = System.currentTimeMillis() - REJECT_OLDER_THAN; // Collect all finished tasks + boolean allDone = true; List<Cursor> cursors = Lists.newArrayList(); for (RecentTask task : mTasks.values()) { if (task.isDone()) { try { final Cursor cursor = task.get(); + if (cursor == null) continue; + final FilteringCursorWrapper filtered = new FilteringCursorWrapper( cursor, mState.acceptMimes, RECENT_REJECT_MIMES, rejectBefore) { @Override @@ -200,14 +210,15 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { - Log.w(TAG, "Failed to load " + task.authority + ", " + task.rootId, e); + // We already logged on other side } + } else { + allDone = false; } } if (LOGD) { Log.d(TAG, "Found " + cursors.size() + " of " + mTasks.size() + " recent queries done"); - Log.d(TAG, sExecutor.toString()); } final DirectoryResult result = new DirectoryResult(); @@ -215,11 +226,18 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { // Hint to UI if we're still loading final Bundle extras = new Bundle(); - if (cursors.size() != mTasks.size()) { + if (!allDone) { extras.putBoolean(DocumentsContract.EXTRA_LOADING, true); } - final MergeCursor merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()])); + final Cursor merged; + if (cursors.size() > 0) { + merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()])); + } else { + // Return something when nobody is ready + merged = new MatrixCursor(new String[0]); + } + final SortingCursorWrapper sorted = new SortingCursorWrapper(merged, result.sortOrder) { @Override public Bundle getExtras() { diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index e3908e9ad515..bad0a9605a1b 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -243,10 +243,11 @@ public class RootsCache { final List<RootInfo> roots = Lists.newArrayList(); final Uri rootsUri = DocumentsContract.buildRootsUri(authority); - final ContentProviderClient client = resolver - .acquireUnstableContentProviderClient(authority); + + ContentProviderClient client = null; Cursor cursor = null; try { + client = DocumentsApplication.acquireUnstableProviderOrThrow(resolver, authority); cursor = client.query(rootsUri, null, null, null, null); while (cursor.moveToNext()) { final RootInfo root = RootInfo.fromRootsCursor(authority, cursor); @@ -256,7 +257,7 @@ public class RootsCache { Log.w(TAG, "Failed to load some roots from " + authority + ": " + e); } finally { IoUtils.closeQuietly(cursor); - ContentProviderClient.closeQuietly(client); + ContentProviderClient.releaseQuietly(client); } return roots; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java index 5091a612365a..91d912415592 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java @@ -23,9 +23,10 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.provider.DocumentsContract; -import android.provider.DocumentsProvider; import android.provider.DocumentsContract.Document; +import android.provider.DocumentsProvider; +import com.android.documentsui.DocumentsApplication; import com.android.documentsui.RootCursorWrapper; import libcore.io.IoUtils; @@ -178,10 +179,11 @@ public class DocumentInfo implements Durable, Parcelable { } public void updateFromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException { - final ContentProviderClient client = resolver.acquireUnstableContentProviderClient( - uri.getAuthority()); + ContentProviderClient client = null; Cursor cursor = null; try { + client = DocumentsApplication.acquireUnstableProviderOrThrow( + resolver, uri.getAuthority()); cursor = client.query(uri, null, null, null, null); if (!cursor.moveToFirst()) { throw new FileNotFoundException("Missing details for " + uri); @@ -191,7 +193,7 @@ public class DocumentInfo implements Durable, Parcelable { throw asFileNotFoundException(t); } finally { IoUtils.closeQuietly(cursor); - ContentProviderClient.closeQuietly(client); + ContentProviderClient.releaseQuietly(client); } } diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java index 5a15cd2dacdc..0caddcc0c155 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/TestDocumentsProvider.java @@ -54,11 +54,21 @@ import java.lang.ref.WeakReference; public class TestDocumentsProvider extends DocumentsProvider { private static final String TAG = "TestDocuments"; - private static final boolean LAG_ROOTS = false; - private static final boolean CRASH_ROOTS = false; - private static final boolean REFRESH_ROOTS = false; + private static final boolean ROOTS_WEDGE = false; + private static final boolean ROOTS_LAG = false; + private static final boolean ROOTS_CRASH = false; + private static final boolean ROOTS_REFRESH = false; - private static final boolean CRASH_DOCUMENT = false; + private static final boolean DOCUMENT_CRASH = false; + + private static final boolean RECENT_WEDGE = false; + + private static final boolean CHILD_WEDGE = false; + private static final boolean CHILD_CRASH = false; + + private static final boolean THUMB_HUNDREDS = false; + private static final boolean THUMB_WEDGE = false; + private static final boolean THUMB_CRASH = false; private static final String MY_ROOT_ID = "myRoot"; private static final String MY_DOC_ID = "myDoc"; @@ -95,10 +105,11 @@ public class TestDocumentsProvider extends DocumentsProvider { public Cursor queryRoots(String[] projection) throws FileNotFoundException { Log.d(TAG, "Someone asked for our roots!"); - if (LAG_ROOTS) SystemClock.sleep(3000); - if (CRASH_ROOTS) System.exit(12); + if (ROOTS_WEDGE) SystemClock.sleep(Integer.MAX_VALUE); + if (ROOTS_LAG) SystemClock.sleep(3000); + if (ROOTS_CRASH) System.exit(12); - if (REFRESH_ROOTS) { + if (ROOTS_REFRESH) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { @@ -126,7 +137,7 @@ public class TestDocumentsProvider extends DocumentsProvider { @Override public Cursor queryDocument(String documentId, String[] projection) throws FileNotFoundException { - if (CRASH_DOCUMENT) System.exit(12); + if (DOCUMENT_CRASH) System.exit(12); final MatrixCursor result = new MatrixCursor(resolveDocumentProjection(projection)); includeFile(result, documentId, 0); @@ -198,6 +209,9 @@ public class TestDocumentsProvider extends DocumentsProvider { String parentDocumentId, String[] projection, String sortOrder) throws FileNotFoundException { + if (CHILD_WEDGE) SystemClock.sleep(Integer.MAX_VALUE); + if (CHILD_CRASH) System.exit(12); + final ContentResolver resolver = getContext().getContentResolver(); final Uri notifyUri = DocumentsContract.buildDocumentUri( "com.example.documents", parentDocumentId); @@ -212,6 +226,12 @@ public class TestDocumentsProvider extends DocumentsProvider { includeFile(result, "localfile3", 0); includeFile(result, "localfile4", 0); + if (THUMB_HUNDREDS) { + for (int i = 0; i < 256; i++) { + includeFile(result, "i maded u an picshure", Document.FLAG_SUPPORTS_THUMBNAIL); + } + } + synchronized (this) { // Try picking up an existing network fetch CloudTask task = mTask != null ? mTask.get() : null; @@ -257,6 +277,9 @@ public class TestDocumentsProvider extends DocumentsProvider { @Override public Cursor queryRecentDocuments(String rootId, String[] projection) throws FileNotFoundException { + + if (RECENT_WEDGE) SystemClock.sleep(Integer.MAX_VALUE); + // Pretend to take a super long time to respond SystemClock.sleep(3000); @@ -275,6 +298,10 @@ public class TestDocumentsProvider extends DocumentsProvider { @Override public AssetFileDescriptor openDocumentThumbnail( String docId, Point sizeHint, CancellationSignal signal) throws FileNotFoundException { + + if (THUMB_WEDGE) wedgeUntilCanceled(signal); + if (THUMB_CRASH) System.exit(12); + final Bitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); final Paint paint = new Paint(); @@ -312,6 +339,18 @@ public class TestDocumentsProvider extends DocumentsProvider { return true; } + private static void wedgeUntilCanceled(CancellationSignal signal) { + if (signal != null) { + while (true) { + signal.throwIfCanceled(); + SystemClock.sleep(500); + } + } else { + Log.w(TAG, "WEDGING WITHOUT A CANCELLATIONSIGNAL"); + SystemClock.sleep(Integer.MAX_VALUE); + } + } + private static void includeFile(MatrixCursor result, String docId, int flags) { final RowBuilder row = result.newRow(); row.add(Document.COLUMN_DOCUMENT_ID, docId); diff --git a/packages/Keyguard/res/anim/keyguard_security_animate_in.xml b/packages/Keyguard/res/anim/keyguard_security_animate_in.xml deleted file mode 100644 index 4ee30c363599..000000000000 --- a/packages/Keyguard/res/anim/keyguard_security_animate_in.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 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. ---> - -<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> - - <scale - android:interpolator="@android:anim/decelerate_interpolator" - android:fromXScale="0.0" - android:toXScale="1.0" - android:fromYScale="1.0" - android:toYScale="1.0" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillAfter="true" - android:duration="@integer/kg_security_flip_duration" - android:startOffset="@integer/kg_security_flip_duration" /> - -</set> - diff --git a/packages/Keyguard/res/anim/keyguard_security_animate_out.xml b/packages/Keyguard/res/anim/keyguard_security_animate_out.xml deleted file mode 100644 index 76d065c74f66..000000000000 --- a/packages/Keyguard/res/anim/keyguard_security_animate_out.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2012 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. ---> - -<set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> - - <scale - android:interpolator="@android:anim/accelerate_interpolator" - android:fromXScale="1.0" - android:toXScale="0.0" - android:fromYScale="1.0" - android:toYScale="1.0" - android:pivotX="50%" - android:pivotY="50%" - android:fillEnabled="true" - android:fillAfter="true" - android:duration="@integer/kg_security_flip_duration" /> - -</set> - diff --git a/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml b/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml index 376d0e935368..07953b46e621 100644 --- a/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml +++ b/packages/Keyguard/res/layout/keyguard_glow_pad_container.xml @@ -22,5 +22,5 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center_horizontal" - android:layout_marginBottom="-80dp"/> -</merge>
\ No newline at end of file + android:layout_marginBottom="@dimen/glowpadcontainer_bottom_margin"/> +</merge> diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml index 77c44ea1e3bc..cf750ab6902a 100644 --- a/packages/Keyguard/res/values-ca/strings.xml +++ b/packages/Keyguard/res/values-ca/strings.xml @@ -73,7 +73,7 @@ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Botó de parada"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Desbloqueja per continuar"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"S\'ha cancel·lat l\'inici"</string> - <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> perquè se suprimeixi."</string> + <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Deixa anar <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> per suprimir-lo."</string> <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"No se suprimirà <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>."</string> <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string> diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml index b893422b18fb..7c791dbc65e6 100644 --- a/packages/Keyguard/res/values-sl/strings.xml +++ b/packages/Keyguard/res/values-sl/strings.xml @@ -73,7 +73,7 @@ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"Gumb za ustavitev"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"Za nadaljevanje odklenite"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"Zagon je preklican"</string> - <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Povlecite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</string> + <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"Izpustite pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g>, da ga izbrišete."</string> <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"Pripomoček <xliff:g id="WIDGET_INDEX">%1$s</xliff:g> ne bo izbrisan."</string> <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string> diff --git a/packages/Keyguard/res/values-sw360dp/dimens.xml b/packages/Keyguard/res/values-sw360dp/dimens.xml index 41d6ac0ca550..6e39a429be53 100644 --- a/packages/Keyguard/res/values-sw360dp/dimens.xml +++ b/packages/Keyguard/res/values-sw360dp/dimens.xml @@ -19,7 +19,11 @@ --> <resources> - <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> + <!-- Height of the sliding KeyguardSecurityContainer (includes 2x + keyguard_security_view_margin) --> <dimen name="keyguard_security_height">400dp</dimen> + <!-- The bottom margin for the GlowPadView container --> + <dimen name="glowpadcontainer_bottom_margin">-48dp</dimen> + </resources> diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml index 2c24c526a5e2..42fffe6c52d0 100644 --- a/packages/Keyguard/res/values-zh-rTW/strings.xml +++ b/packages/Keyguard/res/values-zh-rTW/strings.xml @@ -73,7 +73,7 @@ <string name="keyguard_accessibility_transport_stop_description" msgid="7656358482980912216">"[停止] 按鈕"</string> <string name="keyguard_accessibility_show_bouncer" msgid="5425837272418176176">"先解鎖才能繼續操作"</string> <string name="keyguard_accessibility_hide_bouncer" msgid="7896992171878309358">"已取消啟動"</string> - <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"將「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」拖放到刪除選單中。"</string> + <string name="keyguard_accessibility_delete_widget_start" msgid="4096550552634391451">"拖放「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」即可將其刪除。"</string> <string name="keyguard_accessibility_delete_widget_end" msgid="508833506780909393">"「<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>」將不會遭到刪除。"</string> <string name="password_keyboard_label_symbol_key" msgid="992280756256536042">"?123"</string> <string name="password_keyboard_label_alpha_key" msgid="8001096175167485649">"ABC"</string> diff --git a/packages/Keyguard/res/values/dimens.xml b/packages/Keyguard/res/values/dimens.xml index fde63c4d7e5f..ce72f43cd710 100644 --- a/packages/Keyguard/res/values/dimens.xml +++ b/packages/Keyguard/res/values/dimens.xml @@ -32,6 +32,9 @@ <!-- Size of lockscreen outerring on unsecure unlock LockScreen --> <dimen name="keyguard_lockscreen_outerring_diameter">270dp</dimen> + <!-- The bottom margin for the GlowPadView container --> + <dimen name="glowpadcontainer_bottom_margin">-80dp</dimen> + <!-- Default target placement radius for GlowPadView. Should be 1/2 of outerring diameter. --> <dimen name="glowpadview_target_placement_radius">135dip</dimen> diff --git a/packages/Keyguard/res/values/integers.xml b/packages/Keyguard/res/values/integers.xml index 053fc851ca31..dc90bbff1aae 100644 --- a/packages/Keyguard/res/values/integers.xml +++ b/packages/Keyguard/res/values/integers.xml @@ -18,7 +18,5 @@ --> <resources> <integer name="kg_carousel_angle">75</integer> - <integer name="kg_security_flip_duration">100</integer> - <integer name="kg_security_fade_duration">100</integer> <integer name="kg_glowpad_rotation_offset">0</integer> </resources> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index 4da6171cb43c..bc8c866a5f5e 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -54,10 +54,10 @@ import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; -import android.view.animation.AnimationUtils; import android.widget.RemoteViews.OnClickHandler; import java.io.File; +import java.lang.ref.WeakReference; import java.util.List; public class KeyguardHostView extends KeyguardViewBase { @@ -125,6 +125,8 @@ public class KeyguardHostView extends KeyguardViewBase { private final Rect mInsets = new Rect(); + private MyOnClickHandler mOnClickHandler = new MyOnClickHandler(this); + /*package*/ interface UserSwitcherCallback { void hideSecurityView(int duration); void showSecurityView(); @@ -813,24 +815,39 @@ public class KeyguardHostView extends KeyguardViewBase { } } - private OnClickHandler mOnClickHandler = new OnClickHandler() { + private static class MyOnClickHandler extends OnClickHandler { + + // weak reference to the hostView to avoid keeping a live reference + // due to Binder GC linkages to AppWidgetHost. By the same token, + // this click handler should not keep references to any large + // objects. + WeakReference<KeyguardHostView> mThis; + + MyOnClickHandler(KeyguardHostView hostView) { + mThis = new WeakReference<KeyguardHostView>(hostView); + } + @Override public boolean onClickHandler(final View view, final android.app.PendingIntent pendingIntent, final Intent fillInIntent) { + KeyguardHostView hostView = mThis.get(); + if (hostView == null) { + return false; + } if (pendingIntent.isActivity()) { - setOnDismissAction(new OnDismissAction() { + hostView.setOnDismissAction(new OnDismissAction() { public boolean onDismiss() { try { - // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? - Context context = view.getContext(); - ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, - 0, 0, - view.getMeasuredWidth(), view.getMeasuredHeight()); - context.startIntentSender( - pendingIntent.getIntentSender(), fillInIntent, - Intent.FLAG_ACTIVITY_NEW_TASK, - Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); + // TODO: Unregister this handler if PendingIntent.FLAG_ONE_SHOT? + Context context = view.getContext(); + ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(view, + 0, 0, + view.getMeasuredWidth(), view.getMeasuredHeight()); + context.startIntentSender( + pendingIntent.getIntentSender(), fillInIntent, + Intent.FLAG_ACTIVITY_NEW_TASK, + Intent.FLAG_ACTIVITY_NEW_TASK, 0, opts.toBundle()); } catch (IntentSender.SendIntentException e) { android.util.Log.e(TAG, "Cannot send pending intent: ", e); } catch (Exception e) { @@ -841,10 +858,10 @@ public class KeyguardHostView extends KeyguardViewBase { } }); - if (mViewStateManager.isChallengeShowing()) { - mViewStateManager.showBouncer(true); + if (hostView.mViewStateManager.isChallengeShowing()) { + hostView.mViewStateManager.showBouncer(true); } else { - mCallback.dismiss(false); + hostView.mCallback.dismiss(false); } return true; } else { @@ -971,10 +988,6 @@ public class KeyguardHostView extends KeyguardViewBase { // Find and show this child. final int childCount = mSecurityViewContainer.getChildCount(); - mSecurityViewContainer.setInAnimation( - AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_in)); - mSecurityViewContainer.setOutAnimation( - AnimationUtils.loadAnimation(mContext, R.anim.keyguard_security_fade_out)); final int securityViewIdForMode = getSecurityViewIdForMode(securityMode); for (int i = 0; i < childCount; i++) { if (mSecurityViewContainer.getChildAt(i).getId() == securityViewIdForMode) { diff --git a/packages/PrintSpooler/res/layout/select_printer_activity.xml b/packages/PrintSpooler/res/layout/select_printer_activity.xml index f4e18537c7a7..e86e9aaea352 100644 --- a/packages/PrintSpooler/res/layout/select_printer_activity.xml +++ b/packages/PrintSpooler/res/layout/select_printer_activity.xml @@ -14,10 +14,10 @@ limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:orientation="horizontal" +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" android:layout_width="fill_parent" - android:layout_height="wrap_content"> + android:layout_height="fill_parent"> <fragment android:name="com.android.printspooler.SelectPrinterFragment" @@ -26,4 +26,39 @@ android:layout_height="wrap_content"> </fragment> -</FrameLayout>
\ No newline at end of file + <FrameLayout + android:id="@+id/empty_print_state" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:visibility="gone"> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center" + android:orientation="vertical"> + + <ImageView + android:id="@+id/icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="12dip" + android:src="@*android:drawable/ic_grayedout_printer" + android:contentDescription="@string/print_no_printers_found"> + </ImageView> + + <TextView + android:id="@+id/message" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textAppearance="?android:attr/textAppearanceLarge" + android:textColor="?android:attr/textColorSecondary" + android:text="@string/print_no_printers_found"> + </TextView> + + </LinearLayout> + + </FrameLayout> + +</LinearLayout> diff --git a/packages/PrintSpooler/res/values-af/strings.xml b/packages/PrintSpooler/res/values-af/strings.xml index 608df733b1f5..7e150807a687 100644 --- a/packages/PrintSpooler/res/values-af/strings.xml +++ b/packages/PrintSpooler/res/values-af/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Herbegin"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Geen verbinding met drukker nie"</string> <string name="reason_unknown" msgid="5507940196503246139">"onbekend"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie beskikbaar nie"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Swart en wit"</item> <item msgid="2762241247228983754">"Kleur"</item> diff --git a/packages/PrintSpooler/res/values-am/strings.xml b/packages/PrintSpooler/res/values-am/strings.xml index 111d7d1526ef..bac05270cfa5 100644 --- a/packages/PrintSpooler/res/values-am/strings.xml +++ b/packages/PrintSpooler/res/values-am/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"እንደገና ጀምር"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"ከአታሚ ጋር ምንም ግንኙነት የለም"</string> <string name="reason_unknown" msgid="5507940196503246139">"አይታወቅም"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – አይገኝም"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"ጥቁር እና ነጭ"</item> <item msgid="2762241247228983754">"ቀለም"</item> diff --git a/packages/PrintSpooler/res/values-ar/strings.xml b/packages/PrintSpooler/res/values-ar/strings.xml index eb9c06eabbea..4cca804be906 100644 --- a/packages/PrintSpooler/res/values-ar/strings.xml +++ b/packages/PrintSpooler/res/values-ar/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"إعادة تشغيل"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"لا يوجد اتصال بالطابعة"</string> <string name="reason_unknown" msgid="5507940196503246139">"غير معروف"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – غير متاحة"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"أبيض وأسود"</item> <item msgid="2762241247228983754">"اللون"</item> diff --git a/packages/PrintSpooler/res/values-bg/strings.xml b/packages/PrintSpooler/res/values-bg/strings.xml index 5207e42318c8..dc5c4f9380c6 100644 --- a/packages/PrintSpooler/res/values-bg/strings.xml +++ b/packages/PrintSpooler/res/values-bg/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Рестартиране"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Няма връзка с принтера"</string> <string name="reason_unknown" msgid="5507940196503246139">"няма данни"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – не е налице"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Черно-бяло"</item> <item msgid="2762241247228983754">"Цветно"</item> diff --git a/packages/PrintSpooler/res/values-ca/strings.xml b/packages/PrintSpooler/res/values-ca/strings.xml index 3ef42ac6acc4..9bc03f967eb2 100644 --- a/packages/PrintSpooler/res/values-ca/strings.xml +++ b/packages/PrintSpooler/res/values-ca/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Reinicia"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"No hi ha connexió amb la impressora"</string> <string name="reason_unknown" msgid="5507940196503246139">"desconegut"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>: no disponible"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Blanc i negre"</item> <item msgid="2762241247228983754">"Color"</item> diff --git a/packages/PrintSpooler/res/values-cs/strings.xml b/packages/PrintSpooler/res/values-cs/strings.xml index 354f1d52dc33..f402eb39aa53 100644 --- a/packages/PrintSpooler/res/values-cs/strings.xml +++ b/packages/PrintSpooler/res/values-cs/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Restartovat"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Nelze se připojit k tiskárně"</string> <string name="reason_unknown" msgid="5507940196503246139">"neznámé"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – není k dispozici"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Černobíle"</item> <item msgid="2762241247228983754">"Barevně"</item> diff --git a/packages/PrintSpooler/res/values-da/strings.xml b/packages/PrintSpooler/res/values-da/strings.xml index c749fd984574..26457b6c7ecb 100644 --- a/packages/PrintSpooler/res/values-da/strings.xml +++ b/packages/PrintSpooler/res/values-da/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Genstart"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen forbindelse til printer"</string> <string name="reason_unknown" msgid="5507940196503246139">"ukendt"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ikke tilgængelig"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Sort/hvid"</item> <item msgid="2762241247228983754">"Farve"</item> diff --git a/packages/PrintSpooler/res/values-de/strings.xml b/packages/PrintSpooler/res/values-de/strings.xml index 13dac373d4ba..ceffeda5d227 100644 --- a/packages/PrintSpooler/res/values-de/strings.xml +++ b/packages/PrintSpooler/res/values-de/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Neu starten"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Keine Verbindung zum Drucker"</string> <string name="reason_unknown" msgid="5507940196503246139">"unbekannt"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nicht verfügbar"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Schwarz-weiß"</item> <item msgid="2762241247228983754">"Farbe"</item> diff --git a/packages/PrintSpooler/res/values-el/strings.xml b/packages/PrintSpooler/res/values-el/strings.xml index d792d86eebc8..44ba5d4f2ab7 100644 --- a/packages/PrintSpooler/res/values-el/strings.xml +++ b/packages/PrintSpooler/res/values-el/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Επανεκκίνηση"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Δεν υπάρχει σύνδεση με εκτυπωτή"</string> <string name="reason_unknown" msgid="5507940196503246139">"άγνωστο"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – μη διαθέσιμο"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Ασπρόμαυρο"</item> <item msgid="2762241247228983754">"Χρώμα"</item> diff --git a/packages/PrintSpooler/res/values-en-rGB/strings.xml b/packages/PrintSpooler/res/values-en-rGB/strings.xml index f04a298b3d31..7b7748323c73 100644 --- a/packages/PrintSpooler/res/values-en-rGB/strings.xml +++ b/packages/PrintSpooler/res/values-en-rGB/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Restart"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"No connection to printer"</string> <string name="reason_unknown" msgid="5507940196503246139">"unknown"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – unavailable"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Black & White"</item> <item msgid="2762241247228983754">"Colour"</item> diff --git a/packages/PrintSpooler/res/values-en-rIN/strings.xml b/packages/PrintSpooler/res/values-en-rIN/strings.xml index f04a298b3d31..7b7748323c73 100644 --- a/packages/PrintSpooler/res/values-en-rIN/strings.xml +++ b/packages/PrintSpooler/res/values-en-rIN/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Restart"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"No connection to printer"</string> <string name="reason_unknown" msgid="5507940196503246139">"unknown"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – unavailable"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Black & White"</item> <item msgid="2762241247228983754">"Colour"</item> diff --git a/packages/PrintSpooler/res/values-es-rUS/strings.xml b/packages/PrintSpooler/res/values-es-rUS/strings.xml index 13fe4ec7c421..8f76e9d48fd4 100644 --- a/packages/PrintSpooler/res/values-es-rUS/strings.xml +++ b/packages/PrintSpooler/res/values-es-rUS/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Reiniciar"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"No hay conexión con la impresora."</string> <string name="reason_unknown" msgid="5507940196503246139">"desconocido"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>: no disponible"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Blanco y negro"</item> <item msgid="2762241247228983754">"Color"</item> diff --git a/packages/PrintSpooler/res/values-es/strings.xml b/packages/PrintSpooler/res/values-es/strings.xml index 2c9f51b136b4..f7c57903d23d 100644 --- a/packages/PrintSpooler/res/values-es/strings.xml +++ b/packages/PrintSpooler/res/values-es/strings.xml @@ -45,13 +45,14 @@ <string name="restart" msgid="2472034227037808749">"Volver a empezar"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"No hay conexión con la impresora"</string> <string name="reason_unknown" msgid="5507940196503246139">"desconocido"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – no disponible"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Blanco y negro"</item> <item msgid="2762241247228983754">"Color"</item> </string-array> <string-array name="orientation_labels"> - <item msgid="4061931020926489228">"Retrato"</item> - <item msgid="3199660090246166812">"Paisaje"</item> + <item msgid="4061931020926489228">"Vertical"</item> + <item msgid="3199660090246166812">"Horizontal"</item> </string-array> <string-array name="page_options_labels"> <item msgid="7421377442011699994">"Todo"</item> diff --git a/packages/PrintSpooler/res/values-et-rEE/strings.xml b/packages/PrintSpooler/res/values-et-rEE/strings.xml index 5630aa43ea52..0d281708084a 100644 --- a/packages/PrintSpooler/res/values-et-rEE/strings.xml +++ b/packages/PrintSpooler/res/values-et-rEE/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Taaskäivita"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Printeriühendus puudub"</string> <string name="reason_unknown" msgid="5507940196503246139">"teadmata"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – pole saadaval"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Mustvalge"</item> <item msgid="2762241247228983754">"Värv"</item> diff --git a/packages/PrintSpooler/res/values-fa/strings.xml b/packages/PrintSpooler/res/values-fa/strings.xml index b0e84b7849cd..b5435c611379 100644 --- a/packages/PrintSpooler/res/values-fa/strings.xml +++ b/packages/PrintSpooler/res/values-fa/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"راهاندازی مجدد"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"اتصال با چاپگر برقرار نیست"</string> <string name="reason_unknown" msgid="5507940196503246139">"نامعلوم"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - در دسترس نیست"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"سیاه و سفید"</item> <item msgid="2762241247228983754">"رنگی"</item> diff --git a/packages/PrintSpooler/res/values-fi/strings.xml b/packages/PrintSpooler/res/values-fi/strings.xml index d90f1e0329aa..cbf9931a2522 100644 --- a/packages/PrintSpooler/res/values-fi/strings.xml +++ b/packages/PrintSpooler/res/values-fi/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Käynnistä uudelleen"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Ei yhteyttä tulostimeen"</string> <string name="reason_unknown" msgid="5507940196503246139">"tuntematon"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ei käytettävissä"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Mustavalkoinen"</item> <item msgid="2762241247228983754">"Väri"</item> diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml index c6400a099d27..f5c504ffecb1 100644 --- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml +++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Recommencer"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Aucune connexion à l\'imprimante"</string> <string name="reason_unknown" msgid="5507940196503246139">"inconnu"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> — indisponible"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Noir et blanc"</item> <item msgid="2762241247228983754">"Couleur"</item> diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml index 193763445a5c..2d6a7a1420bc 100644 --- a/packages/PrintSpooler/res/values-fr/strings.xml +++ b/packages/PrintSpooler/res/values-fr/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Redémarrer"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Aucune connexion à l\'imprimante."</string> <string name="reason_unknown" msgid="5507940196503246139">"inconnue"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – indisponible"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Noir et blanc"</item> <item msgid="2762241247228983754">"Couleur"</item> diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml index e759205479df..59a88a88425e 100644 --- a/packages/PrintSpooler/res/values-hi/strings.xml +++ b/packages/PrintSpooler/res/values-hi/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"पुन: आरंभ करें"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"प्रिंटर के लिए कोई कनेक्शन नहीं"</string> <string name="reason_unknown" msgid="5507940196503246139">"अज्ञात"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – अनुपलब्ध"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"श्याम और श्वेत"</item> <item msgid="2762241247228983754">"रंग"</item> diff --git a/packages/PrintSpooler/res/values-hr/strings.xml b/packages/PrintSpooler/res/values-hr/strings.xml index 978993836503..399e14e9bed7 100644 --- a/packages/PrintSpooler/res/values-hr/strings.xml +++ b/packages/PrintSpooler/res/values-hr/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Ponovo pokreni"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Nema veze s pisačem"</string> <string name="reason_unknown" msgid="5507940196503246139">"nepoznato"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – zadatak nije dostupan"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Crno-bijelo"</item> <item msgid="2762241247228983754">"U boji"</item> diff --git a/packages/PrintSpooler/res/values-hu/strings.xml b/packages/PrintSpooler/res/values-hu/strings.xml index 685a77105fc2..ea997c546cc0 100644 --- a/packages/PrintSpooler/res/values-hu/strings.xml +++ b/packages/PrintSpooler/res/values-hu/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Újraindítás"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Nincs kapcsolat a nyomtatóval"</string> <string name="reason_unknown" msgid="5507940196503246139">"ismeretlen"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nem érhető el"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Fekete-fehér"</item> <item msgid="2762241247228983754">"Szín"</item> diff --git a/packages/PrintSpooler/res/values-hy-rAM/strings.xml b/packages/PrintSpooler/res/values-hy-rAM/strings.xml index b3499b32bfad..47d862774131 100644 --- a/packages/PrintSpooler/res/values-hy-rAM/strings.xml +++ b/packages/PrintSpooler/res/values-hy-rAM/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Վերագործարկել"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Տպիչի հետ կապ չկա"</string> <string name="reason_unknown" msgid="5507940196503246139">"անհայտ"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> տպիչն անհասանելի է"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Սև ու սպիտակ"</item> <item msgid="2762241247228983754">"Գույնը"</item> diff --git a/packages/PrintSpooler/res/values-in/strings.xml b/packages/PrintSpooler/res/values-in/strings.xml index cb2132caf06e..d4878cd0725c 100644 --- a/packages/PrintSpooler/res/values-in/strings.xml +++ b/packages/PrintSpooler/res/values-in/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Mulai Ulang"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Tidak ada sambungan ke printer"</string> <string name="reason_unknown" msgid="5507940196503246139">"tak diketahui"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – tidak tersedia"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Hitam & Putih"</item> <item msgid="2762241247228983754">"Warna"</item> diff --git a/packages/PrintSpooler/res/values-it/strings.xml b/packages/PrintSpooler/res/values-it/strings.xml index 8483047e50c4..a623bb668cd2 100644 --- a/packages/PrintSpooler/res/values-it/strings.xml +++ b/packages/PrintSpooler/res/values-it/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Riavvia"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Nessun collegamento alla stampante"</string> <string name="reason_unknown" msgid="5507940196503246139">"sconosciuto"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - non disponibile"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Bianco e nero"</item> <item msgid="2762241247228983754">"A colori"</item> diff --git a/packages/PrintSpooler/res/values-iw/strings.xml b/packages/PrintSpooler/res/values-iw/strings.xml index ebef89f7ad47..15b097cb6310 100644 --- a/packages/PrintSpooler/res/values-iw/strings.xml +++ b/packages/PrintSpooler/res/values-iw/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"הפעל מחדש"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"אין חיבור למדפסת"</string> <string name="reason_unknown" msgid="5507940196503246139">"לא ידוע"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – לא זמינה"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"שחור ולבן"</item> <item msgid="2762241247228983754">"צבע"</item> diff --git a/packages/PrintSpooler/res/values-ja/strings.xml b/packages/PrintSpooler/res/values-ja/strings.xml index 60820cb27f4e..116c7fe11c9c 100644 --- a/packages/PrintSpooler/res/values-ja/strings.xml +++ b/packages/PrintSpooler/res/values-ja/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"再起動"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"プリンタに接続されていません"</string> <string name="reason_unknown" msgid="5507940196503246139">"不明"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>–使用不可"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"モノクロ"</item> <item msgid="2762241247228983754">"色"</item> diff --git a/packages/PrintSpooler/res/values-ka-rGE/strings.xml b/packages/PrintSpooler/res/values-ka-rGE/strings.xml index e1c4e5218e20..320d57c8176b 100644 --- a/packages/PrintSpooler/res/values-ka-rGE/strings.xml +++ b/packages/PrintSpooler/res/values-ka-rGE/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"გადატვირთვა"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"პრინტერთან კავშირი არ არის"</string> <string name="reason_unknown" msgid="5507940196503246139">"უცნობი"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – მიუწვდომელია"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"შავ-თეთრი"</item> <item msgid="2762241247228983754">"ფერი"</item> diff --git a/packages/PrintSpooler/res/values-km-rKH/strings.xml b/packages/PrintSpooler/res/values-km-rKH/strings.xml index 2177a0430f56..b9a52f1ec324 100644 --- a/packages/PrintSpooler/res/values-km-rKH/strings.xml +++ b/packages/PrintSpooler/res/values-km-rKH/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"ចាប់ផ្ដើមឡើងវិញ"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"គ្មានការភ្ជាប់ទៅម៉ាស៊ីនបោះពុម្ព"</string> <string name="reason_unknown" msgid="5507940196503246139">"មិនស្គាល់"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – មិនអាចប្រើបាន"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"ស & ខ្មៅ"</item> <item msgid="2762241247228983754">"ពណ៌"</item> diff --git a/packages/PrintSpooler/res/values-ko/strings.xml b/packages/PrintSpooler/res/values-ko/strings.xml index b561fd164981..c09b5c3b099a 100644 --- a/packages/PrintSpooler/res/values-ko/strings.xml +++ b/packages/PrintSpooler/res/values-ko/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"다시 시작"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"프린터와 연결되지 않음"</string> <string name="reason_unknown" msgid="5507940196503246139">"알 수 없음"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 사용할 수 없음"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"흑백"</item> <item msgid="2762241247228983754">"컬러"</item> diff --git a/packages/PrintSpooler/res/values-lo-rLA/strings.xml b/packages/PrintSpooler/res/values-lo-rLA/strings.xml index aed4817ec507..f6d5fcdb748c 100644 --- a/packages/PrintSpooler/res/values-lo-rLA/strings.xml +++ b/packages/PrintSpooler/res/values-lo-rLA/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"ປິດເປີດໃໝ່"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"ບໍ່ມີການເຊື່ອມຕໍ່ຫາເຄື່ອງພິມ"</string> <string name="reason_unknown" msgid="5507940196503246139">"ບໍ່ຮູ້ຈັກ"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - ບໍ່ມີຢູ່"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"ຂາວດຳ"</item> <item msgid="2762241247228983754">"ສີ"</item> diff --git a/packages/PrintSpooler/res/values-lt/strings.xml b/packages/PrintSpooler/res/values-lt/strings.xml index 75484c705ec6..6778b75fdd86 100644 --- a/packages/PrintSpooler/res/values-lt/strings.xml +++ b/packages/PrintSpooler/res/values-lt/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Paleisti iš naujo"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Nėra ryšio su spausdintuvu"</string> <string name="reason_unknown" msgid="5507940196503246139">"nežinoma"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"„<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>“ – nepasiekiama"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Nespalvotas"</item> <item msgid="2762241247228983754">"Spalva"</item> diff --git a/packages/PrintSpooler/res/values-lv/strings.xml b/packages/PrintSpooler/res/values-lv/strings.xml index 454ae0b9ee9f..a255001d1643 100644 --- a/packages/PrintSpooler/res/values-lv/strings.xml +++ b/packages/PrintSpooler/res/values-lv/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Restartēt"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Nav savienojuma ar printeri"</string> <string name="reason_unknown" msgid="5507940196503246139">"nezināms"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> — nav pieejams"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Melnbalts"</item> <item msgid="2762241247228983754">"Krāsa"</item> diff --git a/packages/PrintSpooler/res/values-mn-rMN/strings.xml b/packages/PrintSpooler/res/values-mn-rMN/strings.xml index d32acd75887d..3ab1baac3939 100644 --- a/packages/PrintSpooler/res/values-mn-rMN/strings.xml +++ b/packages/PrintSpooler/res/values-mn-rMN/strings.xml @@ -24,7 +24,7 @@ <string name="label_paper_size" msgid="8681895607876809323">"Цаасны хэмжээ"</string> <string name="label_color" msgid="1108690305218188969">"Өнгө"</string> <string name="label_orientation" msgid="2853142581990496477">"Чиглэл"</string> - <string name="label_pages" msgid="6300874667546617333">"ХУУДСУУД (<xliff:g id="PAGE_COUNT">%1$s</xliff:g>)"</string> + <string name="label_pages" msgid="6300874667546617333">"(<xliff:g id="PAGE_COUNT">%1$s</xliff:g>) хуудас"</string> <string name="pages_range_example" msgid="4069269138547562081">"жнь. 1–5, 8, 11–13"</string> <string name="print_preview" msgid="8010217796057763343">"Хэвлэхээр урьдчилан харах"</string> <string name="install_for_print_preview" msgid="6366303997385509332">"Урьдчилан харахын тулд PDF харагчийг суулгах"</string> @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Дахин эхлүүлэх"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Принтер холбогдоогүй байна"</string> <string name="reason_unknown" msgid="5507940196503246139">"тодорхойгүй"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ашиглах боломжгүй"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Хар & Цагаан"</item> <item msgid="2762241247228983754">"Өнгө"</item> diff --git a/packages/PrintSpooler/res/values-ms-rMY/strings.xml b/packages/PrintSpooler/res/values-ms-rMY/strings.xml index 98a62e508032..bfbe51eeb816 100644 --- a/packages/PrintSpooler/res/values-ms-rMY/strings.xml +++ b/packages/PrintSpooler/res/values-ms-rMY/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Mulakan semula"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Tiada sambungan ke pencetak"</string> <string name="reason_unknown" msgid="5507940196503246139">"tidak diketahui"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – tidak tersedia"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Hitam & Putih"</item> <item msgid="2762241247228983754">"Warna"</item> diff --git a/packages/PrintSpooler/res/values-nb/strings.xml b/packages/PrintSpooler/res/values-nb/strings.xml index 318af3811400..d5dc3004ba24 100644 --- a/packages/PrintSpooler/res/values-nb/strings.xml +++ b/packages/PrintSpooler/res/values-nb/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Start på nytt"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen forbindelse med skriveren"</string> <string name="reason_unknown" msgid="5507940196503246139">"ukjent"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – utilgjengelig"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Svart og hvitt"</item> <item msgid="2762241247228983754">"Farge"</item> diff --git a/packages/PrintSpooler/res/values-nl/strings.xml b/packages/PrintSpooler/res/values-nl/strings.xml index 7227e06a929c..2d27eed21653 100644 --- a/packages/PrintSpooler/res/values-nl/strings.xml +++ b/packages/PrintSpooler/res/values-nl/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Opnieuw starten"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Geen verbinding met printer"</string> <string name="reason_unknown" msgid="5507940196503246139">"onbekend"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – niet beschikbaar"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Zwart-wit"</item> <item msgid="2762241247228983754">"Kleur"</item> diff --git a/packages/PrintSpooler/res/values-pl/strings.xml b/packages/PrintSpooler/res/values-pl/strings.xml index 3705373a43cd..6f8aab2791fa 100644 --- a/packages/PrintSpooler/res/values-pl/strings.xml +++ b/packages/PrintSpooler/res/values-pl/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Od nowa"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Brak połączenia z drukarką"</string> <string name="reason_unknown" msgid="5507940196503246139">"brak informacji"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – niedostępne"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Czarno-białe"</item> <item msgid="2762241247228983754">"Kolor"</item> diff --git a/packages/PrintSpooler/res/values-pt-rPT/strings.xml b/packages/PrintSpooler/res/values-pt-rPT/strings.xml index e2bab7d2fbad..db37f906c147 100644 --- a/packages/PrintSpooler/res/values-pt-rPT/strings.xml +++ b/packages/PrintSpooler/res/values-pt-rPT/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Reiniciar"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Sem ligação à impressora"</string> <string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – indisponível"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Preto e branco:"</item> <item msgid="2762241247228983754">"Cor"</item> diff --git a/packages/PrintSpooler/res/values-pt/strings.xml b/packages/PrintSpooler/res/values-pt/strings.xml index 0915236b9c87..1a7a7376bfaa 100644 --- a/packages/PrintSpooler/res/values-pt/strings.xml +++ b/packages/PrintSpooler/res/values-pt/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Reiniciar"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Sem conexão com a impressora"</string> <string name="reason_unknown" msgid="5507940196503246139">"desconhecido"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – não disponível"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Preto e branco"</item> <item msgid="2762241247228983754">"Cor"</item> diff --git a/packages/PrintSpooler/res/values-ro/strings.xml b/packages/PrintSpooler/res/values-ro/strings.xml index 4cd2432eabf5..588717db91fd 100644 --- a/packages/PrintSpooler/res/values-ro/strings.xml +++ b/packages/PrintSpooler/res/values-ro/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Reporniți"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Nu există conexiune la o imprimantă"</string> <string name="reason_unknown" msgid="5507940196503246139">"necunoscut"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - indisponibil"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Alb-negru"</item> <item msgid="2762241247228983754">"Color"</item> diff --git a/packages/PrintSpooler/res/values-ru/strings.xml b/packages/PrintSpooler/res/values-ru/strings.xml index cc33bd146c20..cbb5f1b4c2c1 100644 --- a/packages/PrintSpooler/res/values-ru/strings.xml +++ b/packages/PrintSpooler/res/values-ru/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Повторить"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Нет связи с принтером"</string> <string name="reason_unknown" msgid="5507940196503246139">"неизвестно"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – недоступен"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Черно-белое"</item> <item msgid="2762241247228983754">"Цветное"</item> diff --git a/packages/PrintSpooler/res/values-sk/strings.xml b/packages/PrintSpooler/res/values-sk/strings.xml index 4a7801fd7f9a..993ee53f7a2c 100644 --- a/packages/PrintSpooler/res/values-sk/strings.xml +++ b/packages/PrintSpooler/res/values-sk/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Spustiť znova"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Žiadne pripojenie k tlačiarni"</string> <string name="reason_unknown" msgid="5507940196503246139">"neznáme"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – nie je k dispozícii"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Čiernobiele"</item> <item msgid="2762241247228983754">"Farba"</item> diff --git a/packages/PrintSpooler/res/values-sl/strings.xml b/packages/PrintSpooler/res/values-sl/strings.xml index f43ed4118aa6..a6dd0e2e9c08 100644 --- a/packages/PrintSpooler/res/values-sl/strings.xml +++ b/packages/PrintSpooler/res/values-sl/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Začni znova"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Ni povezave s tiskalnikom"</string> <string name="reason_unknown" msgid="5507940196503246139">"neznano"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ni na voljo"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Črno-belo"</item> <item msgid="2762241247228983754">"Barvno"</item> diff --git a/packages/PrintSpooler/res/values-sr/strings.xml b/packages/PrintSpooler/res/values-sr/strings.xml index 4839d0ca27f3..3b03e107d4c9 100644 --- a/packages/PrintSpooler/res/values-sr/strings.xml +++ b/packages/PrintSpooler/res/values-sr/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Поново покрени"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Нема везе са штампачем"</string> <string name="reason_unknown" msgid="5507940196503246139">"непознато"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – недоступан"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Црно-бело"</item> <item msgid="2762241247228983754">"Боја"</item> diff --git a/packages/PrintSpooler/res/values-sv/strings.xml b/packages/PrintSpooler/res/values-sv/strings.xml index d6068bab5b6c..0faa851af7e5 100644 --- a/packages/PrintSpooler/res/values-sv/strings.xml +++ b/packages/PrintSpooler/res/values-sv/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Starta om"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Ingen anslutning till skrivaren"</string> <string name="reason_unknown" msgid="5507940196503246139">"okänt"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – inte tillgänglig"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Svartvit"</item> <item msgid="2762241247228983754">"Färg"</item> diff --git a/packages/PrintSpooler/res/values-sw/strings.xml b/packages/PrintSpooler/res/values-sw/strings.xml index ed8df7763a8e..b97c6a3e14db 100644 --- a/packages/PrintSpooler/res/values-sw/strings.xml +++ b/packages/PrintSpooler/res/values-sw/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Anzisha upya"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Hakuna muunganisho kwa printa"</string> <string name="reason_unknown" msgid="5507940196503246139">"haijulikani"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - haipatikani"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Nyeusi na Nyeupe"</item> <item msgid="2762241247228983754">"Rangi"</item> diff --git a/packages/PrintSpooler/res/values-th/strings.xml b/packages/PrintSpooler/res/values-th/strings.xml index 586f1bb993ff..ba20aaf4dd1f 100644 --- a/packages/PrintSpooler/res/values-th/strings.xml +++ b/packages/PrintSpooler/res/values-th/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"เริ่มต้นใหม่"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"ไม่มีการเชื่อมต่อไปยังเครื่องพิมพ์"</string> <string name="reason_unknown" msgid="5507940196503246139">"ไม่ทราบ"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ไม่พร้อมใช้งาน"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"ขาวดำ"</item> <item msgid="2762241247228983754">"สี"</item> diff --git a/packages/PrintSpooler/res/values-tl/strings.xml b/packages/PrintSpooler/res/values-tl/strings.xml index 1100c0be0672..a0fd8ad6ca82 100644 --- a/packages/PrintSpooler/res/values-tl/strings.xml +++ b/packages/PrintSpooler/res/values-tl/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"I-restart"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Hindi nakakonekta sa printer"</string> <string name="reason_unknown" msgid="5507940196503246139">"hindi alam"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – hindi available"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Black & White"</item> <item msgid="2762241247228983754">"Kulay"</item> diff --git a/packages/PrintSpooler/res/values-tr/strings.xml b/packages/PrintSpooler/res/values-tr/strings.xml index 34fc1fe403d3..4b45829cc699 100644 --- a/packages/PrintSpooler/res/values-tr/strings.xml +++ b/packages/PrintSpooler/res/values-tr/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Yeniden başlat"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Yazıcı bağlantısı yok"</string> <string name="reason_unknown" msgid="5507940196503246139">"bilinmiyor"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – kullanılamıyor"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Siyah Beyaz"</item> <item msgid="2762241247228983754">"Renkli"</item> diff --git a/packages/PrintSpooler/res/values-uk/strings.xml b/packages/PrintSpooler/res/values-uk/strings.xml index 52f0e9f89f38..0aa514fd5faf 100644 --- a/packages/PrintSpooler/res/values-uk/strings.xml +++ b/packages/PrintSpooler/res/values-uk/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Перезапустити"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Немає з’єднання з принтером"</string> <string name="reason_unknown" msgid="5507940196503246139">"невідомо"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"Завдання \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" не доступне"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Чорно-білий"</item> <item msgid="2762241247228983754">"Колір"</item> diff --git a/packages/PrintSpooler/res/values-vi/strings.xml b/packages/PrintSpooler/res/values-vi/strings.xml index b0d9105eeaa2..bb06d8b0e90c 100644 --- a/packages/PrintSpooler/res/values-vi/strings.xml +++ b/packages/PrintSpooler/res/values-vi/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Bắt đầu lại"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Không có kết nối nào với máy in"</string> <string name="reason_unknown" msgid="5507940196503246139">"không xác định"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – không khả dụng"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Đen trắng"</item> <item msgid="2762241247228983754">"Màu"</item> diff --git a/packages/PrintSpooler/res/values-zh-rCN/strings.xml b/packages/PrintSpooler/res/values-zh-rCN/strings.xml index dda0d4dbab06..564b47eccf49 100644 --- a/packages/PrintSpooler/res/values-zh-rCN/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rCN/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"重新开始"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"未与打印机建立连接"</string> <string name="reason_unknown" msgid="5507940196503246139">"未知"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> - 无法使用"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"黑白"</item> <item msgid="2762241247228983754">"彩色"</item> diff --git a/packages/PrintSpooler/res/values-zh-rHK/strings.xml b/packages/PrintSpooler/res/values-zh-rHK/strings.xml index 844bdb49d187..99eb30a01851 100644 --- a/packages/PrintSpooler/res/values-zh-rHK/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rHK/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"重新開始"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"尚未與打印機連線"</string> <string name="reason_unknown" msgid="5507940196503246139">"不明"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 無法使用"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"黑白"</item> <item msgid="2762241247228983754">"彩色"</item> diff --git a/packages/PrintSpooler/res/values-zh-rTW/strings.xml b/packages/PrintSpooler/res/values-zh-rTW/strings.xml index fa9185638150..4f2016112012 100644 --- a/packages/PrintSpooler/res/values-zh-rTW/strings.xml +++ b/packages/PrintSpooler/res/values-zh-rTW/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"重新開始"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"尚未與印表機建立連線"</string> <string name="reason_unknown" msgid="5507940196503246139">"不明"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – 無法使用"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"黑白"</item> <item msgid="2762241247228983754">"彩色"</item> diff --git a/packages/PrintSpooler/res/values-zu/strings.xml b/packages/PrintSpooler/res/values-zu/strings.xml index c5d1de42c210..7ad8ce29222d 100644 --- a/packages/PrintSpooler/res/values-zu/strings.xml +++ b/packages/PrintSpooler/res/values-zu/strings.xml @@ -45,6 +45,7 @@ <string name="restart" msgid="2472034227037808749">"Qala kabusha"</string> <string name="no_connection_to_printer" msgid="2159246915977282728">"Akukho ukuxhumana kuphrinta"</string> <string name="reason_unknown" msgid="5507940196503246139">"akwaziwa"</string> + <string name="printer_unavailable" msgid="2434170617003315690">"I-<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> – ayitholakali"</string> <string-array name="color_mode_labels"> <item msgid="7602948745415174937">"Okumnyama nokumhlophe"</item> <item msgid="2762241247228983754">"Umbala"</item> diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml index 5ee8d8cb67c8..41775a11271b 100644 --- a/packages/PrintSpooler/res/values/strings.xml +++ b/packages/PrintSpooler/res/values/strings.xml @@ -75,13 +75,16 @@ <!-- Title for the select printer activity. [CHAR LIMIT=30] --> <string name="all_printers_label">All printers</string> + <!-- Title of the button to install a print service. [CHAR LIMIT=25] --> + <string name="add_print_service_label">Add service</string> + <!-- Add printer dialog --> <!-- Title for the alert dialog for selecting a print service. [CHAR LIMIT=50] --> <string name="choose_print_service">Choose print service</string> - <!-- Title for the button to search the play store for print services. [CHAR LIMIT=50] --> - <string name="search_play_store">Search in play store</string> + <!-- Title for the prompt shown as a placeholder if no printers are found while searching. [CHAR LIMIT=50] --> + <string name="print_no_printers_found">No printers found</string> <!-- Notifications --> diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 44362d4ab85f..847411527615 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -56,6 +56,7 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextUtils.SimpleStringSplitter; import android.text.TextWatcher; +import android.util.ArrayMap; import android.util.ArraySet; import android.util.AttributeSet; import android.util.Log; @@ -735,8 +736,12 @@ public class PrintJobConfigActivity extends Activity { if (resultCode == RESULT_OK) { PrinterId printerId = (PrinterId) data.getParcelableExtra( INTENT_EXTRA_PRINTER_ID); - mEditor.selectPrinter(printerId); + if (printerId != null) { + mEditor.ensurePrinterSelected(printerId); + break; + } } + mEditor.ensureCurrentPrinterSelected(); } break; } } @@ -817,6 +822,8 @@ public class PrintJobConfigActivity extends Activity { private Button mPrintButton; + private PrinterId mNextPrinterId; + private PrinterInfo mCurrentPrinter; private final OnItemSelectedListener mOnItemSelectedListener = @@ -830,10 +837,6 @@ public class PrintJobConfigActivity extends Activity { } if (id == DEST_ADAPTER_ITEM_ID_ALL_PRINTERS) { - // The selection changed to the all printers item. We - // want to select back the last selected printer. - mIgnoreNextDestinationChange = true; - mEditor.selectPrinter(mCurrentPrinter.getId()); startSelectPrinterActivity(); return; } @@ -1157,6 +1160,13 @@ public class PrintJobConfigActivity extends Activity { mDestinationSpinner.setSelection(0); } + // If there is a next printer to select and we succeed selecting + // it - done. Let the selection handling code make everything right. + if (mNextPrinterId != null && selectPrinter(mNextPrinterId)) { + mNextPrinterId = null; + return; + } + // If the current printer properties changed, we update the UI. if (mCurrentPrinter != null) { final int printerCount = mDestinationSpinnerAdapter.getCount(); @@ -1299,10 +1309,32 @@ public class PrintJobConfigActivity extends Activity { } } - public void selectPrinter(PrinterId printerId) { - mDestinationSpinnerAdapter.ensurePrinterShownPrinterShown(printerId); + public void ensurePrinterSelected(PrinterId printerId) { + // If the printer is not present maybe the loader is not + // updated yet. In this case make a note and as soon as + // the printer appears will will select it. + if (!selectPrinter(printerId)) { + mNextPrinterId = printerId; + } + } + + public boolean selectPrinter(PrinterId printerId) { + mDestinationSpinnerAdapter.ensurePrinterInVisibleAdapterPosition(printerId); final int position = mDestinationSpinnerAdapter.getPrinterIndex(printerId); - mDestinationSpinner.setSelection(position); + if (position != AdapterView.INVALID_POSITION + && position != mDestinationSpinner.getSelectedItemPosition()) { + Object item = mDestinationSpinnerAdapter.getItem(position); + mCurrentPrinter = (PrinterInfo) item; + mDestinationSpinner.setSelection(position); + return true; + } + return false; + } + + public void ensureCurrentPrinterSelected() { + if (mCurrentPrinter != null) { + selectPrinter(mCurrentPrinter.getId()); + } } public boolean isPrintingToPdf() { @@ -2015,8 +2047,6 @@ public class PrintJobConfigActivity extends Activity { private final PrinterInfo mFakePdfPrinter; - private PrinterId mLastShownPrinterId; - public DestinationAdapter() { getLoaderManager().initLoader(LOADER_ID_PRINTERS_LOADER, null, this); mFakePdfPrinter = createFakePdfPrinter(); @@ -2032,9 +2062,23 @@ public class PrintJobConfigActivity extends Activity { return AdapterView.INVALID_POSITION; } - public void ensurePrinterShownPrinterShown(PrinterId printerId) { - mLastShownPrinterId = printerId; - ensureLastShownPrinterInPosition(); + public void ensurePrinterInVisibleAdapterPosition(PrinterId printerId) { + final int printerCount = mPrinters.size(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = (PrinterInfo) mPrinters.get(i); + if (printer.getId().equals(printerId)) { + // If already in the list - do nothing. + if (i < getCount() - 2) { + return; + } + // Else replace the last one (two items are not printers). + final int lastPrinterIndex = getCount() - 3; + mPrinters.set(i, mPrinters.get(lastPrinterIndex)); + mPrinters.set(lastPrinterIndex, printer); + notifyDataSetChanged(); + return; + } + } } @Override @@ -2172,9 +2216,46 @@ public class PrintJobConfigActivity extends Activity { @Override public void onLoadFinished(Loader<List<PrinterInfo>> loader, List<PrinterInfo> printers) { + // We rearrange the printers if the user selects a printer + // not shown in the initial short list. Therefore, we have + // to keep the printer order. + + // No old printers - do not bother keeping their position. + if (mPrinters.isEmpty()) { + mPrinters.addAll(printers); + mEditor.ensureCurrentPrinterSelected(); + notifyDataSetChanged(); + return; + } + + // Add the new printers to a map. + ArrayMap<PrinterId, PrinterInfo> newPrintersMap = + new ArrayMap<PrinterId, PrinterInfo>(); + final int printerCount = printers.size(); + for (int i = 0; i < printerCount; i++) { + PrinterInfo printer = printers.get(i); + newPrintersMap.put(printer.getId(), printer); + } + + List<PrinterInfo> newPrinters = new ArrayList<PrinterInfo>(); + + // Update printers we already have. + final int oldPrinterCount = mPrinters.size(); + for (int i = 0; i < oldPrinterCount; i++) { + PrinterId oldPrinterId = mPrinters.get(i).getId(); + PrinterInfo updatedPrinter = newPrintersMap.remove(oldPrinterId); + if (updatedPrinter != null) { + newPrinters.add(updatedPrinter); + } + } + + // Add the rest of the new printers, i.e. what is left. + newPrinters.addAll(newPrintersMap.values()); + mPrinters.clear(); - mPrinters.addAll(printers); - ensureLastShownPrinterInPosition(); + mPrinters.addAll(newPrinters); + + mEditor.ensureCurrentPrinterSelected(); notifyDataSetChanged(); } @@ -2184,27 +2265,6 @@ public class PrintJobConfigActivity extends Activity { notifyDataSetInvalidated(); } - private void ensureLastShownPrinterInPosition() { - if (mLastShownPrinterId == null) { - return; - } - final int printerCount = mPrinters.size(); - for (int i = 0; i < printerCount; i++) { - PrinterInfo printer = (PrinterInfo) mPrinters.get(i); - if (printer.getId().equals(mLastShownPrinterId)) { - // If already in the list - do nothing. - if (i < getCount() - 2) { - return; - } - // Else replace the last one. - final int lastPrinter = getCount() - 2; - mPrinters.set(i, mPrinters.get(lastPrinter - 1)); - mPrinters.set(lastPrinter - 1, printer); - return; - } - } - } - private PrinterInfo createFakePdfPrinter() { final MediaSize defaultMediaSize; String currentCountry = getResources().getConfiguration().locale.getCountry(); diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java index 87181f74ed0e..d1d71cd03176 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java @@ -236,7 +236,7 @@ public final class PrintSpoolerService extends Service { @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { synchronized (mLock) { - String prefix = args[0]; + String prefix = (args.length > 0) ? args[0] : ""; String tab = " "; pw.append(prefix).append("print jobs:").println(); diff --git a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java index c397c4065530..c888e2c37dc5 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java +++ b/packages/PrintSpooler/src/com/android/printspooler/SelectPrinterFragment.java @@ -92,6 +92,8 @@ public final class SelectPrinterFragment extends ListFragment { public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setListAdapter(new DestinationAdapter()); + View emptyView = getActivity().findViewById(R.id.empty_print_state); + getListView().setEmptyView(emptyView); } @Override @@ -252,7 +254,7 @@ public final class SelectPrinterFragment extends ListFragment { Uri marketUri = Uri.parse(DEFAULT_MARKET_QUERY_STRING); final Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri); if (getActivity().getPackageManager().resolveActivity(marketIntent, 0) != null) { - builder.setPositiveButton(R.string.search_play_store, + builder.setPositiveButton(R.string.add_print_service_label, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { try { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java index 277501dfd5be..16e2e079d2ab 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DateView.java @@ -21,6 +21,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.util.AttributeSet; +import android.util.Log; import android.view.View; import android.view.ViewParent; import android.widget.TextView; @@ -39,10 +40,7 @@ public class DateView extends TextView { private final Date mCurrentTime = new Date(); private SimpleDateFormat mDateFormat; - private boolean mChangedLocale; - private boolean mAttachedToWindow; - private boolean mWindowVisible; - private boolean mUpdating; + private String mLastText; private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { @Override @@ -53,7 +51,8 @@ public class DateView extends TextView { || Intent.ACTION_TIMEZONE_CHANGED.equals(action) || Intent.ACTION_LOCALE_CHANGED.equals(action)) { if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { - mChangedLocale = true; + // need to get a fresh date format + mDateFormat = null; } updateClock(); } @@ -67,80 +66,39 @@ public class DateView extends TextView { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - mAttachedToWindow = true; - setUpdates(); - } - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mAttachedToWindow = false; - setUpdates(); - } + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_TIME_TICK); + filter.addAction(Intent.ACTION_TIME_CHANGED); + filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + filter.addAction(Intent.ACTION_LOCALE_CHANGED); + mContext.registerReceiver(mIntentReceiver, filter, null, null); - @Override - protected void onWindowVisibilityChanged(int visibility) { - super.onWindowVisibilityChanged(visibility); - mWindowVisible = visibility == VISIBLE; - setUpdates(); + updateClock(); } @Override - protected void onVisibilityChanged(View changedView, int visibility) { - super.onVisibilityChanged(changedView, visibility); - setUpdates(); - } + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); - @Override - protected int getSuggestedMinimumWidth() { - // makes the large background bitmap not force us to full width - return 0; + mDateFormat = null; // reload the locale next time + mContext.unregisterReceiver(mIntentReceiver); } protected void updateClock() { - if (mDateFormat == null || mChangedLocale) { + if (mDateFormat == null) { final String dateFormat = getContext().getString(R.string.system_ui_date_pattern); final Locale l = Locale.getDefault(); final String fmt = ICU.getBestDateTimePattern(dateFormat, l.toString()); mDateFormat = new SimpleDateFormat(fmt, l); - mChangedLocale = false; } mCurrentTime.setTime(System.currentTimeMillis()); - setText(mDateFormat.format(mCurrentTime)); - } - private boolean isVisible() { - View v = this; - while (true) { - if (v.getVisibility() != VISIBLE) { - return false; - } - final ViewParent parent = v.getParent(); - if (parent instanceof View) { - v = (View)parent; - } else { - return true; - } - } - } - - private void setUpdates() { - boolean update = mAttachedToWindow && mWindowVisible && isVisible(); - if (update != mUpdating) { - mUpdating = update; - if (update) { - // Register for Intent broadcasts for the clock and battery - IntentFilter filter = new IntentFilter(); - filter.addAction(Intent.ACTION_TIME_TICK); - filter.addAction(Intent.ACTION_TIME_CHANGED); - filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); - filter.addAction(Intent.ACTION_LOCALE_CHANGED); - mContext.registerReceiver(mIntentReceiver, filter, null, null); - updateClock(); - } else { - mContext.unregisterReceiver(mIntentReceiver); - } + final String text = mDateFormat.format(mCurrentTime); + if (!text.equals(mLastText)) { + setText(text); + mLastText = text; } } } diff --git a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java index 42b8cce05d6a..3d5654a56b9e 100644 --- a/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java +++ b/packages/VpnDialogs/src/com/android/vpndialogs/ManageDialog.java @@ -147,7 +147,7 @@ public class ManageDialog extends AlertActivity implements mHandler.removeMessages(0); if (!isFinishing()) { - if (mConfig.startTime != 0) { + if (mConfig.startTime != -1) { long seconds = (SystemClock.elapsedRealtime() - mConfig.startTime) / 1000; mDuration.setText(String.format("%02d:%02d:%02d", seconds / 3600, seconds / 60 % 60, seconds % 60)); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 2bd32384ad4b..f08584a365c1 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -1626,7 +1626,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); if (!compatInfo.supportsScreen()) { - win.addFlags(WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW); + win.addFlags(WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW); } win.setDefaultIcon(icon); diff --git a/services/java/com/android/server/ClipboardService.java b/services/java/com/android/server/ClipboardService.java index 0bf03b5ff453..069ae23f5596 100644 --- a/services/java/com/android/server/ClipboardService.java +++ b/services/java/com/android/server/ClipboardService.java @@ -122,7 +122,9 @@ public class ClipboardService extends IClipboard.Stub { try { return super.onTransact(code, data, reply, flags); } catch (RuntimeException e) { - Slog.w("clipboard", "Exception: ", e); + if (!(e instanceof SecurityException)) { + Slog.wtf("clipboard", "Exception: ", e); + } throw e; } diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index 45c614f37af5..794d274da5fa 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -817,7 +817,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // The input method manager only throws security exceptions, so let's // log all others. if (!(e instanceof SecurityException)) { - Slog.e(TAG, "Input Method Manager Crash", e); + Slog.wtf(TAG, "Input Method Manager Crash", e); } throw e; } diff --git a/services/java/com/android/server/accounts/AccountManagerService.java b/services/java/com/android/server/accounts/AccountManagerService.java index 3a3dfd5f1c04..dd9ae4c9397e 100644 --- a/services/java/com/android/server/accounts/AccountManagerService.java +++ b/services/java/com/android/server/accounts/AccountManagerService.java @@ -60,6 +60,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.Parcel; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; @@ -267,6 +268,21 @@ public class AccountManagerService }, UserHandle.ALL, userFilter, null, null); } + @Override + public boolean onTransact(int code, Parcel data, Parcel reply, int flags) + throws RemoteException { + try { + return super.onTransact(code, data, reply, flags); + } catch (RuntimeException e) { + // The account manager only throws security exceptions, so let's + // log all others. + if (!(e instanceof SecurityException)) { + Slog.wtf(TAG, "Account Manager Crash", e); + } + throw e; + } + } + public void systemReady() { } diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java index fa1769f69ded..27ca7a05d9c4 100644 --- a/services/java/com/android/server/am/ActiveServices.java +++ b/services/java/com/android/server/am/ActiveServices.java @@ -130,9 +130,9 @@ public final class ActiveServices { = new ArrayList<ServiceRecord>(); /** - * List of services that are in the process of being stopped. + * List of services that are in the process of being destroyed. */ - final ArrayList<ServiceRecord> mStoppingServices + final ArrayList<ServiceRecord> mDestroyingServices = new ArrayList<ServiceRecord>(); static final class DelayingProcess extends ArrayList<ServiceRecord> { @@ -788,7 +788,7 @@ public final class ActiveServices { } } - serviceDoneExecutingLocked(r, mStoppingServices.contains(r)); + serviceDoneExecutingLocked(r, mDestroyingServices.contains(r), false); } } finally { Binder.restoreCallingIdentity(origId); @@ -834,9 +834,9 @@ public final class ActiveServices { + " at " + b + ": apps=" + (b != null ? b.apps.size() : 0)); - boolean inStopping = mStoppingServices.contains(r); + boolean inDestroying = mDestroyingServices.contains(r); if (b != null) { - if (b.apps.size() > 0 && !inStopping) { + if (b.apps.size() > 0 && !inDestroying) { // Applications have already bound since the last // unbind, so just rebind right here. boolean inFg = false; @@ -856,7 +856,7 @@ public final class ActiveServices { } } - serviceDoneExecutingLocked(r, inStopping); + serviceDoneExecutingLocked(r, inDestroying, false); } } finally { Binder.restoreCallingIdentity(origId); @@ -1419,14 +1419,10 @@ public final class ActiveServices { } } - private final void bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn, - boolean hasConn) { - //Slog.i(TAG, "Bring down service:"); - //r.dump(" "); - + private final boolean isServiceNeeded(ServiceRecord r, boolean knowConn, boolean hasConn) { // Are we still explicitly being asked to run? if (r.startRequested) { - return; + return true; } // Is someone still bound to us keepign us running? @@ -1434,6 +1430,18 @@ public final class ActiveServices { hasConn = r.hasAutoCreateConnections(); } if (hasConn) { + return true; + } + + return false; + } + + private final void bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn, + boolean hasConn) { + //Slog.i(TAG, "Bring down service:"); + //r.dump(" "); + + if (isServiceNeeded(r, knowConn, hasConn)) { return; } @@ -1484,7 +1492,7 @@ public final class ActiveServices { } catch (Exception e) { Slog.w(TAG, "Exception when unbinding service " + r.shortName, e); - serviceDoneExecutingLocked(r, true); + serviceDoneExecutingLocked(r, true, true); } } } @@ -1527,14 +1535,14 @@ public final class ActiveServices { r.app.services.remove(r); if (r.app.thread != null) { try { - bumpServiceExecutingLocked(r, false, "stop"); - mStoppingServices.add(r); + bumpServiceExecutingLocked(r, false, "destroy"); + mDestroyingServices.add(r); mAm.updateOomAdjLocked(r.app); r.app.thread.scheduleStopService(r); } catch (Exception e) { - Slog.w(TAG, "Exception when stopping service " + Slog.w(TAG, "Exception when destroying service " + r.shortName, e); - serviceDoneExecutingLocked(r, true); + serviceDoneExecutingLocked(r, true, true); } updateServiceForegroundLocked(r.app, false); } else { @@ -1560,7 +1568,7 @@ public final class ActiveServices { r.tracker.setStarted(false, memFactor, now); r.tracker.setBound(false, memFactor, now); if (r.executeNesting == 0) { - r.tracker.makeInactive(); + r.tracker.clearCurrentOwner(r); r.tracker = null; } } @@ -1619,7 +1627,7 @@ public final class ActiveServices { s.app.thread.scheduleUnbindService(s, b.intent.intent.getIntent()); } catch (Exception e) { Slog.w(TAG, "Exception when unbinding service " + s.shortName, e); - serviceDoneExecutingLocked(s, true); + serviceDoneExecutingLocked(s, true, true); } } @@ -1637,7 +1645,7 @@ public final class ActiveServices { } void serviceDoneExecutingLocked(ServiceRecord r, int type, int startId, int res) { - boolean inStopping = mStoppingServices.contains(r); + boolean inDestroying = mDestroyingServices.contains(r); if (r != null) { if (type == 1) { // This is a call from a service start... take care of @@ -1690,7 +1698,7 @@ public final class ActiveServices { } } final long origId = Binder.clearCallingIdentity(); - serviceDoneExecutingLocked(r, inStopping); + serviceDoneExecutingLocked(r, inDestroying, inDestroying); Binder.restoreCallingIdentity(origId); } else { Slog.w(TAG, "Done executing unknown service from pid " @@ -1698,10 +1706,11 @@ public final class ActiveServices { } } - private void serviceDoneExecutingLocked(ServiceRecord r, boolean inStopping) { + private void serviceDoneExecutingLocked(ServiceRecord r, boolean inDestroying, + boolean finishing) { if (DEBUG_SERVICE) Slog.v(TAG, "<<< DONE EXECUTING " + r + ": nesting=" + r.executeNesting - + ", inStopping=" + inStopping + ", app=" + r.app); + + ", inDestroying=" + inDestroying + ", app=" + r.app); else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG, "<<< DONE EXECUTING " + r.shortName); r.executeNesting--; if (r.executeNesting <= 0) { @@ -1723,10 +1732,10 @@ public final class ActiveServices { } } } - if (inStopping) { + if (inDestroying) { if (DEBUG_SERVICE) Slog.v(TAG, - "doneExecuting remove stopping " + r); - mStoppingServices.remove(r); + "doneExecuting remove destroying " + r); + mDestroyingServices.remove(r); r.bindings.clear(); } mAm.updateOomAdjLocked(r.app); @@ -1735,8 +1744,8 @@ public final class ActiveServices { if (r.tracker != null) { r.tracker.setExecuting(false, mAm.mProcessStats.getMemFactorLocked(), SystemClock.uptimeMillis()); - if (inStopping) { - r.tracker.makeInactive(); + if (finishing) { + r.tracker.clearCurrentOwner(r); r.tracker = null; } } @@ -1839,7 +1848,7 @@ public final class ActiveServices { } } } else { - ServiceMap smap = mServiceMap.valueAt(userId); + ServiceMap smap = mServiceMap.get(userId); if (smap != null) { ArrayMap<ComponentName, ServiceRecord> items = smap.mServicesByName; didSomething = collectForceStopServicesLocked(name, userId, evenPersistent, @@ -1931,12 +1940,9 @@ public final class ActiveServices { sr.app = null; sr.isolatedProc = null; sr.executeNesting = 0; - if (sr.tracker != null) { - sr.tracker.setExecuting(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); - } - if (mStoppingServices.remove(sr)) { - if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove stopping " + sr); + sr.forceClearTracker(); + if (mDestroyingServices.remove(sr)) { + if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr); } final int numClients = sr.bindings.size(); @@ -1984,13 +1990,14 @@ public final class ActiveServices { } // Make sure we have no more records on the stopping list. - int i = mStoppingServices.size(); + int i = mDestroyingServices.size(); while (i > 0) { i--; - ServiceRecord sr = mStoppingServices.get(i); + ServiceRecord sr = mDestroyingServices.get(i); if (sr.app == app) { - mStoppingServices.remove(i); - if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove stopping " + sr); + sr.forceClearTracker(); + mDestroyingServices.remove(i); + if (DEBUG_SERVICE) Slog.v(TAG, "killServices remove destroying " + sr); } } @@ -2340,10 +2347,10 @@ public final class ActiveServices { needSep = true; } - if (mStoppingServices.size() > 0) { + if (mDestroyingServices.size() > 0) { boolean printed = false; - for (int i=0; i<mStoppingServices.size(); i++) { - ServiceRecord r = mStoppingServices.get(i); + for (int i=0; i< mDestroyingServices.size(); i++) { + ServiceRecord r = mDestroyingServices.get(i); if (!matcher.match(r, r.name)) { continue; } @@ -2354,10 +2361,10 @@ public final class ActiveServices { if (!printed) { if (needSep) pw.println(); needSep = true; - pw.println(" Stopping services:"); + pw.println(" Destroying services:"); printed = true; } - pw.print(" * Stopping "); pw.println(r); + pw.print(" * Destroy "); pw.println(r); r.dump(pw, " "); } needSep = true; diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 759ec7612f80..4e7060be443c 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -235,7 +235,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final boolean DEBUG_USER_LEAVING = localLOGV || false; static final boolean DEBUG_VISBILITY = localLOGV || false; static final boolean DEBUG_PSS = localLOGV || false; - static final boolean DEBUG_LOCKSCREEN = localLOGV || true; + static final boolean DEBUG_LOCKSCREEN = localLOGV || false; static final boolean VALIDATE_TOKENS = true; static final boolean SHOW_ACTIVITY_START_TIME = true; @@ -2051,7 +2051,7 @@ public final class ActivityManagerService extends ActivityManagerNative // The activity manager only throws security exceptions, so let's // log all others. if (!(e instanceof SecurityException)) { - Slog.e(TAG, "Activity Manager Crash", e); + Slog.wtf(TAG, "Activity Manager Crash", e); } throw e; } @@ -7827,6 +7827,31 @@ public final class ActivityManagerService extends ActivityManagerNative } } + @Override + public void appNotRespondingViaProvider(IBinder connection) { + enforceCallingPermission( + android.Manifest.permission.REMOVE_TASKS, "appNotRespondingViaProvider()"); + + final ContentProviderConnection conn = (ContentProviderConnection) connection; + if (conn == null) { + Slog.w(TAG, "ContentProviderConnection is null"); + return; + } + + final ProcessRecord host = conn.provider.proc; + if (host == null) { + Slog.w(TAG, "Failed to find hosting ProcessRecord"); + return; + } + + final long token = Binder.clearCallingIdentity(); + try { + appNotResponding(host, null, null, false, "ContentProvider not responding"); + } finally { + Binder.restoreCallingIdentity(token); + } + } + public static final void installSystemProviders() { List<ProviderInfo> providers; synchronized (mSelf) { diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index 4d669461d35d..28c87d1e5ea6 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -978,7 +978,7 @@ final class ActivityStack { */ final boolean ensureActivitiesVisibleLocked(ActivityRecord top, ActivityRecord starting, String onlyThisProcess, int configChanges, boolean forceHomeShown) { - if (DEBUG_VISBILITY) Slog.v( + if (true || DEBUG_VISBILITY) Slog.v( TAG, "ensureActivitiesVisible behind " + top + " configChanges=0x" + Integer.toHexString(configChanges)); @@ -1034,7 +1034,7 @@ final class ActivityStack { r.startFreezingScreenLocked(r.app, configChanges); } if (!r.visible) { - if (DEBUG_VISBILITY) Slog.v( + if (true || DEBUG_VISBILITY) Slog.v( TAG, "Starting and making visible: " + r); mWindowManager.setAppVisibility(r.appToken, true); } @@ -1056,7 +1056,7 @@ final class ActivityStack { if (r.state != ActivityState.RESUMED && r != starting) { // If this activity is paused, tell it // to now show its window. - if (DEBUG_VISBILITY) Slog.v( + if (true || DEBUG_VISBILITY) Slog.v( TAG, "Making visible and scheduling visibility: " + r); try { if (mTranslucentActivityWaiting != null) { @@ -1110,7 +1110,7 @@ final class ActivityStack { // Now for any activities that aren't visible to the user, make // sure they no longer are keeping the screen frozen. if (r.visible) { - if (DEBUG_VISBILITY) Slog.v(TAG, "Making invisible: " + r); + if (true || DEBUG_VISBILITY) Slog.v(TAG, "Making invisible: " + r); r.visible = false; try { mWindowManager.setAppVisibility(r.appToken, false); @@ -2367,7 +2367,7 @@ final class ActivityStack { if (mResumedActivity == r) { boolean endTask = index <= 0; - if (DEBUG_TRANSITION) Slog.v(TAG, + if (DEBUG_VISBILITY || DEBUG_TRANSITION) Slog.v(TAG, "Prepare close transition: finishing " + r); mWindowManager.prepareAppTransition(endTask ? AppTransition.TRANSIT_TASK_CLOSE @@ -3438,23 +3438,22 @@ final class ActivityStack { // Determine if the top task is exiting and should return to home. Do this before it gets // removed in removeHistoryRecordsForAppsLocked. boolean launchHomeNext = false; - int top = mTaskHistory.size() - 1; - while (top >= 0) { - final TaskRecord topTask = mTaskHistory.get(top); - if (topTask.mActivities.isEmpty()) { - // Not possible, but just in case. - --top; + TaskRecord topTask = mTaskHistory.get(mTaskHistory.size() - 1); + ArrayList<ActivityRecord> activities = topTask.mActivities; + int activityNdx; + for (activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { + ActivityRecord r = activities.get(activityNdx); + if (r.finishing) { continue; } - ActivityRecord r = topTask.topRunningActivityLocked(null); - if (r != null) { - // r will be launched next. + if (r.app != app) { + // This is the dying activity. break; } - // There is an activity in topTask that is finishing. If topTask belongs to the app - // return to home depending on the task flag. + } + if (activityNdx < 0) { + // All activities in task belong to app. Set launchHomeNext to task's value. launchHomeNext = topTask.mOnTopOfHome; - break; } removeHistoryRecordsForAppLocked(app); diff --git a/services/java/com/android/server/am/ActivityStackSupervisor.java b/services/java/com/android/server/am/ActivityStackSupervisor.java index f71870633fdc..2b69a4e16978 100644 --- a/services/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/java/com/android/server/am/ActivityStackSupervisor.java @@ -884,6 +884,7 @@ public final class ActivityStackSupervisor { throws RemoteException { r.startFreezingScreenLocked(app, 0); + if (true) Slog.d(TAG, "realStartActivity: setting app visibility true"); mWindowManager.setAppVisibility(r.appToken, true); // schedule launch ticks to collect information about slow apps. @@ -1932,7 +1933,7 @@ public final class ActivityStackSupervisor { for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { final ActivityStack stack = mStacks.get(stackNdx); // Only update launchHomeTaskNext for the focused stack. - launchHomeTaskNext |= (stack == focusedStack && stack.handleAppDiedLocked(app)); + launchHomeTaskNext |= (stack.handleAppDiedLocked(app) && stack == focusedStack); } if (!restarting) { @@ -2299,7 +2300,7 @@ public final class ActivityStackSupervisor { final boolean nowVisible = allResumedActivitiesVisible(); for (int i=0; i<N; i++) { ActivityRecord s = mStoppingActivities.get(i); - if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + if (true || localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + nowVisible + " waitingVisible=" + s.waitingVisible + " finishing=" + s.finishing); if (s.waitingVisible && nowVisible) { diff --git a/services/java/com/android/server/am/AppErrorDialog.java b/services/java/com/android/server/am/AppErrorDialog.java index bfc86b070250..fffa75e7069e 100644 --- a/services/java/com/android/server/am/AppErrorDialog.java +++ b/services/java/com/android/server/am/AppErrorDialog.java @@ -16,7 +16,7 @@ package com.android.server.am; -import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR; import android.content.Context; import android.content.DialogInterface; @@ -72,7 +72,7 @@ final class AppErrorDialog extends BaseErrorDialog { } setTitle(res.getText(com.android.internal.R.string.aerr_title)); - getWindow().addFlags(FLAG_SYSTEM_ERROR); + getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR); WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.setTitle("Application Error: " + app.info.processName); attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; diff --git a/services/java/com/android/server/am/AppNotRespondingDialog.java b/services/java/com/android/server/am/AppNotRespondingDialog.java index d0a044179f0e..4de272dcd632 100644 --- a/services/java/com/android/server/am/AppNotRespondingDialog.java +++ b/services/java/com/android/server/am/AppNotRespondingDialog.java @@ -16,7 +16,7 @@ package com.android.server.am; -import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR; import android.content.ActivityNotFoundException; import android.content.Context; @@ -94,7 +94,7 @@ final class AppNotRespondingDialog extends BaseErrorDialog { if (aboveSystem) { getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); } - getWindow().addFlags(FLAG_SYSTEM_ERROR); + getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR); WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.setTitle("Application Not Responding: " + app.info.processName); attrs.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; diff --git a/services/java/com/android/server/am/ProcessStatsService.java b/services/java/com/android/server/am/ProcessStatsService.java index 2c49bb991d9e..7dc006c467a1 100644 --- a/services/java/com/android/server/am/ProcessStatsService.java +++ b/services/java/com/android/server/am/ProcessStatsService.java @@ -357,7 +357,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { boolean sepScreenStates, int[] screenStates, boolean sepMemStates, int[] memStates, boolean sepProcStates, int[] procStates, long now, String reqPackage) { ArrayList<ProcessStats.ProcessState> procs = mProcessStats.collectProcessesLocked( - screenStates, memStates, procStates, procStates, now, reqPackage); + screenStates, memStates, procStates, procStates, now, reqPackage, false); if (procs.size() > 0) { if (header != null) { pw.println(header); @@ -519,7 +519,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { static private void dumpHelp(PrintWriter pw) { pw.println("Process stats (procstats) dump options:"); pw.println(" [--checkin|-c|--csv] [--csv-screen] [--csv-proc] [--csv-mem]"); - pw.println(" [--details] [--full-details] [--current] [--hours]"); + pw.println(" [--details] [--full-details] [--current] [--hours] [--active]"); pw.println(" [--commit] [--reset] [--clear] [--write] [-h] [<package.name>]"); pw.println(" --checkin: perform a checkin: print and delete old committed states."); pw.println(" --c: print only state in checkin format."); @@ -528,10 +528,11 @@ public final class ProcessStatsService extends IProcessStats.Stub { pw.println(" --csv-mem: norm, mod, low, crit."); pw.println(" --csv-proc: pers, top, fore, vis, precept, backup,"); pw.println(" service, home, prev, cached"); - pw.println(" --details: dump all execution details, not just summary."); - pw.println(" --full-details: dump only detail information, for all saved state."); + pw.println(" --details: dump per-package details, not just summary."); + pw.println(" --full-details: dump all timing and active state details."); pw.println(" --current: only dump current state."); pw.println(" --hours: aggregate over about N last hours."); + pw.println(" --active: only show currently active processes/services."); pw.println(" --commit: commit current stats to disk and reset to start new stats."); pw.println(" --reset: reset current stats, without committing."); pw.println(" --clear: clear all stats; does both --reset and deletes old stats."); @@ -562,6 +563,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { boolean dumpFullDetails = false; boolean dumpAll = false; int aggregateHours = 0; + boolean activeOnly = false; String reqPackage = null; boolean csvSepScreenStats = false; int[] csvScreenStats = new int[] { ProcessStats.ADJ_SCREEN_OFF, ProcessStats.ADJ_SCREEN_ON}; @@ -645,6 +647,9 @@ public final class ProcessStatsService extends IProcessStats.Stub { dumpHelp(pw); return; } + } else if ("--active".equals(arg)) { + activeOnly = true; + currentOnly = true; } else if ("--current".equals(arg)) { currentOnly = true; } else if ("--commit".equals(arg)) { @@ -779,9 +784,9 @@ public final class ProcessStatsService extends IProcessStats.Stub { stats.dumpCheckinLocked(pw, reqPackage); } else { if (dumpDetails || dumpFullDetails) { - stats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll); + stats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll, activeOnly); } else { - stats.dumpSummaryLocked(pw, reqPackage, now); + stats.dumpSummaryLocked(pw, reqPackage, now, activeOnly); } } return; @@ -826,9 +831,10 @@ public final class ProcessStatsService extends IProcessStats.Stub { // Always dump summary here, dumping all details is just too // much crud. if (dumpFullDetails) { - mProcessStats.dumpLocked(pw, reqPackage, now, false, false); + mProcessStats.dumpLocked(pw, reqPackage, now, false, false, + activeOnly); } else { - processStats.dumpSummaryLocked(pw, reqPackage, now); + processStats.dumpSummaryLocked(pw, reqPackage, now, activeOnly); } } if (isCheckin) { @@ -856,12 +862,13 @@ public final class ProcessStatsService extends IProcessStats.Stub { pw.println("CURRENT STATS:"); } if (dumpDetails || dumpFullDetails) { - mProcessStats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll); + mProcessStats.dumpLocked(pw, reqPackage, now, !dumpFullDetails, dumpAll, + activeOnly); if (dumpAll) { pw.print(" mFile="); pw.println(mFile.getBaseFile()); } } else { - mProcessStats.dumpSummaryLocked(pw, reqPackage, now); + mProcessStats.dumpSummaryLocked(pw, reqPackage, now, activeOnly); } } } diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java index ac14da982367..c47c1ac8da20 100644 --- a/services/java/com/android/server/am/ServiceRecord.java +++ b/services/java/com/android/server/am/ServiceRecord.java @@ -328,11 +328,23 @@ final class ServiceRecord extends Binder { if ((serviceInfo.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) { tracker = ams.mProcessStats.getServiceStateLocked(serviceInfo.packageName, serviceInfo.applicationInfo.uid, serviceInfo.processName, serviceInfo.name); - tracker.makeActive(); + tracker.applyNewOwner(this); } return tracker; } + public void forceClearTracker() { + if (tracker != null) { + int memFactor = ams.mProcessStats.getMemFactorLocked(); + long now = SystemClock.uptimeMillis(); + tracker.setStarted(false, memFactor, now); + tracker.setBound(false, memFactor, now); + tracker.setExecuting(false, memFactor, now); + tracker.clearCurrentOwner(this); + tracker = null; + } + } + public AppBindRecord retrieveAppBindingLocked(Intent intent, ProcessRecord app) { Intent.FilterComparison filter = new Intent.FilterComparison(intent); diff --git a/services/java/com/android/server/am/StrictModeViolationDialog.java b/services/java/com/android/server/am/StrictModeViolationDialog.java index b6d0daad2753..5fee0d32b0a4 100644 --- a/services/java/com/android/server/am/StrictModeViolationDialog.java +++ b/services/java/com/android/server/am/StrictModeViolationDialog.java @@ -16,14 +16,13 @@ package com.android.server.am; -import static android.view.WindowManager.LayoutParams.FLAG_SYSTEM_ERROR; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; import android.os.Handler; import android.os.Message; -import android.util.Slog; final class StrictModeViolationDialog extends BaseErrorDialog { private final static String TAG = "StrictModeViolationDialog"; @@ -75,7 +74,7 @@ final class StrictModeViolationDialog extends BaseErrorDialog { } setTitle(res.getText(com.android.internal.R.string.aerr_title)); - getWindow().addFlags(FLAG_SYSTEM_ERROR); + getWindow().addFlags(PRIVATE_FLAG_SYSTEM_ERROR); getWindow().setTitle("Strict Mode Violation: " + app.info.processName); // After the timeout, pretend the user clicked the quit button diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java index 8cc5b4f69cd9..45797b2e4d96 100644 --- a/services/java/com/android/server/connectivity/Vpn.java +++ b/services/java/com/android/server/connectivity/Vpn.java @@ -1096,6 +1096,9 @@ public class Vpn extends BaseNetworkStateTracker { // Here is the last step and it must be done synchronously. synchronized (Vpn.this) { + // Set the start time + mConfig.startTime = SystemClock.elapsedRealtime(); + // Check if the thread is interrupted while we are waiting. checkpoint(false); diff --git a/services/java/com/android/server/content/ContentService.java b/services/java/com/android/server/content/ContentService.java index a3db457b4fbf..48b3259bfee1 100644 --- a/services/java/com/android/server/content/ContentService.java +++ b/services/java/com/android/server/content/ContentService.java @@ -144,7 +144,7 @@ public final class ContentService extends IContentService.Stub { // The content service only throws security exceptions, so let's // log all others. if (!(e instanceof SecurityException)) { - Log.e(TAG, "Content Service Crash", e); + Slog.wtf(TAG, "Content Service Crash", e); } throw e; } diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 8becbd518364..41a122b66a24 100755 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -1501,7 +1501,7 @@ public class PackageManagerService extends IPackageManager.Stub { return super.onTransact(code, data, reply, flags); } catch (RuntimeException e) { if (!(e instanceof SecurityException) && !(e instanceof IllegalArgumentException)) { - Slog.e(TAG, "Package Manager Crash", e); + Slog.wtf(TAG, "Package Manager Crash", e); } throw e; } diff --git a/services/java/com/android/server/power/PowerManagerService.java b/services/java/com/android/server/power/PowerManagerService.java index fe09a33b3d3b..2ccd21c54859 100644 --- a/services/java/com/android/server/power/PowerManagerService.java +++ b/services/java/com/android/server/power/PowerManagerService.java @@ -453,7 +453,8 @@ public final class PowerManagerService extends IPowerManager.Stub mDisplayPowerControllerCallbacks, mHandler); mWirelessChargerDetector = new WirelessChargerDetector(sensorManager, - createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector")); + createSuspendBlockerLocked("PowerManagerService.WirelessChargerDetector"), + mHandler); mSettingsObserver = new SettingsObserver(mHandler); mAttentionLight = mLightsService.getLight(LightsService.LIGHT_ID_ATTENTION); diff --git a/services/java/com/android/server/power/WirelessChargerDetector.java b/services/java/com/android/server/power/WirelessChargerDetector.java index 35920f79a0c4..38f5d7740842 100644 --- a/services/java/com/android/server/power/WirelessChargerDetector.java +++ b/services/java/com/android/server/power/WirelessChargerDetector.java @@ -21,8 +21,11 @@ import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.BatteryManager; +import android.os.Handler; +import android.os.Message; import android.os.SystemClock; import android.util.Slog; +import android.util.TimeUtils; import java.io.PrintWriter; @@ -70,12 +73,12 @@ final class WirelessChargerDetector { private static final String TAG = "WirelessChargerDetector"; private static final boolean DEBUG = false; - // Number of nanoseconds per millisecond. - private static final long NANOS_PER_MS = 1000000; - // The minimum amount of time to spend watching the sensor before making // a determination of whether movement occurred. - private static final long SETTLE_TIME_NANOS = 500 * NANOS_PER_MS; + private static final long SETTLE_TIME_MILLIS = 800; + + // The sensor sampling interval. + private static final int SAMPLING_INTERVAL_MILLIS = 50; // The minimum number of samples that must be collected. private static final int MIN_SAMPLES = 3; @@ -97,6 +100,7 @@ final class WirelessChargerDetector { private final SensorManager mSensorManager; private final SuspendBlocker mSuspendBlocker; + private final Handler mHandler; // The gravity sensor, or null if none. private Sensor mGravitySensor; @@ -116,6 +120,9 @@ final class WirelessChargerDetector { // The suspend blocker is held while this is the case. private boolean mDetectionInProgress; + // The time when detection was last performed. + private long mDetectionStartTime; + // True if the rest position should be updated if at rest. // Otherwise, the current rest position is simply checked and cleared if movement // is detected but no new rest position is stored. @@ -127,18 +134,17 @@ final class WirelessChargerDetector { // The number of samples collected that showed evidence of not being at rest. private int mMovingSamples; - // The time and value of the first sample that was collected. - private long mFirstSampleTime; + // The value of the first sample that was collected. private float mFirstSampleX, mFirstSampleY, mFirstSampleZ; - // The time and value of the last sample that was collected (for debugging only). - private long mLastSampleTime; + // The value of the last sample that was collected. private float mLastSampleX, mLastSampleY, mLastSampleZ; public WirelessChargerDetector(SensorManager sensorManager, - SuspendBlocker suspendBlocker) { + SuspendBlocker suspendBlocker, Handler handler) { mSensorManager = sensorManager; mSuspendBlocker = suspendBlocker; + mHandler = handler; mGravitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY); } @@ -152,13 +158,13 @@ final class WirelessChargerDetector { pw.println(" mAtRest=" + mAtRest); pw.println(" mRestX=" + mRestX + ", mRestY=" + mRestY + ", mRestZ=" + mRestZ); pw.println(" mDetectionInProgress=" + mDetectionInProgress); + pw.println(" mDetectionStartTime=" + (mDetectionStartTime == 0 ? "0 (never)" + : TimeUtils.formatUptime(mDetectionStartTime))); pw.println(" mMustUpdateRestPosition=" + mMustUpdateRestPosition); pw.println(" mTotalSamples=" + mTotalSamples); pw.println(" mMovingSamples=" + mMovingSamples); - pw.println(" mFirstSampleTime=" + mFirstSampleTime); pw.println(" mFirstSampleX=" + mFirstSampleX + ", mFirstSampleY=" + mFirstSampleY + ", mFirstSampleZ=" + mFirstSampleZ); - pw.println(" mLastSampleTime=" + mLastSampleTime); pw.println(" mLastSampleX=" + mLastSampleX + ", mLastSampleY=" + mLastSampleY + ", mLastSampleZ=" + mLastSampleZ); } @@ -217,22 +223,56 @@ final class WirelessChargerDetector { private void startDetectionLocked() { if (!mDetectionInProgress && mGravitySensor != null) { if (mSensorManager.registerListener(mListener, mGravitySensor, - SensorManager.SENSOR_DELAY_UI)) { + SAMPLING_INTERVAL_MILLIS * 1000)) { mSuspendBlocker.acquire(); mDetectionInProgress = true; + mDetectionStartTime = SystemClock.uptimeMillis(); mTotalSamples = 0; mMovingSamples = 0; + + Message msg = Message.obtain(mHandler, mSensorTimeout); + msg.setAsynchronous(true); + mHandler.sendMessageDelayed(msg, SETTLE_TIME_MILLIS); } } } - private void processSample(long timeNanos, float x, float y, float z) { - synchronized (mLock) { - if (!mDetectionInProgress) { - return; + private void finishDetectionLocked() { + if (mDetectionInProgress) { + mSensorManager.unregisterListener(mListener); + mHandler.removeCallbacks(mSensorTimeout); + + if (mMustUpdateRestPosition) { + clearAtRestLocked(); + if (mTotalSamples < MIN_SAMPLES) { + Slog.w(TAG, "Wireless charger detector is broken. Only received " + + mTotalSamples + " samples from the gravity sensor but we " + + "need at least " + MIN_SAMPLES + " and we expect to see " + + "about " + SETTLE_TIME_MILLIS / SAMPLING_INTERVAL_MILLIS + + " on average."); + } else if (mMovingSamples == 0) { + mAtRest = true; + mRestX = mLastSampleX; + mRestY = mLastSampleY; + mRestZ = mLastSampleZ; + } + mMustUpdateRestPosition = false; } - mLastSampleTime = timeNanos; + if (DEBUG) { + Slog.d(TAG, "New state: mAtRest=" + mAtRest + + ", mRestX=" + mRestX + ", mRestY=" + mRestY + ", mRestZ=" + mRestZ + + ", mTotalSamples=" + mTotalSamples + + ", mMovingSamples=" + mMovingSamples); + } + + mDetectionInProgress = false; + mSuspendBlocker.release(); + } + } + + private void processSampleLocked(float x, float y, float z) { + if (mDetectionInProgress) { mLastSampleX = x; mLastSampleY = y; mLastSampleZ = z; @@ -240,7 +280,6 @@ final class WirelessChargerDetector { mTotalSamples += 1; if (mTotalSamples == 1) { // Save information about the first sample collected. - mFirstSampleTime = timeNanos; mFirstSampleX = x; mFirstSampleY = y; mFirstSampleZ = z; @@ -260,32 +299,6 @@ final class WirelessChargerDetector { } clearAtRestLocked(); } - - // Save the result when done. - if (timeNanos - mFirstSampleTime >= SETTLE_TIME_NANOS - && mTotalSamples >= MIN_SAMPLES) { - mSensorManager.unregisterListener(mListener); - if (mMustUpdateRestPosition) { - if (mMovingSamples == 0) { - mAtRest = true; - mRestX = x; - mRestY = y; - mRestZ = z; - } else { - clearAtRestLocked(); - } - mMustUpdateRestPosition = false; - } - mDetectionInProgress = false; - mSuspendBlocker.release(); - - if (DEBUG) { - Slog.d(TAG, "New state: mAtRest=" + mAtRest - + ", mRestX=" + mRestX + ", mRestY=" + mRestY + ", mRestZ=" + mRestZ - + ", mTotalSamples=" + mTotalSamples - + ", mMovingSamples=" + mMovingSamples); - } - } } } @@ -323,14 +336,22 @@ final class WirelessChargerDetector { private final SensorEventListener mListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { - // We use SystemClock.elapsedRealtimeNanos() instead of event.timestamp because - // on some devices the sensor HAL may produce timestamps that are not monotonic. - processSample(SystemClock.elapsedRealtimeNanos(), - event.values[0], event.values[1], event.values[2]); + synchronized (mLock) { + processSampleLocked(event.values[0], event.values[1], event.values[2]); + } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; + + private final Runnable mSensorTimeout = new Runnable() { + @Override + public void run() { + synchronized (mLock) { + finishDetectionLocked(); + } + } + }; } diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index bc70fe30c554..3b0ee24faa43 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -134,6 +134,11 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { } if (service != null) { service.onPrintJobQueued(printJob); + } else { + // The service for the job is no longer enabled, so just + // fail the job with the appropriate message. + mSpooler.setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED, + mContext.getString(R.string.reason_service_unavailable)); } } @@ -779,7 +784,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks { for (int i = 0; i < printJobCount; i++) { PrintJobInfo printJob = printJobs.get(i); mSpooler.setPrintJobState(printJob.getId(), PrintJobInfo.STATE_FAILED, - mContext.getString(R.string.reason_unknown)); + mContext.getString(R.string.reason_service_unavailable)); } } finally { Binder.restoreCallingIdentity(identity); diff --git a/services/java/com/android/server/wm/Session.java b/services/java/com/android/server/wm/Session.java index 1d95c44c8b15..87cabc9a510b 100644 --- a/services/java/com/android/server/wm/Session.java +++ b/services/java/com/android/server/wm/Session.java @@ -126,7 +126,7 @@ final class Session extends IWindowSession.Stub } catch (RuntimeException e) { // Log all 'real' exceptions thrown to the caller if (!(e instanceof SecurityException)) { - Slog.e(WindowManagerService.TAG, "Window Session Crash", e); + Slog.wtf(WindowManagerService.TAG, "Window Session Crash", e); } throw e; } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 80c50cc2b2ff..e625caea25e5 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -255,6 +255,9 @@ public class WindowManagerService extends IWindowManager.Stub /** Amount of time (in milliseconds) to delay before declaring a window freeze timeout. */ static final int WINDOW_FREEZE_TIMEOUT_DURATION = 2000; + /** Amount of time (in milliseconds) to delay before declaring a starting window leaked. */ + static final int STARTING_WINDOW_TIMEOUT_DURATION = 10000; + /** * If true, the window manager will do its own custom freezing and general * management of the screen during rotation. @@ -810,7 +813,7 @@ public class WindowManagerService extends IWindowManager.Stub // The window manager only throws security exceptions, so let's // log all others. if (!(e instanceof SecurityException)) { - Log.wtf(TAG, "Window Manager Crash", e); + Slog.wtf(TAG, "Window Manager Crash", e); } throw e; } @@ -2256,6 +2259,8 @@ public class WindowManagerService extends IWindowManager.Stub token.appWindowToken.startingWindow = win; if (DEBUG_STARTING_WINDOW) Slog.v (TAG, "addWindow: " + token.appWindowToken + " startingWindow=" + win); + Message m = mH.obtainMessage(H.REMOVE_STARTING_TIMEOUT, token.appWindowToken); + mH.sendMessageDelayed(m, STARTING_WINDOW_TIMEOUT_DURATION); } boolean imMayMove = true; @@ -2356,6 +2361,10 @@ public class WindowManagerService extends IWindowManager.Stub } public void removeWindowLocked(Session session, WindowState win) { + if (win.mAttrs.type == TYPE_APPLICATION_STARTING) { + if (DEBUG_STARTING_WINDOW) Slog.d(TAG, "Starting window removed " + win); + removeStartingWindowTimeout(win.mAppToken); + } if (localLOGV || DEBUG_FOCUS || DEBUG_FOCUS_LIGHT && win==mCurrentFocus) Slog.v( TAG, "Remove " + win + " client=" @@ -2498,6 +2507,7 @@ public class WindowManagerService extends IWindowManager.Stub if (atoken != null) { if (atoken.startingWindow == win) { if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Nulling startingWindow " + win); + removeStartingWindowTimeout(atoken); atoken.startingWindow = null; } else if (atoken.allAppWindows.size() == 0 && atoken.startingData != null) { // If this is the last window and we had requested a starting @@ -2507,12 +2517,7 @@ public class WindowManagerService extends IWindowManager.Stub } else if (atoken.allAppWindows.size() == 1 && atoken.startingView != null) { // If this is the last window except for a starting transition // window, we need to get rid of the starting transition. - if (DEBUG_STARTING_WINDOW) { - Slog.v(TAG, "Schedule remove starting " + token - + ": no more real windows"); - } - Message m = mH.obtainMessage(H.REMOVE_STARTING, atoken); - mH.sendMessage(m); + scheduleRemoveStartingWindow(atoken); } } @@ -2788,7 +2793,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": viewVisibility=" + viewVisibility + " req=" + requestedWidth + "x" + requestedHeight + " " + win.mAttrs); - win.mEnforceSizeCompat = (win.mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0; + win.mEnforceSizeCompat = (win.mAttrs.flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0; if ((attrChanges & WindowManager.LayoutParams.ALPHA_CHANGED) != 0) { winAnimator.mAlpha = attrs.alpha; @@ -3374,6 +3379,18 @@ public class WindowManagerService extends IWindowManager.Stub Binder.restoreCallingIdentity(origId); } + private Task createTask(int taskId, int stackId, int userId, AppWindowToken atoken) { + final TaskStack stack = mStackIdToStack.get(stackId); + if (stack == null) { + throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId); + } + Task task = new Task(atoken, stack, userId); + stack.addTask(task, true); + stack.getDisplayContent().moveStack(stack, true); + mTaskIdToTask.put(taskId, task); + return task; + } + @Override public void addAppToken(int addPos, IApplicationToken token, int taskId, int stackId, int requestedOrientation, boolean fullscreen, boolean showWhenLocked, int userId) { @@ -3413,14 +3430,7 @@ public class WindowManagerService extends IWindowManager.Stub Task task = mTaskIdToTask.get(taskId); if (task == null) { - TaskStack stack = mStackIdToStack.get(stackId); - if (stack == null) { - throw new IllegalArgumentException("addAppToken: invalid stackId=" + stackId); - } - task = new Task(atoken, stack, userId); - stack.addTask(task, true); - stack.getDisplayContent().moveStack(stack, true); - mTaskIdToTask.put(taskId, task); + task = createTask(taskId, stackId, userId, atoken); } else { task.addAppToken(addPos, atoken); } @@ -3454,8 +3464,7 @@ public class WindowManagerService extends IWindowManager.Stub atoken.groupId = groupId; Task newTask = mTaskIdToTask.get(groupId); if (newTask == null) { - throw new IllegalStateException("setAppGroupId: groupId=" + groupId - + " does not exist"); + newTask = createTask(groupId, oldTask.mStack.mStackId, oldTask.mUserId, atoken); } newTask.mAppTokens.add(atoken); } @@ -3964,6 +3973,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_WINDOW_MOVEMENT || DEBUG_ADD_REMOVE || DEBUG_STARTING_WINDOW) { Slog.v(TAG, "Removing starting window: " + startingWindow); } + removeStartingWindowTimeout(ttoken); startingWindow.getWindowList().remove(startingWindow); mWindowsChanged = true; if (DEBUG_ADD_REMOVE) Slog.v(TAG, @@ -4527,14 +4537,29 @@ public class WindowManagerService extends IWindowManager.Stub } Binder.restoreCallingIdentity(origId); - if (startingToken != null) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Schedule remove starting " - + startingToken + ": app token removed"); - Message m = mH.obtainMessage(H.REMOVE_STARTING, startingToken); - mH.sendMessage(m); + // Will only remove if startingToken non null. + scheduleRemoveStartingWindow(startingToken); + } + + void removeStartingWindowTimeout(AppWindowToken wtoken) { + if (wtoken != null) { + if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) + + ": Remove starting window timeout " + wtoken + (wtoken != null ? + " startingWindow=" + wtoken.startingWindow : "")); + mH.removeMessages(H.REMOVE_STARTING_TIMEOUT, wtoken); } } + void scheduleRemoveStartingWindow(AppWindowToken wtoken) { + if (wtoken != null && wtoken.startingWindow != null) { + if (DEBUG_STARTING_WINDOW) Slog.v(TAG, Debug.getCallers(1) + + ": Schedule remove starting " + wtoken + (wtoken != null ? + " startingWindow=" + wtoken.startingWindow : "")); + removeStartingWindowTimeout(wtoken); + Message m = mH.obtainMessage(H.REMOVE_STARTING, wtoken); + mH.sendMessage(m); + } + } private boolean tmpRemoveAppWindowsLocked(WindowToken token) { final int NW = token.windows.size(); if (NW > 0) { @@ -4765,6 +4790,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized(mWindowMap) { Task task = mTaskIdToTask.get(taskId); if (task == null) { + // Normal behavior, addAppToken will be called next and task will be created. return; } final TaskStack stack = task.mStack; @@ -7053,6 +7079,8 @@ public class WindowManagerService extends IWindowManager.Stub public static final int TAP_OUTSIDE_STACK = 31; public static final int NOTIFY_ACTIVITY_DRAWN = 32; + public static final int REMOVE_STARTING_TIMEOUT = 33; + @Override public void handleMessage(Message msg) { if (DEBUG_WINDOW_TRACE) { @@ -7151,6 +7179,7 @@ public class WindowManagerService extends IWindowManager.Stub "Aborted starting " + wtoken + ": removed=" + wtoken.removed + " startingData=" + wtoken.startingData); + removeStartingWindowTimeout(wtoken); wtoken.startingWindow = null; wtoken.startingData = null; abort = true; @@ -7175,6 +7204,11 @@ public class WindowManagerService extends IWindowManager.Stub } } break; + case REMOVE_STARTING_TIMEOUT: { + final AppWindowToken wtoken = (AppWindowToken)msg.obj; + Slog.e(TAG, "Starting window " + wtoken + " timed out"); + // Fall through. + } case REMOVE_STARTING: { final AppWindowToken wtoken = (AppWindowToken)msg.obj; IBinder token = null; @@ -7889,11 +7923,8 @@ public class WindowManagerService extends IWindowManager.Stub } final void rebuildAppWindowListLocked() { - final int numDisplays = mDisplayContents.size(); - for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { - final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx); - rebuildAppWindowListLocked(displayContent); - } + // TODO: Multidisplay, when ActivityStacks and tasks exist on more than one display. + rebuildAppWindowListLocked(getDefaultDisplayContentLocked()); } private void rebuildAppWindowListLocked(final DisplayContent displayContent) { @@ -9676,6 +9707,7 @@ public class WindowManagerService extends IWindowManager.Stub winAnimator.mSurfaceShown = false; winAnimator.mSurfaceControl = null; winAnimator.mWin.mHasSurface = false; + scheduleRemoveStartingWindow(winAnimator.mWin.mAppToken); } try { diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 64b5a09c5ea7..d56e2254d724 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -20,7 +20,7 @@ import static com.android.server.wm.WindowManagerService.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerService.DEBUG_LAYOUT; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; -import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD; @@ -332,7 +332,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { mContext = mService.mContext; DeathRecipient deathRecipient = new DeathRecipient(); mSeq = seq; - mEnforceSizeCompat = (mAttrs.flags & FLAG_COMPATIBLE_WINDOW) != 0; + mEnforceSizeCompat = (mAttrs.flags & PRIVATE_FLAG_COMPATIBLE_WINDOW) != 0; if (WindowManagerService.localLOGV) Slog.v( TAG, "Window " + this + " client=" + c.asBinder() + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a); |