diff options
172 files changed, 3529 insertions, 863 deletions
diff --git a/Android.mk b/Android.mk index 745ce431815b..d813c9190e62 100644 --- a/Android.mk +++ b/Android.mk @@ -860,6 +860,7 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS := \ -since $(SRC_API_DIR)/22.txt 22 \ -since $(SRC_API_DIR)/23.txt 23 \ -since $(SRC_API_DIR)/24.txt 24 \ + -since $(SRC_API_DIR)/25.txt 25 \ -werror -hide 111 -hide 113 \ -overview $(LOCAL_PATH)/core/java/overview.html diff --git a/core/java/android/app/ResourcesManager.java b/core/java/android/app/ResourcesManager.java index d2e032721022..5cc064e5d177 100644 --- a/core/java/android/app/ResourcesManager.java +++ b/core/java/android/app/ResourcesManager.java @@ -839,19 +839,22 @@ public class ResourcesManager { tmpConfig = new Configuration(); } tmpConfig.setTo(config); + + // Get new DisplayMetrics based on the DisplayAdjustments given + // to the ResourcesImpl. Update a copy if the CompatibilityInfo + // changed, because the ResourcesImpl object will handle the + // update internally. + DisplayAdjustments daj = r.getDisplayAdjustments(); + if (compat != null) { + daj = new DisplayAdjustments(daj); + daj.setCompatibilityInfo(compat); + } + dm = getDisplayMetrics(displayId, daj); + if (!isDefaultDisplay) { - // Get new DisplayMetrics based on the DisplayAdjustments given - // to the ResourcesImpl. Udate a copy if the CompatibilityInfo - // changed, because the ResourcesImpl object will handle the - // update internally. - DisplayAdjustments daj = r.getDisplayAdjustments(); - if (compat != null) { - daj = new DisplayAdjustments(daj); - daj.setCompatibilityInfo(compat); - } - dm = getDisplayMetrics(displayId, daj); applyNonDefaultDisplayMetricsToConfiguration(dm, tmpConfig); } + if (hasOverrideConfiguration) { tmpConfig.updateFrom(key.mOverrideConfiguration); } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index afdd43423c72..a2f9bdd2370d 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2358,18 +2358,23 @@ public class DevicePolicyManager { * <p>The calling device admin must be a device or profile owner. If it is not, * a {@link SecurityException} will be thrown. * + * <p>The calling device admin can verify the value it has set by calling + * {@link #getRequiredStrongAuthTimeout(ComponentName)} and passing in its instance. + * * <p>This method can be called on the {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param timeoutMs The new timeout, after which the user will have to unlock with strong - * authentication method. If the timeout is lower than 1 hour (minimum) or higher than - * 72 hours (default and maximum) an {@link IllegalArgumentException} is thrown. + * authentication method. A value of 0 means the admin is not participating in + * controlling the timeout. + * The minimum and maximum timeouts are platform-defined and are typically 1 hour and + * 72 hours, respectively. Though discouraged, the admin may choose to require strong + * auth at all times using {@link #KEYGUARD_DISABLE_FINGERPRINT} and/or + * {@link #KEYGUARD_DISABLE_TRUST_AGENTS}. * * @throws SecurityException if {@code admin} is not a device or profile owner. - * @throws IllegalArgumentException if the timeout is lower than 1 hour (minimum) or higher than - * 72 hours (default and maximum) * * @hide */ @@ -2395,7 +2400,7 @@ public class DevicePolicyManager { * * @param admin The name of the admin component to check, or {@code null} to aggregate * accross all participating admins. - * @return The timeout or default timeout if not configured + * @return The timeout or 0 if not configured for the provided admin. * * @hide */ diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index 3ba81c8689b9..bad632555c42 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -649,10 +649,11 @@ public abstract class BackupAgent extends ContextWrapper { File file = scanQueue.remove(0); String filePath; try { - // Ignore symlinks outright + // Ignore things that aren't "real" files or dirs StructStat stat = Os.lstat(file.getPath()); - if (OsConstants.S_ISLNK(stat.st_mode)) { - if (DEBUG) Log.i(TAG, "Symlink (skipping)!: " + file); + if (!OsConstants.S_ISREG(stat.st_mode) + && !OsConstants.S_ISDIR(stat.st_mode)) { + if (DEBUG) Log.i(TAG, "Not a file/dir (skipping)!: " + file); continue; } diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 246a752b3a5b..e71468e60e29 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -1498,6 +1498,36 @@ public final class BluetoothAdapter { } /** + * Gets the currently supported profiles by the adapter. + * + *<p> This can be used to check whether a profile is supported before attempting + * to connect to its respective proxy. + * + * @return a list of integers indicating the ids of supported profiles as defined in + * {@link BluetoothProfile}. + * @hide + */ + public List<Integer> getSupportedProfiles() { + final ArrayList<Integer> supportedProfiles = new ArrayList<Integer>(); + + try { + synchronized (mManagerCallback) { + if (mService != null) { + final long supportedProfilesBitMask = mService.getSupportedProfiles(); + + for (int i = 0; i <= BluetoothProfile.MAX_PROFILE_ID; i++) { + if ((supportedProfilesBitMask & (1 << i)) != 0) { + supportedProfiles.add(i); + } + } + } + } + } catch (RemoteException e) {Log.e(TAG, "getSupportedProfiles:", e);} + + return supportedProfiles; + } + + /** * Get the current connection state of the local Bluetooth adapter. * This can be used to check whether the local Bluetooth adapter is connected * to any profile of any other remote Bluetooth Device. @@ -2006,7 +2036,7 @@ public final class BluetoothAdapter { final private IBluetoothManagerCallback mManagerCallback = new IBluetoothManagerCallback.Stub() { public void onBluetoothServiceUp(IBluetooth bluetoothService) { - if (VDBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService); + if (DBG) Log.d(TAG, "onBluetoothServiceUp: " + bluetoothService); mServiceLock.writeLock().lock(); mService = bluetoothService; @@ -2028,7 +2058,7 @@ public final class BluetoothAdapter { } public void onBluetoothServiceDown() { - if (VDBG) Log.d(TAG, "onBluetoothServiceDown: " + mService); + if (DBG) Log.d(TAG, "onBluetoothServiceDown: " + mService); try { mServiceLock.writeLock().lock(); @@ -2056,7 +2086,7 @@ public final class BluetoothAdapter { } public void onBrEdrDown() { - if (VDBG) Log.i(TAG, "on QBrEdrDown: "); + if (DBG) Log.i(TAG, "onBrEdrDown:"); } }; diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index 552c8d3b0143..0eca4d670d3d 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -44,14 +44,18 @@ public final class BluetoothGatt implements BluetoothProfile { private IBluetoothGatt mService; private BluetoothGattCallback mCallback; private int mClientIf; - private boolean mAuthRetry = false; private BluetoothDevice mDevice; private boolean mAutoConnect; + private int mAuthRetryState; private int mConnState; private final Object mStateLock = new Object(); private Boolean mDeviceBusy = false; private int mTransport; + private static final int AUTH_RETRY_STATE_IDLE = 0; + private static final int AUTH_RETRY_STATE_NO_MITM = 1; + private static final int AUTH_RETRY_STATE_MITM = 2; + private static final int CONN_STATE_IDLE = 0; private static final int CONN_STATE_CONNECTING = 1; private static final int CONN_STATE_CONNECTED = 2; @@ -262,17 +266,19 @@ public final class BluetoothGatt implements BluetoothProfile { if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; - mService.readCharacteristic(mClientIf, address, handle, AUTHENTICATION_MITM); + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; + mService.readCharacteristic(mClientIf, address, handle, authReq); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = false; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; BluetoothGattCharacteristic characteristic = getCharacteristicById(mDevice, handle); if (characteristic == null) { @@ -311,19 +317,20 @@ public final class BluetoothGatt implements BluetoothProfile { if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; mService.writeCharacteristic(mClientIf, address, handle, - characteristic.getWriteType(), AUTHENTICATION_MITM, - characteristic.getValue()); + characteristic.getWriteType(), authReq, characteristic.getValue()); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = false; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; try { mCallback.onCharacteristicWrite(BluetoothGatt.this, characteristic, status); @@ -378,17 +385,19 @@ public final class BluetoothGatt implements BluetoothProfile { if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; - mService.readDescriptor(mClientIf, address, handle, AUTHENTICATION_MITM); + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; + mService.readDescriptor(mClientIf, address, handle, authReq); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = true; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; try { mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status); @@ -417,19 +426,21 @@ public final class BluetoothGatt implements BluetoothProfile { if ((status == GATT_INSUFFICIENT_AUTHENTICATION || status == GATT_INSUFFICIENT_ENCRYPTION) - && mAuthRetry == false) { + && (mAuthRetryState != AUTH_RETRY_STATE_MITM)) { try { - mAuthRetry = true; + final int authReq = (mAuthRetryState == AUTH_RETRY_STATE_IDLE) ? + AUTHENTICATION_NO_MITM : AUTHENTICATION_MITM; mService.writeDescriptor(mClientIf, address, handle, BluetoothGattCharacteristic.WRITE_TYPE_DEFAULT, - AUTHENTICATION_MITM, descriptor.getValue()); + authReq, descriptor.getValue()); + mAuthRetryState++; return; } catch (RemoteException e) { Log.e(TAG,"",e); } } - mAuthRetry = false; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; try { mCallback.onDescriptorWrite(BluetoothGatt.this, descriptor, status); @@ -503,6 +514,7 @@ public final class BluetoothGatt implements BluetoothProfile { mServices = new ArrayList<BluetoothGattService>(); mConnState = CONN_STATE_IDLE; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; } /** @@ -516,6 +528,7 @@ public final class BluetoothGatt implements BluetoothProfile { unregisterApp(); mConnState = CONN_STATE_CLOSED; + mAuthRetryState = AUTH_RETRY_STATE_IDLE; } /** diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java index eee66d193fe4..20d95ccc3835 100644 --- a/core/java/android/bluetooth/BluetoothProfile.java +++ b/core/java/android/bluetooth/BluetoothProfile.java @@ -137,6 +137,13 @@ public interface BluetoothProfile { public static final int PBAP_CLIENT = 17; /** + * Max profile ID. This value should be updated whenever a new profile is added to match + * the largest value assigned to a profile. + * @hide + */ + public static final int MAX_PROFILE_ID = 17; + + /** * Default priority for devices that we try to auto-connect to and * and allow incoming connections for the profile * @hide diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl index a42053963678..f28ab275e4c7 100644 --- a/core/java/android/bluetooth/IBluetooth.aidl +++ b/core/java/android/bluetooth/IBluetooth.aidl @@ -62,6 +62,7 @@ interface IBluetooth boolean cancelBondProcess(in BluetoothDevice device); boolean removeBond(in BluetoothDevice device); int getBondState(in BluetoothDevice device); + long getSupportedProfiles(); int getConnectionState(in BluetoothDevice device); String getRemoteName(in BluetoothDevice device); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index cf6880a981f4..c6aaa48ddad0 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -6573,7 +6573,7 @@ public class Intent implements Parcelable, Cloneable { */ public void removeUnsafeExtras() { if (mExtras != null) { - mExtras.filterValues(); + mExtras = mExtras.filterValues(); } } diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java index ed0ac5386176..a854b899a82a 100644 --- a/core/java/android/content/pm/ShortcutInfo.java +++ b/core/java/android/content/pm/ShortcutInfo.java @@ -46,7 +46,7 @@ import java.util.List; import java.util.Set; /** - * Represents a "launcher shortcut" that can be published via {@link ShortcutManager}. + * Represents a shortcut that can be published via {@link ShortcutManager}. * * @see ShortcutManager */ @@ -776,17 +776,17 @@ public final class ShortcutInfo implements Parcelable { * activity is published using * {@link ShortcutManager#addDynamicShortcuts(List)} or * {@link ShortcutManager#setDynamicShortcuts(List)}, - * the first main activity defined in the application's <code>AndroidManifest.xml</code> + * the first main activity defined in the app's <code>AndroidManifest.xml</code> * file is used. * * <li>Only "main" activities—ones that define the {@link Intent#ACTION_MAIN} * and {@link Intent#CATEGORY_LAUNCHER} intent filters—can be target * activities. * - * <li>By default, the first main activity defined in the application manifest is + * <li>By default, the first main activity defined in the app's manifest is * the target activity. * - * <li>A target activity must belong to the publisher application. + * <li>A target activity must belong to the publisher app. * </ul> * * @see ShortcutInfo#getActivity() @@ -802,7 +802,7 @@ public final class ShortcutInfo implements Parcelable { * * <p>Icons are not available on {@link ShortcutInfo} instances * returned by {@link ShortcutManager} or {@link LauncherApps}. The default launcher - * application can use {@link LauncherApps#getShortcutIconDrawable(ShortcutInfo, int)} + * app can use {@link LauncherApps#getShortcutIconDrawable(ShortcutInfo, int)} * or {@link LauncherApps#getShortcutBadgedIconDrawable(ShortcutInfo, int)} to fetch * shortcut icons. * @@ -933,8 +933,8 @@ public final class ShortcutInfo implements Parcelable { } /** - * Sets categories for a shortcut. Launcher applications may use this information to - * categorise shortcuts. + * Sets categories for a shortcut. Launcher apps may use this information to + * categorize shortcuts. * * @see #SHORTCUT_CATEGORY_CONVERSATION * @see ShortcutInfo#getCategories() @@ -953,9 +953,9 @@ public final class ShortcutInfo implements Parcelable { * {@link ShortcutManager#addDynamicShortcuts(List)} or * {@link ShortcutManager#setDynamicShortcuts(List)}. * - * <p>A shortcut can launch any intent that the publisher application has permission to + * <p>A shortcut can launch any intent that the publisher app has permission to * launch. For example, a shortcut can launch an unexported activity within the publisher - * application. A shortcut intent doesn't have to point at the target activity. + * app. A shortcut intent doesn't have to point at the target activity. * * <p>The given {@code intent} can contain extras, but these extras must contain values * of primitive types in order for the system to persist these values. @@ -970,7 +970,9 @@ public final class ShortcutInfo implements Parcelable { /** * Sets multiple intents instead of a single intent, in order to launch an activity with - * other activities in back stack. Use {@link TaskStackBuilder} to build intents. + * other activities in back stack. Use {@link TaskStackBuilder} to build intents. The + * last element in the list represents the only intent that doesn't place an activity on + * the back stack. * See the {@link ShortcutManager} javadoc for details. * * @see Builder#setIntent(Intent) @@ -1006,9 +1008,9 @@ public final class ShortcutInfo implements Parcelable { } /** - * Extras that application can set for any purpose. + * Extras that the app can set for any purpose. * - * <p>Applications can store arbitrary shortcut metadata in extras and retrieve the + * <p>Apps can store arbitrary shortcut metadata in extras and retrieve the * metadata later using {@link ShortcutInfo#getExtras()}. */ @NonNull @@ -1029,7 +1031,7 @@ public final class ShortcutInfo implements Parcelable { /** * Returns the ID of a shortcut. * - * <p>Shortcut IDs are unique within each publisher application and must be stable across + * <p>Shortcut IDs are unique within each publisher app and must be stable across * devices so that shortcuts will still be valid when restored on a different device. * See {@link ShortcutManager} for details. */ @@ -1039,7 +1041,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return the package name of the publisher application. + * Return the package name of the publisher app. */ @NonNull public String getPackage() { @@ -1050,7 +1052,7 @@ public final class ShortcutInfo implements Parcelable { * Return the target activity. * * <p>This has nothing to do with the activity that this shortcut will launch. - * Launcher applications should show the launcher icon for the returned activity alongside + * Launcher apps should show the launcher icon for the returned activity alongside * this shortcut. * * @see Builder#setActivity @@ -1102,7 +1104,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return the shorter description of a shortcut. + * Return the short description of a shortcut. * * @see Builder#setShortLabel(CharSequence) */ @@ -1117,7 +1119,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return the longer description of a shortcut. + * Return the long description of a shortcut. * * @see Builder#setLongLabel(CharSequence) */ @@ -1161,7 +1163,7 @@ public final class ShortcutInfo implements Parcelable { * Returns the intent that is executed when the user selects this shortcut. * If setIntents() was used, then return the last intent in the array. * - * <p>Launcher applications <b>cannot</b> see the intent. If a {@link ShortcutInfo} is + * <p>Launcher apps <b>cannot</b> see the intent. If a {@link ShortcutInfo} is * obtained via {@link LauncherApps}, then this method will always return null. * Launchers can only start a shortcut intent with {@link LauncherApps#startShortcut}. * @@ -1180,7 +1182,7 @@ public final class ShortcutInfo implements Parcelable { /** * Return the intent set with {@link Builder#setIntents(Intent[])}. * - * <p>Launcher applications <b>cannot</b> see the intents. If a {@link ShortcutInfo} is + * <p>Launcher apps <b>cannot</b> see the intents. If a {@link ShortcutInfo} is * obtained via {@link LauncherApps}, then this method will always return null. * Launchers can only start a shortcut intent with {@link LauncherApps#startShortcut}. * @@ -1219,15 +1221,15 @@ public final class ShortcutInfo implements Parcelable { /** * "Rank" of a shortcut, which is a non-negative, sequential value that's unique for each - * {@link #getActivity} for each of the two kinds, dynamic shortcuts and manifest shortcuts. + * {@link #getActivity} for each of the two types of shortcuts (static and dynamic). * - * <p>Because manifest shortcuts and dynamic shortcuts have overlapping ranks, - * when a launcher application shows shortcuts for an activity, it should first show - * the manifest shortcuts followed by the dynamic shortcuts. Within each of those categories, + * <p>Because static shortcuts and dynamic shortcuts have overlapping ranks, + * when a launcher app shows shortcuts for an activity, it should first show + * the static shortcuts, followed by the dynamic shortcuts. Within each of those categories, * shortcuts should be sorted by rank in ascending order. * - * <p>"Floating" shortcuts (i.e. shortcuts that are neither dynamic nor manifest) will all - * have rank 0, because there's no sorting for them. + * <p><em>Floating shortcuts</em>, or shortcuts that are neither static nor dynamic, will all + * have rank 0, because they aren't sorted. * * See the {@link ShortcutManager}'s class javadoc for details. * @@ -1274,7 +1276,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Extras that application can set to any purposes. + * Extras that the app can set for any purpose. * * @see Builder#setExtras(PersistableBundle) */ @@ -1339,12 +1341,13 @@ public final class ShortcutInfo implements Parcelable { } /** - * Return whether a shortcut is published from AndroidManifest.xml or not. If {@code true}, - * it's also {@link #isImmutable()}. + * Return whether a shortcut is static; that is, whether a shortcut is + * published from AndroidManifest.xml. If {@code true}, the shortcut is + * also {@link #isImmutable()}. * * <p>When an app is upgraded and a shortcut is no longer published from AndroidManifest.xml, - * this will be set to {@code false}. If the shortcut is not pinned, then it'll just disappear. - * However, if it's pinned, it will still be alive, and {@link #isEnabled()} will be + * this will be set to {@code false}. If the shortcut is not pinned, then it'll disappear. + * However, if it's pinned, it will still be visible, {@link #isEnabled()} will be * {@code false} and {@link #isImmutable()} will be {@code true}. */ public boolean isDeclaredInManifest() { @@ -1358,7 +1361,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * @return true if pinned but neither dynamic nor manifest. + * @return true if pinned but neither static nor dynamic. * @hide */ public boolean isFloating() { @@ -1374,9 +1377,10 @@ public final class ShortcutInfo implements Parcelable { * Return if a shortcut is immutable, in which case it cannot be modified with any of * {@link ShortcutManager} APIs. * - * <p>All manifest shortcuts are immutable. When a manifest shortcut is pinned and then - * disabled because the app is upgraded and its AndroidManifest.xml no longer publishes it, - * {@link #isDeclaredInManifest()} returns {@code false}, but it is still immutable. + * <p>All static shortcuts are immutable. When a static shortcut is pinned and is then + * disabled because it doesn't appear in AndroidManifest.xml for a newer version of the + * app, {@link #isDeclaredInManifest()} returns {@code false}, but the shortcut + * is still immutable. * * <p>All shortcuts originally published via the {@link ShortcutManager} APIs * are all mutable. @@ -1561,7 +1565,7 @@ public final class ShortcutInfo implements Parcelable { } /** - * Replaces the intent + * Replaces the intent. * * @throws IllegalArgumentException when extra is not compatible with {@link PersistableBundle}. * diff --git a/core/java/android/content/pm/ShortcutManager.java b/core/java/android/content/pm/ShortcutManager.java index 96ad67c6f3ab..a93870ece823 100644 --- a/core/java/android/content/pm/ShortcutManager.java +++ b/core/java/android/content/pm/ShortcutManager.java @@ -31,87 +31,90 @@ import com.android.internal.annotations.VisibleForTesting; import java.util.List; /** - * The ShortcutManager manages "launcher shortcuts" (or simply "shortcuts"). Shortcuts provide - * users - * with quick access to activities other than an application's main activity in the currently-active + * The ShortcutManager manages an app's <em>shortcuts</em>. Shortcuts provide users + * with quick access to activities other than an app's main activity in the currently-active * launcher. For example, - * an email application may publish the "compose new email" action, which will directly open the + * an email app may publish the "compose new email" action, which will directly open the * compose activity. The {@link ShortcutInfo} class contains information about each of the * shortcuts themselves. * - * <h3>Dynamic Shortcuts and Manifest Shortcuts</h3> + * <h3>Static Shortcuts and Dynamic Shortcuts</h3> * - * There are two ways to publish shortcuts: manifest shortcuts and dynamic shortcuts. + * <p> + * There are two ways to publish shortcuts: static shortcuts and dynamic shortcuts. * * <ul> - * <li>Manifest shortcuts are declared in a resource - * XML, which is referenced in the publisher application's <code>AndroidManifest.xml</code> file. - * Manifest shortcuts are published when an application is installed, - * and the details of these shortcuts change when an application is upgraded with an updated XML + * <li>Static shortcuts are declared in a resource + * XML file, which is referenced in the publisher app's <code>AndroidManifest.xml</code> file. + * Static shortcuts are published when an app is installed, + * and the details of these shortcuts change when an app is upgraded with an updated XML * file. - * Manifest shortcuts are immutable, and their + * Static shortcuts are immutable, and their * definitions, such as icons and labels, cannot be changed dynamically without upgrading the - * publisher application. + * publisher app. * - * <li>Dynamic shortcuts are published at runtime using the {@link ShortcutManager} APIs. - * Applications can publish, update, and remove dynamic shortcuts at runtime. + * <li>Dynamic shortcuts are published at runtime using this class's APIs. + * Apps can publish, update, and remove dynamic shortcuts at runtime. * </ul> * - * <p>Only "main" activities—activities that handle the {@code MAIN} action and the + * <p>Only main activities—activities that handle the {@code MAIN} action and the * {@code LAUNCHER} category—can have shortcuts. - * If an application has multiple main activities, these activities will have different sets + * If an app has multiple main activities, these activities have different sets * of shortcuts. * - * <p>Dynamic shortcuts and manifest shortcuts are shown in the currently active launcher when - * the user long-presses on an application launcher icon. The actual gesture may be different - * depending on the launcher application. + * <p>Static shortcuts and dynamic shortcuts are shown in the currently active launcher when + * the user long-presses on an app's launcher icon. + * + * <p class="note"><strong>Note: </strong>The actual gesture may be different + * depending on the launcher app. * * <p>Each launcher icon can have at most {@link #getMaxShortcutCountPerActivity()} number of - * dynamic and manifest shortcuts combined. + * static and dynamic shortcuts combined. * * * <h3>Pinning Shortcuts</h3> * - * Launcher applications allow users to "pin" shortcuts so they're easier to access. Both manifest + * <p> + * Launcher apps allow users to <em>pin</em> shortcuts so they're easier to access. Both static * and dynamic shortcuts can be pinned. * Pinned shortcuts <b>cannot</b> be removed by publisher - * applications; they're removed only when the user removes them, - * when the publisher application is uninstalled, or when the - * user performs the "clear data" action on the publisher application from the device's Settings - * application. + * apps; they're removed only when the user removes them, + * when the publisher app is uninstalled, or when the + * user performs the <strong>clear data</strong> action on the publisher app from the device's Settings + * app. * - * <p>However, the publisher application can <em>disable</em> pinned shortcuts so they cannot be + * <p>However, the publisher app can <em>disable</em> pinned shortcuts so they cannot be * started. See the following sections for details. * * * <h3>Updating and Disabling Shortcuts</h3> * * <p>When a dynamic shortcut is pinned, even when the publisher removes it as a dynamic shortcut, - * the pinned shortcut will still be visible and launchable. This allows an application to have + * the pinned shortcut will still be visible and launchable. This allows an app to have * more than {@link #getMaxShortcutCountPerActivity()} number of shortcuts. * * <p>For example, suppose {@link #getMaxShortcutCountPerActivity()} is 5: - * <ul> - * <li>A chat application publishes 5 dynamic shortcuts for the 5 most recent - * conversations, "c1" - "c5". + * <ol> + * <li>A chat app publishes 5 dynamic shortcuts for the 5 most recent + * conversations (c1, c2, ..., c5). * * <li>The user pins all 5 of the shortcuts. * - * <li>Later, the user has started 3 additional conversations ("c6", "c7", and "c8"), - * so the publisher application + * <li>Later, the user has started 3 additional conversations (c6, c7, and c8), + * so the publisher app * re-publishes its dynamic shortcuts. The new dynamic shortcut list is: - * "c4", "c5", "c6", "c7", and "c8". - * The publisher application has to remove "c1", "c2", and "c3" because it can't have more than + * c4, c5, ..., c8. + * The publisher app has to remove c1, c2, and c3 because it can't have more than * 5 dynamic shortcuts. * - * <li>However, even though "c1", "c2" and "c3" are no longer dynamic shortcuts, the pinned + * <li>However, even though c1, c2, and c3 are no longer dynamic shortcuts, the pinned * shortcuts for these conversations are still available and launchable. * * <li>At this point, the user can access a total of 8 shortcuts that link to activities in - * the publisher application, including the 3 pinned - * shortcuts, even though it's allowed to have at most 5 dynamic shortcuts. + * the publisher app, including the 3 pinned + * shortcuts, even though an app can have at most 5 dynamic shortcuts. * - * <li>The application can use {@link #updateShortcuts(List)} to update any of the existing + * <li>The app can use {@link #updateShortcuts(List)} to update <em>any</em> of the existing * 8 shortcuts, when, for example, the chat peers' icons have changed. * </ul> * The {@link #addDynamicShortcuts(List)} and {@link #setDynamicShortcuts(List)} methods @@ -121,104 +124,108 @@ import java.util.List; * lists of shortcuts to dynamic shortcuts. * * - * <h4>Disabling Manifest Shortcuts</h4> - * When an application is upgraded and the new version - * no longer uses a manifest shortcut that appeared in the previous version, this deprecated - * shortcut will no longer be published as a manifest shortcut. + * <h4>Disabling Static Shortcuts</h4> + * When an app is upgraded and the new version + * no longer uses a static shortcut that appeared in the previous version, this deprecated + * shortcut will no longer be published as a static shortcut. * * <p>If the deprecated shortcut is pinned, then the pinned shortcut will remain on the launcher, * but it will be disabled automatically. - * Note that, in this case, the pinned shortcut is no longer a manifest shortcut, but it's - * still <b>immutable</b> and cannot be updated using the {@link ShortcutManager} APIs. + * Note that, in this case, the pinned shortcut is no longer a static shortcut, but it's + * still <b>immutable</b>. Therefore, it cannot be updated using this class's APIs. * * * <h4>Disabling Dynamic Shortcuts</h4> * Sometimes pinned shortcuts become obsolete and may not be usable. For example, a pinned shortcut - * to a group chat will be unusable when the associated group chat is deleted. In cases like this, - * applications should use {@link #disableShortcuts(List)}, which will remove the specified dynamic - * shortcuts and also make any specified pinned shortcuts un-launchable. + * to a group chat becomes unusable when the associated group chat is deleted. In cases like this, + * apps should use {@link #disableShortcuts(List)}, which removes the specified dynamic + * shortcuts and also makes any specified pinned shortcuts un-launchable. * The {@link #disableShortcuts(List, CharSequence)} method can also be used to disabled shortcuts * and show users a custom error message when they attempt to launch the disabled shortcuts. * * - * <h3>Publishing Manifest Shortcuts</h3> + * <h3>Publishing Static Shortcuts</h3> * - * In order to add manifest shortcuts to your application, first add + * <p> + * In order to add static shortcuts to your app, first add * {@code <meta-data android:name="android.app.shortcuts" />} to your main activity in * AndroidManifest.xml: * <pre> - * <manifest xmlns:android="http://schemas.android.com/apk/res/android" - * package="com.example.myapplication"> - * <application . . .> - * <activity android:name="Main"> - * <intent-filter> - * <action android:name="android.intent.action.MAIN" /> - * <category android:name="android.intent.category.LAUNCHER" /> - * </intent-filter> - * <b><meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/></b> - * </activity> - * </application> - * </manifest> + *<manifest xmlns:android="http://schemas.android.com/apk/res/android" + * package="com.example.myapplication"> + * <application ... > + * <activity android:name="Main"> + * <intent-filter> + * <action android:name="android.intent.action.MAIN" /> + * <category android:name="android.intent.category.LAUNCHER" /> + * </intent-filter> + * <strong><meta-data android:name="android.app.shortcuts" + * android:resource="@xml/shortcuts" /></strong> + * </activity> + * </application> + *</manifest> * </pre> * - * Then, define your application's manifest shortcuts in the <code>res/xml/shortcuts.xml</code> + * Then, define your app's static shortcuts in the <code>res/xml/shortcuts.xml</code> * file: * <pre> - * <shortcuts xmlns:android="http://schemas.android.com/apk/res/android" > - * <shortcut - * android:shortcutId="compose" - * android:enabled="true" - * android:icon="@drawable/compose_icon" - * android:shortcutShortLabel="@string/compose_shortcut_short_label1" - * android:shortcutLongLabel="@string/compose_shortcut_long_label1" - * android:shortcutDisabledMessage="@string/compose_disabled_message1" - * > - * <intent - * android:action="android.intent.action.VIEW" - * android:targetPackage="com.example.myapplication" - * android:targetClass="com.example.myapplication.ComposeActivity" /> - * <!-- more intents can go here; see below --> - * <categories android:name="android.shortcut.conversation" /> - * </shortcut> - * <!-- more shortcuts can go here --> - * </shortcuts> + *<shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> + * <shortcut + * android:shortcutId="compose" + * android:enabled="true" + * android:icon="@drawable/compose_icon" + * android:shortcutShortLabel="@string/compose_shortcut_short_label1" + * android:shortcutLongLabel="@string/compose_shortcut_long_label1" + * android:shortcutDisabledMessage="@string/compose_disabled_message1"> + * <intent + * android:action="android.intent.action.VIEW" + * android:targetPackage="com.example.myapplication" + * android:targetClass="com.example.myapplication.ComposeActivity" /> + * <!-- If your shortcut is associated with multiple intents, include them + * here. The last intent in the list is what the user sees when they + * launch this shortcut. --> + * <categories android:name="android.shortcut.conversation" /> + * </shortcut> + * <!-- Specify more shortcuts here. --> + *</shortcuts> * </pre> * - * The following list includes descriptions for the different attributes within a manifest shortcut: + * The following list includes descriptions for the different attributes within a static shortcut: * <dl> - * <dt>android:shortcutId</dt> + * <dt>{@code android:shortcutId}</dt> * <dd>Mandatory shortcut ID</dd> * - * <dt>android:enabled</dt> + * <dt>{@code android:enabled}</dt> * <dd>Default is {@code true}. Can be set to {@code false} in order - * to disable a manifest shortcut that was published in a previous version and and set a custom - * disabled message. If a custom disabled message is not needed, then a manifest shortcut can + * to disable a static shortcut that was published in a previous version and set a custom + * disabled message. If a custom disabled message is not needed, then a static shortcut can * be simply removed from the XML file rather than keeping it with {@code enabled="false"}.</dd> * - * <dt>android:icon</dt> + * <dt>{@code android:icon}</dt> * <dd>Shortcut icon.</dd> * - * <dt>android:shortcutShortLabel</dt> + * <dt>{@code android:shortcutShortLabel}</dt> * <dd>Mandatory shortcut short label. * See {@link ShortcutInfo.Builder#setShortLabel(CharSequence)}.</dd> * - * <dt>android:shortcutLongLabel</dt> + * <dt>{@code android:shortcutLongLabel}</dt> * <dd>Shortcut long label. * See {@link ShortcutInfo.Builder#setLongLabel(CharSequence)}.</dd> * - * <dt>android:shortcutDisabledMessage</dt> + * <dt>{@code android:shortcutDisabledMessage}</dt> * <dd>When {@code android:enabled} is set to * {@code false}, this attribute is used to display a custom disabled message.</dd> * - * <dt>intent</dt> + * <dt>{@code intent}</dt> * <dd>Intent to launch when the user selects the shortcut. * {@code android:action} is mandatory. * See <a href="{@docRoot}guide/topics/ui/settings.html#Intents">Using intents</a> for the * other supported tags. - * You can provide multiple intents for a single shortcut so that an activity is launched - * with other activities in the back stack. See {@link android.app.TaskStackBuilder} for details. + * You can provide multiple intents for a single shortcut so that the last defined activity is launched + * with the other activities in the <a href="/guide/components/tasks-and-back-stack.html">back stack</a>. + * See {@link android.app.TaskStackBuilder} for details. * </dd> - * <dt>categories</dt> + * <dt>{@code categories}</dt> * <dd>Specify shortcut categories. Currently only * {@link ShortcutInfo#SHORTCUT_CATEGORY_CONVERSATION} is defined in the framework. * </dd> @@ -226,64 +233,68 @@ import java.util.List; * * <h3>Publishing Dynamic Shortcuts</h3> * - * Applications can publish dynamic shortcuts with {@link #setDynamicShortcuts(List)} + * <p> + * Apps can publish dynamic shortcuts with {@link #setDynamicShortcuts(List)} * or {@link #addDynamicShortcuts(List)}. The {@link #updateShortcuts(List)} method can also be * used to update existing, mutable shortcuts. * Use {@link #removeDynamicShortcuts(List)} or {@link #removeAllDynamicShortcuts()} to remove * dynamic shortcuts. * - * <p>Example: + * <p>The following code snippet shows how to create a single dynamic shortcut: * <pre> - * ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); + *ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); * - * ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1") - * .setIntent(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.mysite.com/"))) - * .setShortLabel("Web site") - * .setLongLabel("Open the web site") - * .setIcon(Icon.createWithResource(context, R.drawable.icon_website)) - * .build(); + *ShortcutInfo shortcut = new ShortcutInfo.Builder(this, "id1") + * .setShortLabel("Web site") + * .setLongLabel("Open the web site") + * .setIcon(Icon.createWithResource(context, R.drawable.icon_website)) + * .setIntent(new Intent(Intent.ACTION_VIEW, + * Uri.parse("https://www.mysite.example.com/"))) + * .build(); * - * shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut)); + *shortcutManager.setDynamicShortcuts(Arrays.asList(shortcut)); * </pre> * * * <h3>Shortcut Intents</h3> + * <p> * Dynamic shortcuts can be published with any set of {@link Intent#addFlags Intent} flags. * Typically, {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} is specified, possibly along with other - * flags; otherwise, if the application is already running, the application is simply brought to + * flags; otherwise, if the app is already running, the app is simply brought to * the foreground, and the target activity may not appear. * * <p>The {@link ShortcutInfo.Builder#setIntents(Intent[])} method can be used instead of * {@link ShortcutInfo.Builder#setIntent(Intent)} with {@link android.app.TaskStackBuilder} * in order to launch an activity with other activities in the back stack. * When the user selects a shortcut to load an activity with a back stack, - * then presses the back key, a "parent" activity will be shown instead of the user being - * navigated back to the launcher. + * then presses the back key, a parent activity from the same app will be shown + * instead of the user being navigated back to the launcher. * - * <p>Manifest shortcuts can also have multiple intents to achieve the same effect. + * <p>Static shortcuts can also have multiple intents to achieve the same effect. * In order to associate multiple {@link Intent} objects with a shortcut, simply list multiple * <code><intent></code> elements within a single <code><shortcut></code> element. - * The last intent specifies what the user will see when they launch a shortcut. + * The last intent specifies what the user sees when they launch a shortcut. * - * <p>Manifest shortcuts <b>cannot</b> have custom intent flags. - * The first intent of a manifest shortcut will always have {@link Intent#FLAG_ACTIVITY_NEW_TASK} + * <p>Static shortcuts <b>cannot</b> have custom intent flags. + * The first intent of a static shortcut will always have {@link Intent#FLAG_ACTIVITY_NEW_TASK} * and {@link Intent#FLAG_ACTIVITY_CLEAR_TASK} set. - * This means, when the application is already running, all the existing activities will be - * destroyed when a manifest shortcut is launched. + * This means, when the app is already running, all the existing activities will be + * destroyed when a static shortcut is launched. * If this behavior is not desirable, you can use a <em>trampoline activity</em>, * or an invisible activity that starts another activity in {@link Activity#onCreate}, * then calls {@link Activity#finish()}. * The first activity should include an attribute setting - * of {@code android:taskAffinity=""} in the application's <code>AndroidManifest.xml</code> - * file, and the intent within the manifest shortcut should point at this first activity. + * of {@code android:taskAffinity=""} in the app's <code>AndroidManifest.xml</code> + * file, and the intent within the static shortcut should point at this first activity. * * * <h3>Showing New Information in a Shortcut</h3> + * <p> * In order to avoid confusion, you should not use {@link #updateShortcuts(List)} to update * a shortcut so that it contains conceptually different information. * - * <p>For example, a phone application may publish the most frequently called contact as a dynamic - * shortcut. Over time, this contact may change; when it does, the application should + * <p>For example, a phone app may publish the most frequently called contact as a dynamic + * shortcut. Over time, this contact may change. When it does, the app should * represent the changed contact with a new shortcut that contains a different ID, using either * {@link #setDynamicShortcuts(List)} or {@link #addDynamicShortcuts(List)}, rather than updating * the existing shortcut with {@link #updateShortcuts(List)}. @@ -291,7 +302,7 @@ import java.util.List; * it to reference a different contact will likely confuse the user. * * <p>On the other hand, when the - * contact's information has changed, such as the name or picture, the application should + * contact's information has changed, such as the name or picture, the app should * use {@link #updateShortcuts(List)} so that the pinned shortcut is updated too. * * @@ -299,21 +310,21 @@ import java.util.List; * When the launcher displays the shortcuts that are associated with a particular launcher icon, * the shortcuts should appear in the following order: * <ul> - * <li>First show manifest shortcuts + * <li>First show static shortcuts * (if {@link ShortcutInfo#isDeclaredInManifest()} is {@code true}), * and then show dynamic shortcuts (if {@link ShortcutInfo#isDynamic()} is {@code true}). - * <li>Within each category of shortcuts (manifest and dynamic), sort the shortcuts in order + * <li>Within each category of shortcuts (static and dynamic), sort the shortcuts in order * of increasing rank according to {@link ShortcutInfo#getRank()}. * </ul> - * <p>Shortcut ranks are non-negative sequential integers + * <p>Shortcut ranks are non-negative, sequential integers * that determine the order in which shortcuts appear, assuming that the shortcuts are all in * the same category. * Ranks of existing shortcuts can be updated with - * {@link #updateShortcuts(List)}; you can use {@link #addDynamicShortcuts(List)} and - * {@link #setDynamicShortcuts(List)}, too. + * {@link #updateShortcuts(List)}. You can also use {@link #addDynamicShortcuts(List)} and + * {@link #setDynamicShortcuts(List)}. * * <p>Ranks are auto-adjusted so that they're unique for each target activity in each category - * (dynamic or manifest). For example, if there are 3 dynamic shortcuts with ranks 0, 1 and 2, + * (static or dynamic). For example, if there are 3 dynamic shortcuts with ranks 0, 1 and 2, * adding another dynamic shortcut with a rank of 1 represents a request to place this shortcut at * the second position. * In response, the third and fourth shortcuts move closer to the bottom of the shortcut list, @@ -321,119 +332,120 @@ import java.util.List; * * <h3>Rate Limiting</h3> * + * <p> * Calls to {@link #setDynamicShortcuts(List)}, {@link #addDynamicShortcuts(List)}, and - * {@link #updateShortcuts(List)} may be rate-limited when called by background applications, or - * applications with no foreground activity or service. When you attempt to call these methods - * from a background application after exceeding the rate limit, these APIs return {@code false}. + * {@link #updateShortcuts(List)} may be rate-limited when called by <em>background apps</em>, or + * apps with no foreground activity or service. When you attempt to call these methods + * from a background app after exceeding the rate limit, these APIs return {@code false}. * - * <p>Applications with a foreground activity or service are not rate-limited. + * <p>Apps with a foreground activity or service are not rate-limited. * - * <p>Rate-limiting will be reset upon certain events, so that even background applications - * can call these APIs again until the rate limit is reached again. + * <p>Rate-limiting is reset upon certain events, so that even background apps + * can call these APIs until the rate limit is reached again. * These events include the following: * <ul> - * <li>When an application comes to the foreground. - * <li>When the system locale changes. - * <li>When the user performs an "inline reply" action on a notification. + * <li>An app comes to the foreground. + * <li>The system locale changes. + * <li>The user performs the <strong>inline reply</strong> action on a notification. * </ul> * * <p>When rate-limiting is active, {@link #isRateLimitingActive()} returns {@code true}. * * <h4>Resetting rate-limiting for testing</h4> * - * If your application is rate-limited during development or testing, you can use the - * "Reset ShortcutManager rate-limiting" development option or the following adb command to reset - * it: - * <pre> - * adb shell cmd shortcut reset-throttling [ --user USER-ID ] + * <p> + * If your app is rate-limited during development or testing, you can use the + * <strong>Reset ShortcutManager rate-limiting</strong> development option or + * the following {@code adb} command to reset it: + * <pre class="no-pretty-print"> + *$ adb shell cmd shortcut reset-throttling [ --user USER-ID ] * </pre> * * <h3>Handling System Locale Changes</h3> * - * Applications should update dynamic and pinned shortcuts when the system locale changes + * <p> + * Apps should update dynamic and pinned shortcuts when the system locale changes * using the {@link Intent#ACTION_LOCALE_CHANGED} broadcast. * - * <p>When the system locale changes, rate-limiting is reset, so even background applications - * can set dynamic shortcuts, add dynamic shortcuts, and update shortcuts until the rate limit - * is reached again. + * <p>When the system locale changes, rate-limiting is reset, so even background apps + * can add and update dynamic shortcuts until the rate limit is reached again. * * * <h3>Backup and Restore</h3> * - * When an application has the {@code android:allowBackup="true"} attribute assignment included + * <p> + * When an app has the {@code android:allowBackup="true"} attribute assignment included * in its <code>AndroidManifest.xml</code> file, pinned shortcuts are * backed up automatically and are restored when the user sets up a new device. * - * <h4>Categories of Shortcuts that are Backed Up</h4> + * <h4>Categories of shortcuts that are backed up</h4> * * <ul> * <li>Pinned shortcuts are backed up. Bitmap icons are not backed up by the system, - * but launcher applications should back them up and restore them so that the user still sees icons - * for pinned shortcuts on the launcher. Applications can always use + * so launcher apps should back them up and restore them so that the user still sees icons + * for pinned shortcuts on the launcher. Apps can always use * {@link #updateShortcuts(List)} to re-publish icons. * - * <li>Manifest shortcuts are not backed up, but when an application is re-installed on a new - * device, they are re-published from the <code>AndroidManifest.xml</code> file, anyway. + * <li>Static shortcuts aren't backed up, but when an app is re-installed on a new + * device, they are re-published from the <code>AndroidManifest.xml</code> file. * - * <li>Dynamic shortcuts are <b>not</b> backed up. + * <li>Dynamic shortcuts <b>aren't</b> backed up. * </ul> * - * <p>Because dynamic shortcuts are not restored, it is recommended that applications check + * <p>Because dynamic shortcuts are not restored, it is recommended that apps check * currently-published dynamic shortcuts using {@link #getDynamicShortcuts()} * each time they are launched, and they should re-publish * dynamic shortcuts when necessary. * * <pre> - * public class MainActivity extends Activity { - * public void onCreate(Bundle savedInstanceState) { - * super.onCreate(savedInstanceState); - * - * ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); - * - * if (shortcutManager.getDynamicShortcuts().size() == 0) { - * // Application restored; re-publish dynamic shortcuts. - * - * if (shortcutManager.getPinnedShortcuts().size() > 0) { - * // Pinned shortcuts have been restored. Use updateShortcuts() to make sure - * // they have up-to-date information. - * } - * } - * } - * : - * - * } + *public class MainActivity extends Activity { + * public void onCreate(Bundle savedInstanceState) { + * super.onCreate(savedInstanceState); + * ShortcutManager shortcutManager = + * getSystemService(ShortcutManager.class); + * + * if (shortcutManager.getDynamicShortcuts().size() == 0) { + * // Application restored. Need to re-publish dynamic shortcuts. + * if (shortcutManager.getPinnedShortcuts().size() > 0) { + * // Pinned shortcuts have been restored. Use + * // updateShortcuts() to make sure they contain + * // up-to-date information. + * } + * } + * } + * // ... + *} * </pre> * * * <h4>Backup/restore and shortcut IDs</h4> - * - * Because pinned shortcuts are backed up and restored on new devices, shortcut IDs should be - * meaningful across devices; that is, IDs should contain either stable, constant strings - * or server-side identifiers, + * <p> + * Because pinned shortcuts are backed up and restored on new devices, shortcut IDs + * should contain either stable, constant strings or server-side identifiers, * rather than identifiers generated locally that might not make sense on other devices. * * * <h3>Report Shortcut Usage and Prediction</h3> - * - * Launcher applications may be capable of predicting which shortcuts will most likely be + * <p> + * Launcher apps may be capable of predicting which shortcuts will most likely be * used at a given time by examining the shortcut usage history data. * - * <p>In order to provide launchers with such data, publisher applications should + * <p>In order to provide launchers with such data, publisher apps should * report the shortcuts that are used with {@link #reportShortcutUsed(String)} * when a shortcut is selected, * <b>or when an action equivalent to a shortcut is taken by the user even if it wasn't started * with the shortcut</b>. * - * <p>For example, suppose a GPS navigation application supports "navigate to work" as a shortcut. + * <p>For example, suppose a navigation app supports "navigate to work" as a shortcut. * It should then report when the user selects this shortcut <b>and</b> when the user chooses - * to navigate to work within the application itself. - * This helps the launcher application + * to navigate to work within the app itself. + * This helps the launcher app * learn that the user wants to navigate to work at a certain time every * weekday, and it can then show this shortcut in a suggestion list at the right time. * * <h3>Launcher API</h3> * - * The {@link LauncherApps} class provides APIs for launcher applications to access shortcuts. + * The {@link LauncherApps} class provides APIs for launcher apps to access shortcuts. * * * <h3>Direct Boot and Shortcuts</h3> @@ -465,7 +477,7 @@ public class ShortcutManager { } /** - * Publish the list of shortcuts. All existing dynamic shortcuts from the caller application + * Publish the list of shortcuts. All existing dynamic shortcuts from the caller app * will be replaced. If there are already pinned shortcuts with the same IDs, * the mutable pinned shortcuts are updated. * @@ -488,7 +500,7 @@ public class ShortcutManager { } /** - * Return all dynamic shortcuts from the caller application. + * Return all dynamic shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -503,7 +515,7 @@ public class ShortcutManager { } /** - * Return all manifest shortcuts from the caller application. + * Return all static (manifest) shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -554,7 +566,7 @@ public class ShortcutManager { } /** - * Delete all dynamic shortcuts from the caller application. + * Delete all dynamic shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -567,7 +579,7 @@ public class ShortcutManager { } /** - * Return all pinned shortcuts from the caller application. + * Return all pinned shortcuts from the caller app. * * @throws IllegalStateException when the user is locked. */ @@ -661,7 +673,7 @@ public class ShortcutManager { /** * Re-enable pinned shortcuts that were previously disabled. If the target shortcuts - * already enabled, this method does nothing. + * are already enabled, this method does nothing. * * @throws IllegalArgumentException If trying to enable immutable shortcuts. * @@ -684,7 +696,7 @@ public class ShortcutManager { } /** - * Return the maximum number of dynamic and manifest shortcuts that each launcher icon + * Return the maximum number of static and dynamic shortcuts that each launcher icon * can have at a time. */ public int getMaxShortcutCountPerActivity() { @@ -697,7 +709,7 @@ public class ShortcutManager { } /** - * Return the number of times the caller application can call the rate-limited APIs + * Return the number of times the caller app can call the rate-limited APIs * before the rate limit counter is reset. * * @see #getRateLimitResetTime() @@ -729,7 +741,7 @@ public class ShortcutManager { } /** - * Return {@code true} when rate-limiting is active for the caller application. + * Return {@code true} when rate-limiting is active for the caller app. * * <p>See the class level javadoc for details. * @@ -769,13 +781,13 @@ public class ShortcutManager { } /** - * Applications that publish shortcuts should call this method - * whenever the user selects the shortcut containing the given ID or when the user completes - * an action in the application that is equivalent to selecting the shortcut. + * Apps that publish shortcuts should call this method whenever the user + * selects the shortcut containing the given ID or when the user completes + * an action in the app that is equivalent to selecting the shortcut. * For more details, see the Javadoc for the {@link ShortcutManager} class * * <p>The information is accessible via {@link UsageStatsManager#queryEvents} - * Typically, launcher applications use this information to build a prediction model + * Typically, launcher apps use this information to build a prediction model * so that they can promote the shortcuts that are likely to be used at the moment. * * @throws IllegalStateException when the user is locked. @@ -790,9 +802,9 @@ public class ShortcutManager { } /** - * Called internally when an application is considered to have come to foreground + * Called internally when an app is considered to have come to the foreground * even when technically it's not. This method resets the throttling for this package. - * For example, when the user sends an "inline reply" on an notification, the system UI will + * For example, when the user sends an "inline reply" on a notification, the system UI will * call it. * * @hide diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java index ca64a965af0b..62fa7721702e 100644 --- a/core/java/android/os/Bundle.java +++ b/core/java/android/os/Bundle.java @@ -309,25 +309,49 @@ public final class Bundle extends BaseBundle implements Cloneable, Parcelable { * Filter values in Bundle to only basic types. * @hide */ - public void filterValues() { + public Bundle filterValues() { unparcel(); + Bundle bundle = this; if (mMap != null) { - for (int i = mMap.size() - 1; i >= 0; i--) { - Object value = mMap.valueAt(i); + ArrayMap<String, Object> map = mMap; + for (int i = map.size() - 1; i >= 0; i--) { + Object value = map.valueAt(i); if (PersistableBundle.isValidType(value)) { continue; } if (value instanceof Bundle) { - ((Bundle)value).filterValues(); + Bundle newBundle = ((Bundle)value).filterValues(); + if (newBundle != value) { + if (map == mMap) { + // The filter had to generate a new bundle, but we have not yet + // created a new one here. Do that now. + bundle = new Bundle(this); + // Note the ArrayMap<> constructor is guaranteed to generate + // a new object with items in the same order as the original. + map = bundle.mMap; + } + // Replace this current entry with the new child bundle. + map.setValueAt(i, newBundle); + } + continue; } if (value.getClass().getName().startsWith("android.")) { continue; } - mMap.removeAt(i); + if (map == mMap) { + // This is the first time we have had to remove something, that means we + // need to switch to a new Bundle. + bundle = new Bundle(this); + // Note the ArrayMap<> constructor is guaranteed to generate + // a new object with items in the same order as the original. + map = bundle.mMap; + } + map.removeAt(i); } } mFlags |= FLAG_HAS_FDS_KNOWN; mFlags &= ~FLAG_HAS_FDS; + return bundle; } /** diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 8a132dbb8abb..496a82f6f20e 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6394,6 +6394,12 @@ public final class Settings { public static final String WEB_ACTION_ENABLED = "web_action_enabled"; /** + * Has this pairable device been paired or upgraded from a previously paired system. + * @hide + */ + public static final String DEVICE_PAIRED = "device_paired"; + + /** * This are the settings to be backed up. * * NOTE: Settings are backed up and restored in the order they appear @@ -7986,11 +7992,45 @@ public final class Settings { public static final String PAC_CHANGE_DELAY = "pac_change_delay"; /** + * Don't attempt to detect captive portals. + * + * @hide + */ + public static final int CAPTIVE_PORTAL_MODE_IGNORE = 0; + + /** + * When detecting a captive portal, display a notification that + * prompts the user to sign in. + * + * @hide + */ + public static final int CAPTIVE_PORTAL_MODE_PROMPT = 1; + + /** + * When detecting a captive portal, immediately disconnect from the + * network and do not reconnect to that network in the future. + * + * @hide + */ + public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; + + /** + * What to do when connecting a network that presents a captive portal. + * Must be one of the CAPTIVE_PORTAL_MODE_* constants above. + * + * The default for this setting is CAPTIVE_PORTAL_MODE_PROMPT. + * @hide + */ + public static final String CAPTIVE_PORTAL_MODE = "captive_portal_mode"; + + /** * Setting to turn off captive portal detection. Feature is enabled by * default and the setting needs to be set to 0 to disable it. * + * @deprecated use CAPTIVE_PORTAL_MODE_IGNORE to disable captive portal detection * @hide */ + @Deprecated public static final String CAPTIVE_PORTAL_DETECTION_ENABLED = "captive_portal_detection_enabled"; diff --git a/core/java/android/util/DisplayMetrics.java b/core/java/android/util/DisplayMetrics.java index f4db4d6611ea..b7099b642e98 100644 --- a/core/java/android/util/DisplayMetrics.java +++ b/core/java/android/util/DisplayMetrics.java @@ -268,6 +268,10 @@ public class DisplayMetrics { } public void setTo(DisplayMetrics o) { + if (this == o) { + return; + } + widthPixels = o.widthPixels; heightPixels = o.heightPixels; density = o.density; diff --git a/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java new file mode 100644 index 000000000000..cf1bf62cdeb2 --- /dev/null +++ b/core/java/com/android/internal/hardware/AmbientDisplayConfiguration.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.internal.hardware; + +import com.android.internal.R; + +import android.content.Context; +import android.provider.Settings; +import android.text.TextUtils; + +public class AmbientDisplayConfiguration { + + private final Context mContext; + + public AmbientDisplayConfiguration(Context context) { + mContext = context; + } + + public boolean enabled(int user) { + return pulseOnNotificationEnabled(user) + || pulseOnPickupEnabled(user) + || pulseOnDoubleTapEnabled(user); + } + + public boolean available() { + return pulseOnNotificationAvailable() || pulseOnPickupAvailable() + || pulseOnDoubleTapAvailable(); + } + + public boolean pulseOnNotificationEnabled(int user) { + return boolSetting(Settings.Secure.DOZE_ENABLED, user) && pulseOnNotificationAvailable(); + } + + public boolean pulseOnNotificationAvailable() { + return ambientDisplayAvailable(); + } + + public boolean pulseOnPickupEnabled(int user) { + return boolSetting(Settings.Secure.DOZE_PULSE_ON_PICK_UP, user) + && pulseOnPickupAvailable(); + } + + public boolean pulseOnPickupAvailable() { + return mContext.getResources().getBoolean(R.bool.config_dozePulsePickup) + && ambientDisplayAvailable(); + } + + public boolean pulseOnDoubleTapEnabled(int user) { + return boolSetting(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, user) + && pulseOnDoubleTapAvailable(); + } + + public boolean pulseOnDoubleTapAvailable() { + return !TextUtils.isEmpty(doubleTapSensorType()) && ambientDisplayAvailable(); + } + + public String doubleTapSensorType() { + return mContext.getResources().getString(R.string.config_dozeDoubleTapSensorType); + } + + public String ambientDisplayComponent() { + return mContext.getResources().getString(R.string.config_dozeComponent); + } + + private boolean ambientDisplayAvailable() { + return !TextUtils.isEmpty(ambientDisplayComponent()); + } + + private boolean boolSetting(String name, int user) { + return Settings.Secure.getIntForUser(mContext.getContentResolver(), name, 1, user) != 0; + } + +} diff --git a/core/java/com/android/internal/view/IInputConnectionWrapper.java b/core/java/com/android/internal/view/IInputConnectionWrapper.java index 644c7e90f8b0..4f7b106a83fe 100644 --- a/core/java/com/android/internal/view/IInputConnectionWrapper.java +++ b/core/java/com/android/internal/view/IInputConnectionWrapper.java @@ -580,7 +580,13 @@ public abstract class IInputConnectionWrapper extends IInputContext.Stub { return; } if (grantUriPermission) { - inputContentInfo.requestPermission(); + try { + inputContentInfo.requestPermission(); + } catch (Exception e) { + Log.e(TAG, "InputConnectionInfo.requestPermission() failed", e); + args.callback.setCommitContentResult(false, args.seq); + return; + } } final boolean result = ic.commitContent(inputContentInfo, flags, (Bundle) args.arg2); diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index da9415d10b73..52b7ef4f7fa3 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -187,18 +187,17 @@ static void verifySystemIdmaps() argv[argc++] = AssetManager::IDMAP_DIR; // Directories to scan for overlays: if OVERLAY_SKU_DIR_PROPERTY is defined, - // use OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> if exists, otherwise - // use OVERLAY_DIR if exists. + // use OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> in addition to OVERLAY_DIR. char subdir[PROP_VALUE_MAX]; int len = __system_property_get(AssetManager::OVERLAY_SKU_DIR_PROPERTY, subdir); - String8 overlayPath; if (len > 0) { - overlayPath = String8(AssetManager::OVERLAY_DIR) + "/" + subdir; - } else { - overlayPath = String8(AssetManager::OVERLAY_DIR); + String8 overlayPath = String8(AssetManager::OVERLAY_DIR) + "/" + subdir; + if (stat(overlayPath.string(), &st) == 0) { + argv[argc++] = overlayPath.string(); + } } - if (stat(overlayPath.string(), &st) == 0) { - argv[argc++] = overlayPath.string(); + if (stat(AssetManager::OVERLAY_DIR, &st) == 0) { + argv[argc++] = AssetManager::OVERLAY_DIR; } // Finally, invoke idmap (if any overlay directory exists) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index b145f71e9148..430c6b6459a3 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3032,7 +3032,7 @@ <!-- @SystemApi Allows access to MAC addresses of WiFi and Bluetooth peer devices. @hide --> <permission android:name="android.permission.PEERS_MAC_ADDRESS" - android:protectionLevel="signature" /> + android:protectionLevel="signature|setup" /> <!-- Allows the Nfc stack to dispatch Nfc messages to applications. Applications can use this permission to ensure incoming Nfc messages are from the Nfc stack diff --git a/core/res/res/color/background_cache_hint_selector_device_default.xml b/core/res/res/color/background_cache_hint_selector_device_default.xml new file mode 100644 index 000000000000..4470754f4155 --- /dev/null +++ b/core/res/res/color/background_cache_hint_selector_device_default.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_accelerated="false" android:color="?attr/colorBackground" /> + <item android:color="@android:color/transparent" /> +</selector> + diff --git a/core/res/res/layout-notround-watch/alert_dialog_title_material.xml b/core/res/res/layout-notround-watch/alert_dialog_title_material.xml index 307c6db91c3a..0ab56f95efbe 100644 --- a/core/res/res/layout-notround-watch/alert_dialog_title_material.xml +++ b/core/res/res/layout-notround-watch/alert_dialog_title_material.xml @@ -22,6 +22,7 @@ android:gravity="top|center_horizontal" android:minHeight="@dimen/alert_dialog_title_height"> <ImageView android:id="@+id/icon" + android:adjustViewBounds="true" android:maxHeight="24dp" android:maxWidth="24dp" android:layout_marginTop="8dp" diff --git a/core/res/res/layout-round-watch/alert_dialog_title_material.xml b/core/res/res/layout-round-watch/alert_dialog_title_material.xml index 7e71e4180341..e543c9b69390 100644 --- a/core/res/res/layout-round-watch/alert_dialog_title_material.xml +++ b/core/res/res/layout-round-watch/alert_dialog_title_material.xml @@ -21,6 +21,7 @@ android:gravity="top|center_horizontal" android:minHeight="@dimen/alert_dialog_title_height"> <ImageView android:id="@+id/icon" + android:adjustViewBounds="true" android:maxHeight="24dp" android:maxWidth="24dp" android:layout_marginTop="12dp" diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index c7b830652a86..50e1327f4a9c 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -152,7 +152,7 @@ <string name="httpErrorAuth" msgid="1435065629438044534">"Nije moguće potvrditi autentičnost."</string> <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Potvrda identiteta preko proksi servera nije uspela."</string> <string name="httpErrorConnect" msgid="8714273236364640549">"Nije moguće povezati se sa serverom."</string> - <string name="httpErrorIO" msgid="2340558197489302188">"Nije moguće komunicirati sa serverom. Pokušajte ponovo kasnije."</string> + <string name="httpErrorIO" msgid="2340558197489302188">"Nije moguće komunicirati sa serverom. Probajte ponovo kasnije."</string> <string name="httpErrorTimeout" msgid="4743403703762883954">"Veza sa serverom je istekla."</string> <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Stranica sadrži previše veza za preusmeravanje sa servera."</string> <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Protokol nije podržan."</string> @@ -160,7 +160,7 @@ <string name="httpErrorBadUrl" msgid="3636929722728881972">"Stranicu nije moguće otvoriti zato što je URL adresa nevažeća."</string> <string name="httpErrorFile" msgid="2170788515052558676">"Nije moguće pristupiti datoteci."</string> <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Nije moguće pronaći traženu datoteku."</string> - <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Previše zahteva se obrađuje. Pokušajte ponovo kasnije."</string> + <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Previše zahteva se obrađuje. Probajte ponovo kasnije."</string> <string name="notification_title" msgid="8967710025036163822">"Greška pri prijavljivanju za <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> <string name="contentServiceSync" msgid="8353523060269335667">"Sinhronizacija"</string> <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Sinhronizacija"</string> @@ -440,19 +440,19 @@ <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Dozvoljava aplikaciji da aktivira metode za dodavanje i brisanje šablona otisaka prstiju koji će se koristiti."</string> <string name="permlab_useFingerprint" msgid="3150478619915124905">"koristi hardver za otiske prstiju"</string> <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Dozvoljava aplikaciji da koristi hardver za otiske prstiju radi potvrde autentičnosti"</string> - <string name="fingerprint_acquired_partial" msgid="735082772341716043">"Otkriven je delimični otisak prsta. Pokušajte ponovo."</string> - <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nije uspela obrada otiska prsta. Pokušajte ponovo."</string> + <string name="fingerprint_acquired_partial" msgid="735082772341716043">"Otkriven je delimični otisak prsta. Probajte ponovo."</string> + <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Nije uspela obrada otiska prsta. Probajte ponovo."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Senzor za otiske prstiju je prljav. Očistite ga i pokušajte ponovo."</string> - <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Prebrzo ste pomerili prst. Pokušajte ponovo."</string> - <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Previše sporo ste pomerili prst. Pokušajte ponovo."</string> + <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Prebrzo ste pomerili prst. Probajte ponovo."</string> + <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Previše sporo ste pomerili prst. Probajte ponovo."</string> <string-array name="fingerprint_acquired_vendor"> </string-array> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Hardver za otiske prstiju nije dostupan."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nije moguće sačuvati otisak prsta. Uklonite neki od postojećih otisaka prstiju."</string> - <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Pokušajte ponovo."</string> + <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja sa otiskom prsta je otkazana."</string> - <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string> - <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Pokušajte ponovo."</string> + <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Probajte ponovo kasnije."</string> + <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probajte ponovo."</string> <string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -680,8 +680,8 @@ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Hitne službe"</string> <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Nazad na poziv"</string> <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Tačno!"</string> - <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Pokušajte ponovo"</string> - <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Pokušajte ponovo"</string> + <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Probajte ponovo"</string> + <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Probajte ponovo"</string> <string name="lockscreen_storage_locked" msgid="9167551160010625200">"Otključaj za sve funkcije i podatke"</string> <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Premašen je najveći dozvoljeni broj pokušaja Otključavanja licem"</string> <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Nema SIM kartice"</string> @@ -705,19 +705,19 @@ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Pogledajte Korisnički vodič ili kontaktirajte Korisničku podršku."</string> <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM kartica je zaključana."</string> <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Otključavanje SIM kartice…"</string> - <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste nepravilno nacrtali šablon za otključavanje. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> - <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli lozinku. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> - <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli PIN. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću podataka za prijavljivanje na Google.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"Neispravno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja od vas će biti zatraženo da otključate TV pomoću podataka za prijavljivanje na Google.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću podataka za prijavljivanje na Google.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> + <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste nepravilno nacrtali šablon za otključavanje. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli lozinku. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste pogrešno uneli PIN. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"Neispravno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja od vas će biti zatraženo da otključate TV pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"<xliff:g id="NUMBER_0">%1$d</xliff:g> puta ste netačno uneli šablon za otključavanje. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> nesupešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću podataka za prijavljivanje na Google.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Nepravilno ste pokušali da otključate tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Nakon još neuspešnih pokušaja (<xliff:g id="NUMBER_1">%2$d</xliff:g>) tablet će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja TV će biti resetovan na podrazumevana fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Neispravno ste pokušali da otključate telefon <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Nakon još neuspešnih pokušaja (<xliff:g id="NUMBER_1">%2$d</xliff:g>) telefon će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Neispravno ste pokušali da otključate tablet <xliff:g id="NUMBER">%d</xliff:g> puta. Tablet će sada biti vraćen na podrazumevana fabrička podešavanja."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER">%d</xliff:g> puta. TV će sada biti resetovan na podrazumevana fabrička podešavanja."</string> <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Neispravno ste pokušali da otključate telefon <xliff:g id="NUMBER">%d</xliff:g> puta. Telefon će sada biti vraćen na podrazumevana fabrička podešavanja."</string> - <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Pokušajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde(i)."</string> + <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Probajte ponovo za <xliff:g id="NUMBER">%d</xliff:g> sekunde(i)."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Zaboravili ste šablon?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Otključavanje naloga"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Previše pokušaja unosa šablona"</string> @@ -1421,7 +1421,7 @@ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Pogrešan šablon"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Pogrešna lozinka"</string> <string name="kg_wrong_pin" msgid="1131306510833563801">"Pogrešan PIN"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Pokušajte ponovo za <xliff:g id="NUMBER">%1$d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Probajte ponovo za <xliff:g id="NUMBER">%1$d</xliff:g> sekunde(i)."</string> <string name="kg_pattern_instructions" msgid="398978611683075868">"Nacrtajte šablon"</string> <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Unesite PIN SIM kartice"</string> <string name="kg_pin_instructions" msgid="2377242233495111557">"Unesite PIN"</string> @@ -1443,18 +1443,18 @@ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Nevažeće korisničko ime ili lozinka."</string> <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Zaboravili ste korisničko ime ili lozinku?\nPosetite adresu "<b>"google.com/accounts/recovery"</b>"."</string> <string name="kg_login_checking_password" msgid="1052685197710252395">"Provera naloga…"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Uneli ste netačni PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Uneli ste netačnu lozinku <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nPokušajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Uneli ste netačni PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Uneli ste netačnu lozinku <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. \n\nProbajte ponovo za <xliff:g id="NUMBER_1">%2$d</xliff:g> sekunde(i)."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Pokušali ste da otključate tablet netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Nakon još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja tablet će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja TV će biti resetovan na podrazumevana fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Pokušali ste da otključate telefon netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja telefon će biti resetovan na fabrička podešavanja i svi korisnički podaci će biti izgubljeni."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Pokušali ste da otključate tablet netačno <xliff:g id="NUMBER">%d</xliff:g> puta. Tablet će sada biti vraćen na podrazumevana fabrička podešavanja."</string> <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"Pokušali ste da otključate TV netačno <xliff:g id="NUMBER">%d</xliff:g> puta. TV će sada biti resetovan na podrazumevana fabrička podešavanja."</string> <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Pokušali ste da otključate telefon netačno <xliff:g id="NUMBER">%d</xliff:g> puta. Telefon će sada biti vraćen na podrazumevana fabrička podešavanja."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nPokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> - <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Neispravno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate TV pomoću naloga e-pošte.\n\n Pokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nPokušajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate tablet pomoću naloga e-pošte.\n\nProbajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> + <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Neispravno ste nacrtali šablon za otključavanje <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate TV pomoću naloga e-pošte.\n\n Probajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sek."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Nacrtali ste šablon za otključavanje netačno <xliff:g id="NUMBER_0">%1$d</xliff:g> puta. Posle još <xliff:g id="NUMBER_1">%2$d</xliff:g> neuspešna(ih) pokušaja, od vas će biti zatraženo da otključate telefon pomoću naloga e-pošte.\n\nProbajte ponovo za <xliff:g id="NUMBER_2">%3$d</xliff:g> sekunde(i)."</string> <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string> <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Ukloni"</string> <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Želite da pojačate zvuk iznad preporučenog nivoa?\n\nSlušanje glasne muzike duže vreme može da vam ošteti sluh."</string> @@ -1565,14 +1565,14 @@ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novi PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Potvrdite novi PIN"</string> <string name="restr_pin_create_pin" msgid="8017600000263450337">"Napravite PIN za izmenu ograničenja"</string> - <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ovi se ne podudaraju. Pokušajte ponovo."</string> + <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ovi se ne podudaraju. Probajte ponovo."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN je prekratak. Mora da sadrži najmanje 4 cifre."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688"> - <item quantity="one">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundu</item> - <item quantity="few">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekunde</item> - <item quantity="other">Pokušajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundi</item> + <item quantity="one">Probajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundu</item> + <item quantity="few">Probajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekunde</item> + <item quantity="other">Probajte ponovo za <xliff:g id="COUNT">%d</xliff:g> sekundi</item> </plurals> - <string name="restr_pin_try_later" msgid="973144472490532377">"Pokušajte ponovo kasnije"</string> + <string name="restr_pin_try_later" msgid="973144472490532377">"Probajte ponovo kasnije"</string> <string name="immersive_cling_title" msgid="8394201622932303336">"Prikazuje se ceo ekran"</string> <string name="immersive_cling_description" msgid="3482371193207536040">"Da biste izašli, prevucite nadole odozgo."</string> <string name="immersive_cling_positive" msgid="5016839404568297683">"Važi"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index bb1935d57ad9..a6fad85e2df9 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -417,7 +417,7 @@ <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Ermöglicht der App, Pakete zu empfangen, die mithilfe von Multicast-Adressen an sämtliche Geräte in einem WLAN versendet wurden, nicht nur an dein Telefon. Dies nimmt mehr Leistung in Anspruch als der Nicht-Multicast-Modus."</string> <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="tv" msgid="3373125682645601429">"Ermöglicht der App, den lokalen Bluetooth-Fernseher zu konfigurieren, Remote-Geräte zu erkennen und ein Pairing mit diesen durchzuführen"</string> + <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"Ermöglicht der App, den lokalen Bluetooth-Fernseher zu konfigurieren, Remote-Geräte zu erkennen und eine Kopplung mit ihnen durchzuführen"</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_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> @@ -425,9 +425,9 @@ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Ermöglicht der App, eine Verbindung zwischen dem Tablet und WiMAX-Netzwerken herzustellen und solche zu trennen."</string> <string name="permdesc_changeWimaxState" product="tv" msgid="6022307083934827718">"Ermöglicht der App, eine Verbindung zwischen dem Fernseher und WiMAX-Netzwerken herzustellen und diese zu trennen"</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Ermöglicht der App, eine Verbindung zwischen dem Telefon und WiMAX-Netzwerken herzustellen und solche zu trennen."</string> - <string name="permlab_bluetooth" msgid="6127769336339276828">"Pairing mit Bluetooth-Geräten durchführen"</string> + <string name="permlab_bluetooth" msgid="6127769336339276828">"Kopplung mit Bluetooth-Geräten durchführen"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Ermöglicht der App, die Bluetooth-Konfiguration eines Tablets einzusehen und Verbindungen zu gekoppelten Geräten herzustellen und zu akzeptieren."</string> - <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Ermöglicht der App, die Bluetooth-Konfiguration des Fernsehers einzusehen und Verbindungen zu Pairing-Geräten herzustellen und zu akzeptieren"</string> + <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Ermöglicht der App, die Bluetooth-Konfiguration des Fernsehers abzurufen und Verbindungen zu gekoppelten Geräten herzustellen und zu akzeptieren"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ermöglicht der App, die Bluetooth-Konfiguration des Telefons einzusehen und Verbindungen mit gekoppelten Geräten herzustellen und zu akzeptieren."</string> <string name="permlab_nfc" msgid="4423351274757876953">"Nahfeldkommunikation steuern"</string> <string name="permdesc_nfc" msgid="7120611819401789907">"Ermöglicht der App die Kommunikation mit Tags für die Nahfeldkommunikation, Karten und Readern"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index bcfab3dda654..9e41023575f9 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -250,7 +250,7 @@ <string name="permgrouplab_calendar" msgid="5863508437783683902">"Ημερολόγιο"</string> <string name="permgroupdesc_calendar" msgid="3889615280211184106">"έχει πρόσβαση στο ημερολόγιό σας"</string> <string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string> - <string name="permgroupdesc_sms" msgid="4656988620100940350">"αποστολή και προβολή μηνυμάτων SMS"</string> + <string name="permgroupdesc_sms" msgid="4656988620100940350">"στέλνει και να διαβάζει μηνύματα SMS"</string> <string name="permgrouplab_storage" msgid="1971118770546336966">"Αποθηκευτικός χώρος"</string> <string name="permgroupdesc_storage" msgid="637758554581589203">"έχει πρόσβαση στις φωτογραφίες/πολυμέσα/αρχεία στη συσκευή σας"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Μικρόφωνο"</string> @@ -273,149 +273,149 @@ <string name="capability_desc_canControlMagnification" msgid="4791858203568383773">"Ελέγξτε το επίπεδο ζουμ και τη θέση της οθόνης."</string> <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Εκτέλεση κινήσεων"</string> <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Επιτρέπει το πάτημα, την ολίσθηση, το πλησίασμα και άλλες κινήσεις."</string> - <string name="permlab_statusBar" msgid="7417192629601890791">"απενεργοποίηση ή τροποποίηση γραμμής κατάστασης"</string> + <string name="permlab_statusBar" msgid="7417192629601890791">"απενεργοποιεί ή να τροποποιεί την γραμμή κατάστασης"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Επιτρέπει στην εφαρμογή να απενεργοποιεί τη γραμμή κατάστασης ή να προσθέτει και να αφαιρεί εικονίδια συστήματος."</string> - <string name="permlab_statusBarService" msgid="4826835508226139688">"ορισμός ως γραμμής κατάστασης"</string> + <string name="permlab_statusBarService" msgid="4826835508226139688">"ορίζεται ως γραμμή κατάστασης"</string> <string name="permdesc_statusBarService" msgid="716113660795976060">"Επιτρέπει στην εφαρμογή να αποτελεί τη γραμμή κατάστασης."</string> - <string name="permlab_expandStatusBar" msgid="1148198785937489264">"ανάπτυξη/σύμπτυξη γραμμής κατάστασης"</string> + <string name="permlab_expandStatusBar" msgid="1148198785937489264">"αναπτύσσει/συμπτύσσει τη γραμμή κατάστασης"</string> <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Επιτρέπει στην εφαρμογή να αναπτύξει ή να συμπτύξει τη γραμμή κατάστασης."</string> - <string name="permlab_install_shortcut" msgid="4279070216371564234">"εγκατάσταση συντομεύσεων"</string> + <string name="permlab_install_shortcut" msgid="4279070216371564234">"εγκαθιστά συντομεύσεις"</string> <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Επιτρέπει σε μια εφαρμογή την προσθήκη συντομεύσεων στην Αρχική οθόνη χωρίς την παρέμβαση του χρήστη."</string> - <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"κατάργηση εγκατάστασης συντομεύσεων"</string> + <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"καταργεί την εγκατάσταση συντομεύσεων"</string> <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Επιτρέπει στην εφαρμογή την κατάργηση συντομεύσεων από την Αρχική οθόνη χωρίς την παρέμβαση του χρήστη."</string> - <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"αναδρομολόγηση εξερχόμενων κλήσεων"</string> + <string name="permlab_processOutgoingCalls" msgid="3906007831192990946">"αναδρομολογεί τις εξερχόμενες κλήσεις"</string> <string name="permdesc_processOutgoingCalls" msgid="5156385005547315876">"Επιτρέπει στην εφαρμογή να βλέπει τον αριθμό που καλέσατε κατά τη διάρκεια μιας εξερχόμενης κλήσης με επιλογή ανακατεύθυνσης της κλήσης σε έναν διαφορετικό αριθμό ή διακοπής της κλήσης."</string> - <string name="permlab_receiveSms" msgid="8673471768947895082">"λήψη μηνυμάτων κειμένου (SMS)"</string> + <string name="permlab_receiveSms" msgid="8673471768947895082">"λαμβάνει μηνύματα κειμένου (SMS)"</string> <string name="permdesc_receiveSms" msgid="6424387754228766939">"Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων SMS. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς."</string> - <string name="permlab_receiveMms" msgid="1821317344668257098">"λήψη μηνυμάτων κειμένου (MMS)"</string> + <string name="permlab_receiveMms" msgid="1821317344668257098">"λαμβάνει μηνύματα κειμένου (MMS)"</string> <string name="permdesc_receiveMms" msgid="533019437263212260">"Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων MMS. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς."</string> - <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ανάγνωση μηνυμάτων που έχουν μεταδοθεί μέσω κινητού τηλεφώνου"</string> + <string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"διαβάζει μηνύματα που έχουν μεταδοθεί μέσω κινητού τηλεφώνου"</string> <string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων που έχουν μεταδοθεί μέσω κινητού τηλεφώνου και έχουν ληφθεί από τη συσκευή σας. Ειδοποιήσεις που μεταδίδονται μέσω κινητού παραδίδονται σε ορισμένες τοποθεσίες για να σας προειδοποιήσουν για καταστάσεις έκτακτης ανάγκης. Κακόβουλες εφαρμογές ενδέχεται να παρεμποδίσουν την απόδοση ή τη λειτουργία της συσκευής σας κατά τη λήψη μετάδοσης μέσω κινητού σχετικά με μια επείγουσα κατάσταση."</string> - <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ανάγνωση ροών δεδομένων στις οποίες έχετε εγγραφεί"</string> + <string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"διαβάζει ροές δεδομένων στις οποίες έχετε εγγραφεί"</string> <string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Επιτρέπει στην εφαρμογή τη λήψη λεπτομερειών σχετικά με τις τρέχουσες συγχρονισμένες ροές δεδομένων."</string> - <string name="permlab_sendSms" msgid="7544599214260982981">"πραγματοποιεί αποστολή και προβολή μηνυμάτων SMS"</string> + <string name="permlab_sendSms" msgid="7544599214260982981">"στέλνει και να διαβάζει μηνύματα SMS"</string> <string name="permdesc_sendSms" msgid="7094729298204937667">"Επιτρέπει στην εφαρμογή των αποστολή μηνυμάτων SMS. Αυτό μπορεί να προκαλέσει μη αναμενόμενες χρεώσεις. Οι κακόβουλες εφαρμογές ενδέχεται να σας κοστίσουν χρήματα, αποστέλλοντας μηνύματα χωρίς την έγκρισή σας."</string> - <string name="permlab_readSms" msgid="8745086572213270480">"ανάγνωση των μηνυμάτων κειμένου σας (SMS ή MMS)"</string> + <string name="permlab_readSms" msgid="8745086572213270480">"διαβάζει τα μηνύματα κειμένου (SMS ή MMS)"</string> <string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων SMS που είναι αποθηκευμένα στο tablet σας ή στην κάρτα σας SIM. Αυτό δίνει τη δυνατότητα στην εφαρμογή να διαβάζει όλα τα μηνύματα SMS, ανεξάρτητα από το περιεχόμενο ή το επίπεδο εμπιστευτικότητάς τους."</string> <string name="permdesc_readSms" product="tv" msgid="5102425513647038535">"Επιτρέπει στην εφαρμογή να διαβάζει μηνύματα SMS που έχουν αποθηκευτεί στην τηλεόραση ή στην κάρτα SIM. Έτσι, η εφαρμογή μπορεί να διαβάζει όλα τα μηνύματα SMS, ανεξαρτήτως περιεχομένου ή εμπιστευτικότητας."</string> <string name="permdesc_readSms" product="default" msgid="3695967533457240550">"Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων SMS που είναι αποθηκευμένα στο τηλέφωνό σας ή στην κάρτα σας SIM. Αυτό δίνει τη δυνατότητα στην εφαρμογή να διαβάζει όλα τα μηνύματα SMS, ανεξάρτητα από το περιεχόμενο ή το επίπεδο εμπιστευτικότητάς τους."</string> - <string name="permlab_receiveWapPush" msgid="5991398711936590410">"λήψη μηνυμάτων κειμένου (WAP)"</string> + <string name="permlab_receiveWapPush" msgid="5991398711936590410">"λαμβάνει μηνύματα κειμένου (WAP)"</string> <string name="permdesc_receiveWapPush" msgid="748232190220583385">"Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων WAP. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς."</string> - <string name="permlab_getTasks" msgid="6466095396623933906">"ανάκτηση εκτελούμενων εφαρμογών"</string> + <string name="permlab_getTasks" msgid="6466095396623933906">"ανακτά εκτελούμενες εφαρμογές"</string> <string name="permdesc_getTasks" msgid="7454215995847658102">"Επιτρέπει στην εφαρμογή την ανάκτηση πληροφοριών σχετικά με τρέχουσες και πρόσφατα εκτελούμενες εργασίες. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να ανακαλύπτει πληροφορίες σχετικά με το ποιες εφαρμογές χρησιμοποιούνται στη συσκευή."</string> - <string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"διαχείριση προφίλ και κατόχων συσκευής"</string> + <string name="permlab_manageProfileAndDeviceOwners" msgid="7918181259098220004">"διαχειρίζεται το προφίλ και τους κατόχους συσκευής"</string> <string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"Επιτρέπει σε εφαρμογές να ορίζουν τους κατόχους προφίλ και τον κάτοχο της συσκευής."</string> - <string name="permlab_reorderTasks" msgid="2018575526934422779">"αναδιάταξη εκτελούμενων εφαρμογών"</string> + <string name="permlab_reorderTasks" msgid="2018575526934422779">"αναδιατάσσει τις εκτελούμενες εφαρμογές"</string> <string name="permdesc_reorderTasks" msgid="7734217754877439351">"Επιτρέπει στην εφαρμογή τη μετακίνηση εργασιών στο προσκήνιο και το παρασκήνιο. Η εφαρμογή μπορεί να το κάνει αυτό χωρίς να καταχωρίσετε δεδομένα εισόδου."</string> - <string name="permlab_enableCarMode" msgid="5684504058192921098">"ενεργοποίηση λειτουργίας αυτοκινήτου"</string> + <string name="permlab_enableCarMode" msgid="5684504058192921098">"ενεργοποιεί την λειτουργία αυτοκινήτου"</string> <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Επιτρέπει στην εφαρμογή την ενεργοποίηση της λειτουργίας αυτοκινήτου."</string> - <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"κλείσιμο των άλλων εφαρμογών"</string> + <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"κλείνει άλλες εφαρμογές"</string> <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Επιτρέπει στην εφαρμογή τον τερματισμό των διεργασιών παρασκηνίου άλλων εφαρμογών. Αυτό μπορεί να προκαλεί τη διακοπή λειτουργίας άλλων εφαρμογών."</string> - <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"σχεδίαση πάνω σε άλλες εφαρμογές"</string> + <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"σχεδιάζει πάνω από άλλες εφαρμογές"</string> <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Επιτρέπει στην εφαρμογή το σχεδιασμό πάνω σε άλλες εφαρμογές ή τμήματα του περιβάλλοντος χρήστη. Ενδέχεται να παρεμβαίνουν στη χρήση του περιβάλλοντος σε άλλες εφαρμογές ή να αλλάζουν τα στοιχεία που βλέπετε σε άλλες εφαρμογές."</string> - <string name="permlab_persistentActivity" msgid="8841113627955563938">"να εκτελείται συνεχώς η εφαρμογή"</string> + <string name="permlab_persistentActivity" msgid="8841113627955563938">"επιτρέπει στην εφαρμογή να εκτελείται συνεχώς"</string> <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Επιτρέπει στην εφαρμογή να δημιουργεί μόνιμα τμήματα του εαυτού της στη μνήμη. Αυτό μπορεί να περιορίζει τη μνήμη που διατίθεται σε άλλες εφαρμογές, καθυστερώντας τη λειτουργία του tablet."</string> <string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Επιτρέπει στην εφαρμογή να καθιστά τμήματά της μόνιμα στη μνήμη. Αυτό μπορεί να περιορίσει τη μνήμη που διατίθεται σε άλλες εφαρμογές, επιβραδύνοντας τη λειτουργία της τηλεόρασης."</string> <string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Επιτρέπει στην εφαρμογή να δημιουργεί μόνιμα τμήματα του εαυτού της στη μνήμη. Αυτό μπορεί να περιορίζει τη μνήμη που διατίθεται σε άλλες εφαρμογές, καθυστερώντας τη λειτουργία του τηλεφώνου."</string> - <string name="permlab_getPackageSize" msgid="7472921768357981986">"μέτρηση αποθηκευτικού χώρου εφαρμογής"</string> + <string name="permlab_getPackageSize" msgid="7472921768357981986">"υπολογίζει τον αποθηκευτικό χώρο εφαρμογής"</string> <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Επιτρέπει στην εφαρμογή να ανακτήσει τα μεγέθη κώδικα, δεδομένων και προσωρινής μνήμης"</string> <string name="permlab_writeSettings" msgid="2226195290955224730">"τροποποίηση ρυθμίσεων συστήματος"</string> <string name="permdesc_writeSettings" msgid="7775723441558907181">"Επιτρέπει στην εφαρμογή την τροποποίηση των δεδομένων των ρυθμίσεων του συστήματος. Τυχόν κακόβουλες εφαρμογές ενδέχεται να καταστρέψουν τη διαμόρφωση του συστήματός σας."</string> - <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"εκτέλεση κατά την έναρξη"</string> + <string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"εκτελείται κατά την έναρξη"</string> <string name="permdesc_receiveBootCompleted" product="tablet" msgid="7390304664116880704">"Επιτρέπει στην εφαρμογή να εκκινηθεί αμέσως μόλις ολοκληρωθεί η εκκίνηση του συστήματος. Αυτό ενδέχεται να καθυστερήσει την εκκίνηση του tablet και να προκαλέσει γενική μείωση της ταχύτητας λειτουργίας του tablet, καθώς η εφαρμογή θα εκτελείται συνεχώς."</string> <string name="permdesc_receiveBootCompleted" product="tv" msgid="4525890122209673621">"Επιτρέπει στην εφαρμογή να ξεκινάει μόλις ολοκληρώνεται η εκκίνηση του συστήματος. Αυτό μπορεί να καθυστερεί την εκκίνηση της τηλεόρασης και επιτρέπει στην εφαρμογή να επιβραδύνει τη συνολική λειτουργία του tablet, λόγω της συνεχούς προβολής."</string> <string name="permdesc_receiveBootCompleted" product="default" msgid="513950589102617504">"Επιτρέπει στην εφαρμογή να εκκινηθεί αμέσως μόλις ολοκληρωθεί η εκκίνηση του συστήματος. Αυτό ενδέχεται να καθυστερήσει την εκκίνηση του τηλεφώνου και να προκαλέσει γενική μείωση της ταχύτητας λειτουργίας του τηλεφώνου, καθώς η εφαρμογή θα εκτελείται συνεχώς."</string> - <string name="permlab_broadcastSticky" msgid="7919126372606881614">"αποστολή εκπομπής sticky"</string> + <string name="permlab_broadcastSticky" msgid="7919126372606881614">"στέλνει εκπομπή sticky"</string> <string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"Επιτρέπει στην εφαρμογή την αποστολή εκπομπών sticky, οι οποίες παραμένουν μετά το τέλος της εκπομπής. Η υπερβολική χρήση ενδέχεται να καταστήσει τη λειτουργία του tablet αργή ή ασταθή, προκαλώντας τη χρήση μεγάλου τμήματος της μνήμης."</string> <string name="permdesc_broadcastSticky" product="tv" msgid="6839285697565389467">"Επιτρέπει στην εφαρμογή να στέλνει εκπομπές που παραμένουν μετά το τέλος της μετάδοσης. Η υπερβολική χρήση μπορεί να καταστήσει αργή ή ασταθή τη λειτουργία της τηλεόρασης, προκαλώντας τη χρήση υπερβολικά μεγάλου μέρους της μνήμης."</string> <string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Επιτρέπει στην εφαρμογή την αποστολή εκπομπών sticky, οι οποίες παραμένουν μετά το τέλος της εκπομπής. Η υπερβολική χρήση ενδέχεται να καταστήσει τη λειτουργία του τηλεφώνου αργή ή ασταθή, προκαλώντας τη χρήση μεγάλου τμήματος της μνήμης."</string> - <string name="permlab_readContacts" msgid="8348481131899886131">"ανάγνωση των επαφών σας"</string> + <string name="permlab_readContacts" msgid="8348481131899886131">"διαβάζει τις επαφές σας"</string> <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Επιτρέπει στην εφαρμογή την ανάγνωση δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο tablet σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένα άτομα ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να αποθηκεύουν τα δεδομένα των επαφών σας και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα επαφών χωρίς να το γνωρίζετε."</string> <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Επιτρέπει στην εφαρμογή να διαβάζει δεδομένα σχετικά με τις επαφές σας που είναι αποθηκευμένες στην τηλεόρασή σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένα άτομα ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτό το δικαίωμα επιτρέπει στις εφαρμογές να αποθηκεύουν τα δεδομένα των επαφών σας. Επίσης, κακόβουλες εφαρμογές μπορεί να μοιραστούν δεδομένα επαφών χωρίς να το γνωρίζετε."</string> <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Επιτρέπει στην εφαρμογή την ανάγνωση δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο τηλέφωνό σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένα άτομα ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να αποθηκεύουν τα δεδομένα των επαφών σας και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα επαφών χωρίς να το γνωρίζετε."</string> - <string name="permlab_writeContacts" msgid="5107492086416793544">"τροποποίηση των επαφών σας"</string> + <string name="permlab_writeContacts" msgid="5107492086416793544">"τροποποιεί τις επαφές σας"</string> <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Επιτρέπει στην εφαρμογή την τροποποίηση των δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο tablet σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένες επαφές ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να διαγράφουν δεδομένα επαφών."</string> <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Επιτρέπει στην εφαρμογή να τροποποιεί τα δεδομένα σχετικά με τις επαφές που είναι αποθηκευμένες στην τηλεόρασή σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένες επαφές ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτό το δικαίωμα δίνει τη δυνατότητα σε εφαρμογές να διαγράφουν δεδομένα επαφών."</string> <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Επιτρέπει στην εφαρμογή την τροποποίηση των δεδομένων σχετικά με τις επαφές σας που είναι αποθηκευμένες στο τηλέφωνό σας, συμπεριλαμβανομένης της συχνότητας με την οποία έχετε καλέσει συγκεκριμένες επαφές ή έχετε επικοινωνήσει μαζί τους μέσω ηλεκτρονικού ταχυδρομείου ή άλλου τρόπου. Αυτή η άδεια δίνει τη δυνατότητα σε εφαρμογές να διαγράφουν δεδομένα επαφών."</string> - <string name="permlab_readCallLog" msgid="3478133184624102739">"ανάγνωση αρχείου καταγραφής κλήσεων"</string> + <string name="permlab_readCallLog" msgid="3478133184624102739">"διαβάζει το αρχείο καταγραφής κλήσεων"</string> <string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"Επιτρέπει στην εφαρμογή την ανάγνωση του αρχείου καταγραφής κλήσεων του tablet σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Αυτή η άδεια δίνει τη δυνατότητα στις εφαρμογές να αποθηκεύει τα δεδομένα του αρχείου καταγραφής κλήσεων και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα του αρχείου καταγραφής κλήσεων χωρίς να το γνωρίζετε."</string> <string name="permdesc_readCallLog" product="tv" msgid="5611770887047387926">"Επιτρέπει στην εφαρμογή να διαβάζει το αρχείο καταγραφής κλήσεων της τηλεόρασής σας, συμπεριλαμβανομένων δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Αυτό το δικαίωμα επιτρέπει στις εφαρμογές να αποθηκεύουν τα δεδομένα του αρχείου καταγραφής κλήσεων. Επίσης, κακόβουλες εφαρμογές μπορεί να μοιραστούν δεδομένα αρχείου καταγραφής κλήσεων χωρίς να το γνωρίζετε."</string> <string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"Επιτρέπει στην εφαρμογή την ανάγνωση του αρχείου καταγραφής κλήσεων του τηλεφώνου σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Αυτή η άδεια δίνει τη δυνατότητα στις εφαρμογές να αποθηκεύει τα δεδομένα του αρχείου καταγραφής κλήσεων και οι κακόβουλες εφαρμογές ενδέχεται να μοιράζονται δεδομένα του αρχείου καταγραφής κλήσεων χωρίς να το γνωρίζετε."</string> - <string name="permlab_writeCallLog" msgid="8552045664743499354">"εγγραφή αρχείου καταγραφής κλήσεων"</string> + <string name="permlab_writeCallLog" msgid="8552045664743499354">"εγγράφει αρχείο καταγραφής κλήσεων"</string> <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων του tablet σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να το χρησιμοποιήσουν για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων."</string> <string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων της τηλεόρασής σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Κακόβουλες εφαρμογές μπορεί να χρησιμοποιήσουν αυτήν τη δυνατότητα, για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων."</string> <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Επιτρέπει στην εφαρμογή να τροποποιεί το αρχείο καταγραφής κλήσεων του τηλεφώνου σας, συμπεριλαμβανομένων των δεδομένων σχετικά με τις εισερχόμενες και τις εξερχόμενες κλήσεις. Οι κακόβουλες εφαρμογές μπορεί να το χρησιμοποιήσουν για να διαγράψουν ή να τροποποιήσουν το αρχείο καταγραφής κλήσεων."</string> <string name="permlab_bodySensors" msgid="4683341291818520277">"πρόσβαση στους αισθητήρες λειτουργιών (π.χ. παρακολούθηση καρδιακού παλμού)"</string> <string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"Επιτρέπει στην εφαρμογή να αποκτήσει πρόσβαση στα δεδομένα των αισθητήρων που παρακολουθούν τη φυσική σας κατάσταση, όπως τον καρδιακό ρυθμό σας."</string> - <string name="permlab_readCalendar" msgid="5972727560257612398">"ανάγνωση συμβάντων ημερολογίου και εμπιστευτικών πληροφοριών"</string> + <string name="permlab_readCalendar" msgid="5972727560257612398">"διαβάζει συμβάντα ημερολογίου και εμπιστευτικές πληροφορίες"</string> <string name="permdesc_readCalendar" product="tablet" msgid="4216462049057658723">"Επιτρέπει στην εφαρμογή την ανάγνωση όλων των συμβάντων ημερολογίου που είναι αποθηκευμένα στο tablet σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να μοιράζεται ή να αποθηκεύει τα δεδομένα του ημερολογίου σας, ανεξάρτητα από το βαθμό εμπιστευτικότητας ή ευαισθησίας τους."</string> <string name="permdesc_readCalendar" product="tv" msgid="3191352452242394196">"Επιτρέπει στην εφαρμογή να διαβάζει όλα τα συμβάντα ημερολογίου που είναι αποθηκευμένα στην τηλεόρασή σας, συμπεριλαμβανομένων εκείνων από τους φίλους ή τους συναδέλφους σας. Αυτό μπορεί να επιτρέψει στην εφαρμογή να μοιράζεται ή να αποθηκεύει τα δεδομένα ημερολογίου, ανεξαρτήτως εμπιστευτικότητας ή ευαισθησίας."</string> <string name="permdesc_readCalendar" product="default" msgid="7434548682470851583">"Επιτρέπει στην εφαρμογή την ανάγνωση όλων των συμβάντων ημερολογίου που είναι αποθηκευμένα στο τηλέφωνό σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να μοιράζεται ή να αποθηκεύει τα δεδομένα του ημερολογίου σας, ανεξάρτητα από το βαθμό εμπιστευτικότητας ή ευαισθησίας τους."</string> - <string name="permlab_writeCalendar" msgid="8438874755193825647">"προσθήκη ή τροποποίηση συμβάντων ημερολογίου και αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου σε προσκεκλημένους χωρίς να το γνωρίζουν οι κάτοχοι"</string> + <string name="permlab_writeCalendar" msgid="8438874755193825647">"προσθέτει ή τροποποιεί συμβάντα ημερολογίου και να στέλνει μηνύματα ηλ. ταχυδρομείου σε προσκεκλημένους χωρίς να το γνωρίζουν οι κάτοχοι"</string> <string name="permdesc_writeCalendar" product="tablet" msgid="6679035520113668528">"Επιτρέπει στην εφαρμογή την προσθήκη, την κατάργηση και την αλλαγή συμβάντων που μπορείτε να τροποποιήσετε στο tablet σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να επιτρέπει στην εφαρμογή να αποστέλλει μηνύματα που φαίνεται ότι προέρχονται από κατόχους ημερολογίων ή να τροποποιεί συμβάντα χωρίς να το γνωρίζουν οι κάτοχοι."</string> <string name="permdesc_writeCalendar" product="tv" msgid="1273290605500902507">"Επιτρέπει στην εφαρμογή να προσθέτει, να καταργεί και να αλλάζει συμβάντα που μπορείτε να τροποποιείτε στην τηλεόρασή σας, συμπεριλαμβανομένων όσων ανήκουν σε φίλους ή συναδέλφους. Αυτό ενδέχεται να επιτρέπει στην εφαρμογή να αποστέλλει μηνύματα τα οποία φαίνεται ότι προέρχονται από κατόχους ημερολογίου ή να τροποποιεί συμβάντα χωρίς να το γνωρίζουν οι κάτοχοί τους."</string> <string name="permdesc_writeCalendar" product="default" msgid="2324469496327249376">"Επιτρέπει στην εφαρμογή την προσθήκη, την κατάργηση και την αλλαγή συμβάντων που μπορείτε να τροποποιήσετε στο τηλέφωνό σας, συμπεριλαμβανομένων εκείνων των φίλων ή των συναδέλφων σας. Αυτό μπορεί να επιτρέπει στην εφαρμογή να αποστέλλει μηνύματα που φαίνεται ότι προέρχονται από κατόχους ημερολογίων ή να τροποποιεί συμβάντα χωρίς να το γνωρίζουν οι κάτοχοι."</string> - <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας"</string> + <string name="permlab_accessLocationExtraCommands" msgid="2836308076720553837">"έχει πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας"</string> <string name="permdesc_accessLocationExtraCommands" msgid="6078307221056649927">"Επιτρέπει στην εφαρμογή την πρόσβαση σε επιπλέον εντολές παρόχου τοποθεσίας. Αυτό μπορεί να δώσει τη δυνατότητα στην εφαρμογή να παρέμβει στη λειτουργία του GPS ή άλλων πηγών τοποθεσίας."</string> - <string name="permlab_accessFineLocation" msgid="251034415460950944">"πρόσβαση στην ακριβή τοποθεσία (με βάση το GPS και το δίκτυο)"</string> + <string name="permlab_accessFineLocation" msgid="251034415460950944">"έχει πρόσβαση στην ακριβή τοποθεσία (με βάση το GPS και το δίκτυο)"</string> <string name="permdesc_accessFineLocation" msgid="5295047563564981250">"Επιτρέπει στην εφαρμογή να λαμβάνει την ακριβή θέση σας με τη χρήση του Παγκόσμιου Συστήματος Εντοπισμού (GPS) ή πηγών τοποθεσίας δικτύου, όπως κεραίες κινητής τηλεφωνίας και Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας πρέπει να είναι ενεργοποιημένες και διαθέσιμες στην συσκευή σας, ώστε να μπορούν να χρησιμοποιηθούν από την εφαρμογή. Οι εφαρμογές ενδέχεται να τις χρησιμοποιήσουν για να προσδιορίσουν τη θέση σας και ενδέχεται να καταναλώσουν επιπλέον ισχύ μπαταρίας."</string> - <string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"πρόσβαση στην τοποθεσία κατά προσέγγιση (με βάση το δίκτυο)"</string> + <string name="permlab_accessCoarseLocation" msgid="7715277613928539434">"έχει πρόσβαση στην τοποθεσία κατά προσέγγιση (με βάση το δίκτυο)"</string> <string name="permdesc_accessCoarseLocation" msgid="2538200184373302295">"Επιτρέπει στην εφαρμογή τη λήψη της κατά προσέγγιση τοποθεσίας σας. Αυτή η τοποθεσία προκύπτει από τις υπηρεσίες τοποθεσίας με τη χρήση πηγών τοποθεσίας δικτύου, όπως κεραίες κινητής τηλεφωνίας και Wi-Fi. Αυτές οι υπηρεσίες τοποθεσίας πρέπει να είναι ενεργοποιημένες και διαθέσιμες στην συσκευή σας, ώστε να μπορούν να χρησιμοποιηθούν από την εφαρμογή. Οι εφαρμογές ενδέχεται να τις χρησιμοποιήσουν για να προσδιορίσουν κατά προσέγγιση τη θέση σας."</string> - <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"αλλαγή των ρυθμίσεων ήχου"</string> + <string name="permlab_modifyAudioSettings" msgid="6095859937069146086">"αλλάζει τις ρυθμίσεις ήχου"</string> <string name="permdesc_modifyAudioSettings" msgid="3522565366806248517">"Επιτρέπει στην εφαρμογή την τροποποίηση καθολικών ρυθμίσεων ήχου, όπως η ένταση και ποιο ηχείο χρησιμοποιείται για έξοδο."</string> - <string name="permlab_recordAudio" msgid="3876049771427466323">"εγγραφή ήχου"</string> + <string name="permlab_recordAudio" msgid="3876049771427466323">"εγγράφει ήχο"</string> <string name="permdesc_recordAudio" msgid="4906839301087980680">"Επιτρέπει στην εφαρμογή την εγγραφή ήχου με το μικρόφωνο. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να εγγράφει ήχο ανά πάσα στιγμή χωρίς την έγκρισή σας."</string> <string name="permlab_sim_communication" msgid="2935852302216852065">"στέλνει εντολές στην κάρτα SIM"</string> <string name="permdesc_sim_communication" msgid="5725159654279639498">"Επιτρέπει στην εφαρμογή την αποστολή εντολών στην κάρτα SIM. Αυτό είναι εξαιρετικά επικίνδυνο."</string> - <string name="permlab_camera" msgid="3616391919559751192">"λήψη φωτογραφιών και βίντεο"</string> + <string name="permlab_camera" msgid="3616391919559751192">"κάνει λήψη φωτογραφιών και βίντεο"</string> <string name="permdesc_camera" msgid="8497216524735535009">"Επιτρέπει στην εφαρμογή τη λήψη φωτογραφιών και βίντεο με τη φωτογραφική μηχανή. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να χρησιμοποιεί τη φωτογραφική μηχανή ανά πάσα στιγμή χωρίς την έγκρισή σας."</string> - <string name="permlab_vibrate" msgid="7696427026057705834">"έλεγχος δόνησης"</string> + <string name="permlab_vibrate" msgid="7696427026057705834">"ελέγχει τη δόνηση"</string> <string name="permdesc_vibrate" msgid="6284989245902300945">"Επιτρέπει στην εφαρμογή τον έλεγχο της δόνησης."</string> - <string name="permlab_callPhone" msgid="3925836347681847954">"απευθείας κλήση τηλεφωνικών αριθμών"</string> + <string name="permlab_callPhone" msgid="3925836347681847954">"πραγματοποιεί απευθείας κλήση τηλεφωνικών αριθμών"</string> <string name="permdesc_callPhone" msgid="3740797576113760827">"Επιτρέπει στην εφαρμογή την κλήση αριθμών τηλεφώνου χωρίς δική σας παρέμβαση. Αυτό μπορεί να προκαλέσει μη αναμενόμενες χρεώσεις ή κλήσεις. Έχετε υπόψη ότι δεν επιτρέπεται στην εφαρμογή η κλήση αριθμών έκτακτης ανάγκης. Οι κακόβουλες εφαρμογές ενδέχεται να σας κοστίσουν χρήματα, πραγματοποιώντας κλήσεις χωρίς την έγκρισή σας."</string> - <string name="permlab_accessImsCallService" msgid="3574943847181793918">"πρόσβαση στην υπηρεσία κλήσεων της IMS"</string> + <string name="permlab_accessImsCallService" msgid="3574943847181793918">"έχει πρόσβαση στην υπηρεσία κλήσεων της IMS"</string> <string name="permdesc_accessImsCallService" msgid="8992884015198298775">"Επιτρέπει στην εφαρμογή τη χρήση της υπηρεσίας IMS για την πραγματοποίηση κλήσεων χωρίς τη δική σας παρέμβαση."</string> - <string name="permlab_readPhoneState" msgid="9178228524507610486">"ανάγνωση κατάστασης και ταυτότητας τηλεφώνου"</string> + <string name="permlab_readPhoneState" msgid="9178228524507610486">"διαβάζει την κατάσταση και ταυτότητα τηλεφώνου"</string> <string name="permdesc_readPhoneState" msgid="1639212771826125528">"Επιτρέπει στην εφαρμογή την πρόσβαση στις λειτουργίες τηλεφώνου της συσκευής. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να καθορίζει τον αριθμό τηλεφώνου και τα αναγνωριστικά συσκευών, εάν μια κλήση είναι ενεργή, καθώς και τον απομακρυσμένο αριθμό που συνδέεται από μια κλήση."</string> - <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"παρεμπόδιση μετάβασης του tablet σε κατάσταση αδράνειας"</string> - <string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"αποτροπή μετάβασης της τηλεόρασης στην κατάσταση αδράνειας"</string> - <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"παρεμπόδιση μετάβασης του τηλεφώνου σε κατάσταση αδράνειας"</string> + <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"αποτρέπει την μετάβαση του tablet σε κατάσταση αδράνειας"</string> + <string name="permlab_wakeLock" product="tv" msgid="2601193288949154131">"αποτρέπει την μετάβαση της τηλεόρασης σε κατάσταση αδράνειας"</string> + <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"αποτρέπει το τηλεφώνο να μεταβεί σε κατάσταση αδράνειας"</string> <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"Επιτρέπει στην εφαρμογή την παρεμπόδιση της μετάβασης του tablet σε κατάσταση αδράνειας."</string> <string name="permdesc_wakeLock" product="tv" msgid="3208534859208996974">"Επιτρέπει στην εφαρμογή να εμποδίζει τη μετάβαση της τηλεόρασης στην κατάσταση αδράνειας."</string> <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"Επιτρέπει στην εφαρμογή την παρεμπόδιση της μετάβασης του τηλεφώνου σε κατάσταση αδράνειας."</string> - <string name="permlab_transmitIr" msgid="7545858504238530105">"μετάδοση υπερύθρων"</string> + <string name="permlab_transmitIr" msgid="7545858504238530105">"μεταδίδει με υπερύθρες"</string> <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί τον πομπό υπερύθρων του tablet."</string> <string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί τον πομπό υπερύθρων της τηλεόρασης."</string> <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί τον πομπό υπερύθρων του τηλεφώνου."</string> - <string name="permlab_setWallpaper" msgid="6627192333373465143">"ορισμός ταπετσαρίας"</string> + <string name="permlab_setWallpaper" msgid="6627192333373465143">"ορίζει ταπετσαρία"</string> <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Επιτρέπει στην εφαρμογή τον ορισμό της ταπετσαρίας συστήματος."</string> - <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ρύθμιση του μεγέθους της ταπετσαρίας σας"</string> + <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"ρυθμίζει το μέγεθος της ταπετσαρίας"</string> <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Επιτρέπει στην εφαρμογή τον ορισμό συμβουλών μεγέθους ταπετσαρίας συστήματος."</string> - <string name="permlab_setTimeZone" msgid="2945079801013077340">"ορισμός ζώνης ώρας"</string> + <string name="permlab_setTimeZone" msgid="2945079801013077340">"ορίζει τη ζώνης ώρας"</string> <string name="permdesc_setTimeZone" product="tablet" msgid="1676983712315827645">"Επιτρέπει στην εφαρμογή την αλλαγή της ζώνης ώρας του tablet."</string> <string name="permdesc_setTimeZone" product="tv" msgid="888864653946175955">"Επιτρέπει στην εφαρμογή να αλλάζει τη ζώνη ώρας της τηλεόρασης."</string> <string name="permdesc_setTimeZone" product="default" msgid="4499943488436633398">"Επιτρέπει στην εφαρμογή την αλλαγή της ζώνης ώρας του τηλεφώνου."</string> - <string name="permlab_getAccounts" msgid="1086795467760122114">"εύρεση λογαριασμών στη συσκευή"</string> + <string name="permlab_getAccounts" msgid="1086795467760122114">"βρίσκει λογαριασμούς στη συσκευή"</string> <string name="permdesc_getAccounts" product="tablet" msgid="2741496534769660027">"Επιτρέπει στην εφαρμογή τη λήψη της λίστας λογαριασμών που υπάρχουν στο tablet. Μπορεί να περιλαμβάνονται τυχόν λογαριασμοί που δημιουργήθηκαν από εφαρμογές που έχετε εγκαταστήσει."</string> <string name="permdesc_getAccounts" product="tv" msgid="4190633395633907543">"Επιτρέπει στην εφαρμογή να λαμβάνει τη λίστα λογαριασμών που γνωρίζει η τηλεόραση. Αυτό μπορεί να περιλαμβάνει λογαριασμούς που δημιουργούνται από λογαριασμούς που έχετε εγκαταστήσει."</string> <string name="permdesc_getAccounts" product="default" msgid="3448316822451807382">"Επιτρέπει στην εφαρμογή τη λήψη της λίστας λογαριασμών που υπάρχουν στο τηλέφωνο. Μπορεί να περιλαμβάνονται τυχόν λογαριασμοί που δημιουργήθηκαν από εφαρμογές που έχετε εγκαταστήσει."</string> - <string name="permlab_accessNetworkState" msgid="4951027964348974773">"προβολή συνδέσεων δικτύου"</string> + <string name="permlab_accessNetworkState" msgid="4951027964348974773">"βλέπει τις συνδέσεις δικτύου"</string> <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Επιτρέπει στην εφαρμογή την προβολή πληροφοριών σχετικά με συνδέσεις δικτύου, όπως ποια δίκτυα υπάρχουν και είναι συνδεδεμένα."</string> - <string name="permlab_createNetworkSockets" msgid="7934516631384168107">"πλήρης πρόσβαση στο δίκτυο"</string> + <string name="permlab_createNetworkSockets" msgid="7934516631384168107">"έχει πλήρη πρόσβαση στο δίκτυο"</string> <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Επιτρέπει στην εφαρμογή τη δημιουργία θέσεων δικτύου και τη χρήση προσαρμοσμένων πρωτοκόλλων δικτύου. Το πρόγραμμα περιήγησης και άλλες εφαρμογές παρέχουν μέσα για την αποστολή δεδομένων στο διαδίκτυο, επομένως η συγκεκριμένη άδεια δεν είναι απαραίτητη για την αποστολή δεδομένων στο διαδίκτυο."</string> - <string name="permlab_changeNetworkState" msgid="958884291454327309">"αλλαγή συνδεσιμότητας δικτύου"</string> + <string name="permlab_changeNetworkState" msgid="958884291454327309">"αλλάζει την συνδεσιμότητα δικτύου"</string> <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Επιτρέπει στην εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου."</string> - <string name="permlab_changeTetherState" msgid="5952584964373017960">"αλλαγή συνδεσιμότητας μέσω σύνδεσης με κινητή συσκευή"</string> + <string name="permlab_changeTetherState" msgid="5952584964373017960">"αλλάζει συνδεσιμότητα μέσω σύνδεσης με κινητή συσκευή"</string> <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Επιτρέπει στην εφαρμογή την αλλαγή της κατάστασης συνδεσιμότητας δικτύου."</string> - <string name="permlab_accessWifiState" msgid="5202012949247040011">"προβολή συνδέσεων Wi-Fi"</string> + <string name="permlab_accessWifiState" msgid="5202012949247040011">"βλέπει τις συνδέσεις Wi-Fi"</string> <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Επιτρέπει στην εφαρμογή την προβολή πληροφοριών σχετικά με τη δικτύωση Wi-Fi, όπως εάν το Wi-Fi είναι ενεργοποιημένο και τα ονόματα των συνδεδεμένων συσκευών Wi-Fi."</string> - <string name="permlab_changeWifiState" msgid="6550641188749128035">"σύνδεση και αποσύνδεση από το Wi-Fi"</string> + <string name="permlab_changeWifiState" msgid="6550641188749128035">"συνδέεται/αποσυνδέεται από το Wi-Fi"</string> <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Επιτρέπει στην εφαρμογή τη σύνδεση σε σημεία πρόσβασης Wi-Fi και την αποσύνδεση από αυτά, καθώς και την πραγματοποίηση αλλαγών σε διαμόρφωση συσκευών για δίκτυα Wi-Fi."</string> - <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"να επιτρέπεται η λήψη πολλαπλής διανομής Wi-Fi"</string> + <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"επιτρέπει την λήψη πολλαπλής διανομής Wi-Fi"</string> <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Επιτρέπει στην εφαρμογή τη λήψη πακέτων που αποστέλλονται σε όλες τις συσκευές σε ένα δίκτυο Wi-Fi, με χρήση διευθύνσεων πολλαπλής διανομής και όχι απλώς στο tablet σας. Χρησιμοποιεί περισσότερη ενέργεια σε σχέση με τη λειτουργία χωρίς πολλαπλή διανομή."</string> <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Επιτρέπει στην εφαρμογή να λαμβάνει πακέτα που αποστέλλονται σε όλες τις συσκευές σε ένα δίκτυο Wi-Fi, χρησιμοποιώντας διευθύνσεις multicast και όχι μόνο την τηλεόρασή σας. Χρησιμοποιεί περισσότερη ενέργεια από τη λειτουργία χωρίς multicast."</string> <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Επιτρέπει στην εφαρμογή τη λήψη πακέτων που αποστέλλονται σε όλες τις συσκευές σε ένα δίκτυο Wi-Fi, με χρήση διευθύνσεων πολλαπλής διανομής και όχι απλώς στο τηλέφωνό σας. Χρησιμοποιεί περισσότερη ενέργεια σε σχέση με τη λειτουργία χωρίς πολλαπλή διανομή."</string> - <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"πρόσβαση στις ρυθμίσεις Bluetooth"</string> + <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"διαβάζει τις ρυθμίσεις Bluetooth"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές."</string> <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"Επιτρέπει στην εφαρμογή να διαμορφώνει το τοπικό Bluetooth στην τηλεόραση, καθώς και να ανακαλύπτει απομακρυσμένες συσκευές και να συνδέεται μαζί τους."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Επιτρέπει στην εφαρμογή τη διαμόρφωση του τοπικού tablet Bluetooth, τον εντοπισμό και τη σύζευξη με απομακρυσμένες συσκευές."</string> @@ -425,17 +425,17 @@ <string name="permdesc_changeWimaxState" product="tablet" msgid="3156456504084201805">"Επιτρέπει στην εφαρμογή τη σύνδεση στο tablet και την αποσύνδεση από αυτό, από δίκτυα WiMAX."</string> <string name="permdesc_changeWimaxState" product="tv" msgid="6022307083934827718">"Επιτρέπει στην εφαρμογή να συνδέει και να αποσυνδέει την τηλεόραση από δίκτυα WiMAX."</string> <string name="permdesc_changeWimaxState" product="default" msgid="697025043004923798">"Επιτρέπει στην εφαρμογή τη σύνδεση στο τηλέφωνο και την αποσύνδεση από αυτό, από δίκτυα WiMAX."</string> - <string name="permlab_bluetooth" msgid="6127769336339276828">"σύζευξη με συσκευές Bluetooth"</string> + <string name="permlab_bluetooth" msgid="6127769336339276828">"πραγματοποιεί σύζευξη με συσκευές Bluetooth"</string> <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στο tablet, καθώς και να πραγματοποιεί και να αποδέχεται συνδέσεις με συνδεδεμένες συσκευές."</string> <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στην τηλεόραση, καθώς και να δημιουργεί και να αποδέχεται συνδέσεις με συσκευές σε σύζευξη."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Επιτρέπει στην εφαρμογή να προβάλλει τη διαμόρφωση του Bluetooth στο τηλέφωνο, καθώς και να πραγματοποιεί και να αποδέχεται συνδέσεις με συνδεδεμένες συσκευές."</string> - <string name="permlab_nfc" msgid="4423351274757876953">"έλεγχος Επικοινωνίας κοντινού πεδίου (Near Field Communication)"</string> + <string name="permlab_nfc" msgid="4423351274757876953">"ελέγχει την Επικοινωνία κοντινού πεδίου (FNC)"</string> <string name="permdesc_nfc" msgid="7120611819401789907">"Επιτρέπει στην εφαρμογή την επικοινωνία με ετικέτες, κάρτες και αναγνώστες της Επικοινωνίας κοντινού πεδίου (NFC)."</string> - <string name="permlab_disableKeyguard" msgid="3598496301486439258">"απενεργοποίηση κλειδώματος οθόνης"</string> + <string name="permlab_disableKeyguard" msgid="3598496301486439258">"απενεργοποιεί το κλείδωμα οθόνης"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Επιτρέπει στην εφαρμογή την απενεργοποίηση του κλειδώματος πληκτρολογίου και άλλης σχετικής ασφάλειας με κωδικό πρόσβασης. Για παράδειγμα, το κλείδωμα πληκτρολογίου στο τηλέφωνο απενεργοποιείται όταν λαμβάνεται εισερχόμενη τηλεφωνική κλήση και ενεργοποιείται ξανά όταν η κλήση τερματιστεί."</string> - <string name="permlab_manageFingerprint" msgid="5640858826254575638">"διαχείριση εξοπλισμού μοναδικού χαρακτηριστικού"</string> + <string name="permlab_manageFingerprint" msgid="5640858826254575638">"διαχειρίζεται τον εξοπλισμό δακτυλικού αποτυπώματος"</string> <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Επιτρέπει στην εφαρμογή να επικαλείται μεθόδους για την προσθήκη και τη διαγραφή προτύπων μοναδικού χαρακτηριστικού για χρήση."</string> - <string name="permlab_useFingerprint" msgid="3150478619915124905">"χρήση εξοπλισμού μοναδικού χαρακτηριστικού"</string> + <string name="permlab_useFingerprint" msgid="3150478619915124905">"χρησιμοποιεί τον εξοπλισμό δακτυλικού αποτυπώματος"</string> <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Επιτρέπει στην εφαρμογή να χρησιμοποιεί εξοπλισμό μοναδικού χαρακτηριστικού για έλεγχο ταυτότητας"</string> <string name="fingerprint_acquired_partial" msgid="735082772341716043">"Εντοπίστηκε μερικό μοναδικό χαρακτηριστικό. Δοκιμάστε ξανά."</string> <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Δεν ήταν δυνατή η επεξεργασία του μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string> @@ -454,65 +454,65 @@ <string-array name="fingerprint_error_vendor"> </string-array> <string name="fingerprint_icon_content_description" msgid="2340202869968465936">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> - <string name="permlab_readSyncSettings" msgid="6201810008230503052">"ανάγνωση ρυθμίσεων συγχρονισμού"</string> + <string name="permlab_readSyncSettings" msgid="6201810008230503052">"διαβάζει τις ρυθμίσεις συγχρονισμού"</string> <string name="permdesc_readSyncSettings" msgid="2706745674569678644">"Επιτρέπει στην εφαρμογή την ανάγνωση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να καθορίσει εάν η εφαρμογή \"Άτομα\" είναι συγχρονισμένη με έναν λογαριασμό."</string> - <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"εναλλαγή ενεργοποίησης και απενεργοποίησης συγχρονισμού"</string> + <string name="permlab_writeSyncSettings" msgid="5408694875793945314">"ενεργοποιεί/απενεργοποιεί τον συγχρονισμό"</string> <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Επιτρέπει σε μια εφαρμογή την τροποποίηση των ρυθμίσεων συγχρονισμού για έναν λογαριασμό. Για παράδειγμα, αυτό μπορεί να χρησιμοποιηθεί για να ενεργοποιηθεί ο συγχρονισμός της εφαρμογής \"Άτομα\" με έναν λογαριασμό."</string> - <string name="permlab_readSyncStats" msgid="7396577451360202448">"ανάγνωση στατιστικών συγχρονισμού"</string> + <string name="permlab_readSyncStats" msgid="7396577451360202448">"διαβάζει στατιστικά στοιχεία συγχρονισμού"</string> <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των στατιστικών στοιχείων συγχρονισμού για έναν λογαριασμό, συμπεριλαμβανομένων του ιστορικού των συμβάντων συγχρονισμού και του όγκου των δεδομένων που συγχρονίζονται."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="367275095159405468">"ανάγν. περιεχ. αποθηκ. χώρ.USB"</string> - <string name="permlab_sdcardRead" product="default" msgid="2188156462934977940">"ανάγνωση του περιεχομένου της κάρτας SD"</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="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"τροποποίηση ή διαγραφή του USB"</string> - <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"τροποποίηση ή διαγραφή των περιεχομένων της κάρτας 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> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Επιτρέπει στην εφαρμογή την εγγραφή στην κάρτα SD."</string> - <string name="permlab_use_sip" msgid="2052499390128979920">"πραγματοποίηση/λήψη κλήσεων SIP"</string> + <string name="permlab_use_sip" msgid="2052499390128979920">"πραγματοποιεί/λαμβάνει κλήσεις SIP"</string> <string name="permdesc_use_sip" msgid="2297804849860225257">"Επιτρέπει στην εφαρμογή να πραγματοποιεί και να λαμβάνει κλήσεις SIP."</string> - <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών"</string> + <string name="permlab_register_sim_subscription" msgid="3166535485877549177">"πραγματοποιεί εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών"</string> <string name="permdesc_register_sim_subscription" msgid="2138909035926222911">"Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων SIM τηλεπικοινωνιών."</string> - <string name="permlab_register_call_provider" msgid="108102120289029841">"εγγραφή νέων συνδέσεων τηλεπικοινωνιών"</string> + <string name="permlab_register_call_provider" msgid="108102120289029841">"πραγματοποιεί εγγραφή των νέων συνδέσεων τηλεπικοινωνιών"</string> <string name="permdesc_register_call_provider" msgid="7034310263521081388">"Επιτρέπει στην εφαρμογή την εγγραφή νέων συνδέσεων τηλεπικοινωνιών."</string> - <string name="permlab_connection_manager" msgid="1116193254522105375">"διαχείριση των συνδέσεων τηλεπικοινωνιών"</string> + <string name="permlab_connection_manager" msgid="1116193254522105375">"διαχειρίζεται τις συνδέσεις τηλεπικοινωνιών"</string> <string name="permdesc_connection_manager" msgid="5925480810356483565">"Επιτρέπει στην εφαρμογή να διαχειρίζεται τις συνδέσεις τηλεπικοινωνιών."</string> - <string name="permlab_bind_incall_service" msgid="6773648341975287125">"αλληλεπίδραση με την οθόνη κατά τη διάρκεια κλήσης"</string> + <string name="permlab_bind_incall_service" msgid="6773648341975287125">"αλληλεπιδρά με την οθόνη κατά τη διάρκεια κλήσης"</string> <string name="permdesc_bind_incall_service" msgid="8343471381323215005">"Επιτρέπει στην εφαρμογή να ελέγχει πότε και πώς βλέπει ο χρήστης την οθόνη κατά τη διάρκεια κλήσης."</string> - <string name="permlab_bind_connection_service" msgid="3557341439297014940">"αλληλεπίδραση με υπηρεσίες τηλεφωνίας"</string> + <string name="permlab_bind_connection_service" msgid="3557341439297014940">"αλληλεπιδρά με υπηρεσίες τηλεφωνίας"</string> <string name="permdesc_bind_connection_service" msgid="4008754499822478114">"Επιτρέπει στην εφαρμογή να αλληλεπιδρά με υπηρεσίες τηλεφωνίας για την πραγματοποίηση/λήψη κλήσεων."</string> - <string name="permlab_control_incall_experience" msgid="9061024437607777619">"παροχή εμπειρίας χρήστη κατά τη διάρκεια κλήσης"</string> + <string name="permlab_control_incall_experience" msgid="9061024437607777619">"παρέχει εμπειρία χρήστη κατά τη διάρκεια κλήσης"</string> <string name="permdesc_control_incall_experience" msgid="915159066039828124">"Επιτρέπει στην εφαρμογή να παρέχει μια εμπειρία στο χρήστη κατά τη διάρκεια κλήσης."</string> - <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"ανάγνωση ιστορικών δεδομένων χρήσης δικτύου"</string> + <string name="permlab_readNetworkUsageHistory" msgid="7862593283611493232">"διαβάζει ιστορικά στοιχεία δεδομένων χρήσης δικτύου"</string> <string name="permdesc_readNetworkUsageHistory" msgid="7689060749819126472">"Επιτρέπει στην εφαρμογή την ανάγνωση ιστορικών στοιχείων χρήσης δικτύου για συγκεκριμένα δίκτυα και εφαρμογές."</string> - <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"διαχείριση πολιτικής δικτύου"</string> + <string name="permlab_manageNetworkPolicy" msgid="2562053592339859990">"διαχειρίζεται την πολιτική δικτύου"</string> <string name="permdesc_manageNetworkPolicy" msgid="7537586771559370668">"Επιτρέπει στην εφαρμογή τη διαχείριση των πολιτικών δικτύου και τον ορισμό κανόνων για ορισμένες εφαρμογές."</string> - <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"τροποποίηση υπολογισμού χρήσης δικτύου"</string> + <string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"τροποποιεί τον υπολογισμό χρήσης δικτύου"</string> <string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Επιτρέπει στην εφαρμογή την τροποποίηση του τρόπου υπολογισμού της χρήσης δικτύου έναντι των εφαρμογών. Δεν προορίζεται για χρήση από συνήθεις εφαρμογές."</string> - <string name="permlab_accessNotifications" msgid="7673416487873432268">"πρόσβαση στις ειδοποιήσεις"</string> + <string name="permlab_accessNotifications" msgid="7673416487873432268">"έχει πρόσβαση στις ειδοποιήσεις"</string> <string name="permdesc_accessNotifications" msgid="458457742683431387">"Επιτρέπει στην εφαρμογή να ανακτά, να εξετάζει και να απαλείφει ειδοποιήσεις, συμπεριλαμβανομένων εκείνων που δημοσιεύονται από άλλες εφαρμογές."</string> - <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"δέσμευση σε υπηρεσία ακρόασης ειδοποίησης"</string> + <string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"συνδέεται σε υπηρεσία ακρόασης ειδοποίησης"</string> <string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας ακρόασης ειδοποιήσεων. Δεν απαιτείται σε κανονικές εφαρμογές."</string> - <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"σύνδεση σε μια υπηρεσία παρόχου συνθηκών"</string> + <string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"δεσμεύεται σε μια υπηρεσία παρόχου συνθηκών"</string> <string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"Επιτρέπει στον κάτοχο τη σύνδεση στη διεπαφή ανωτάτου επιπέδου ενός παρόχου συνθηκών. Δεν απαιτείται για κανονικές εφαρμογές."</string> - <string name="permlab_bindDreamService" msgid="4153646965978563462">"δέσμευση σε υπηρεσία dream"</string> + <string name="permlab_bindDreamService" msgid="4153646965978563462">"δεσμεύεται σε υπηρεσία dream"</string> <string name="permdesc_bindDreamService" msgid="7325825272223347863">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας dream. Δεν απαιτείται σε κανονικές εφαρμογές."</string> - <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"κλήση της εφαρμογής διαμόρφωσης που παρέχεται από την εταιρεία κινητής τηλεφωνίας"</string> + <string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"καλέι την εφαρμογή διαμόρφωσης του παρόχου κινητής τηλεφωνίας"</string> <string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"Επιτρέπει στον κάτοχο την κλήση της εφαρμογής διαμόρφωσης που παρέχεται από την εταιρεία κινητής τηλεφωνίας. Δεν απαιτείται για κανονικές εφαρμογές."</string> - <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"λήψη παρατηρήσεων σχετικά με την κατάσταση δικτύου"</string> + <string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"ανιχνεύει παρατηρήσεις σχετικά με την κατάσταση δικτύου"</string> <string name="permdesc_accessNetworkConditions" msgid="6899102075825272211">"Επιτρέπει σε μια εφαρμογή να λαμβάνει παρατηρήσεις σχετικά με την κατάσταση δικτύου. Δεν θα πρέπει να απαιτείται ποτέ για κανονικές εφαρμογές."</string> <string name="permlab_setInputCalibration" msgid="4902620118878467615">"αλλαγή βαθμονόμησης της συσκευής εισόδου"</string> <string name="permdesc_setInputCalibration" msgid="4527511047549456929">"Επιτρέπει στην εφαρμογή να τροποποιεί τις παραμέτρους βαθμονόμησης της οθόνης αφής. Δεν απαιτείται για τις κανονικές εφαρμογές."</string> - <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"πρόσβαση σε πιστοποιητικά DRM"</string> + <string name="permlab_accessDrmCertificates" msgid="7436886640723203615">"έχει πρόσβαση σε πιστοποιητικά DRM"</string> <string name="permdesc_accessDrmCertificates" msgid="8073288354426159089">"Επιτρέπει σε μια εφαρμογή να παρέχει και να χρησιμοποιεί πιστοποιητικά DRM. Δεν θα χρειαστεί ποτέ για κανονικές εφαρμογές."</string> <string name="permlab_handoverStatus" msgid="7820353257219300883">"λήψη κατάστασης μεταφοράς Android Beam"</string> <string name="permdesc_handoverStatus" msgid="4788144087245714948">"Επιτρέπει σε αυτήν την εφαρμογή να λαμβάνει πληροφορίες σχετικά με τις τρέχουσες μεταφορές Android Beam"</string> - <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"κατάργηση πιστοποιητικών DRM"</string> + <string name="permlab_removeDrmCertificates" msgid="7044888287209892751">"καταργεί πιστοποιητικά DRM"</string> <string name="permdesc_removeDrmCertificates" msgid="7272999075113400993">"Επιτρέπει σε μια εφαρμογή την κατάργηση πιστοποιητικών DRM. Δεν χρειάζεται ποτέ για κανονικές εφαρμογές."</string> - <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"δέσμευση σε υπηρεσία ανταλλαγής μηνυμάτων εταιρείας κινητής τηλεφωνίας"</string> + <string name="permlab_bindCarrierMessagingService" msgid="1490229371796969158">"δεσμεύεται σε υπηρεσία ανταλλαγής μηνυμάτων παρόχου κινητής τηλεφωνίας"</string> <string name="permdesc_bindCarrierMessagingService" msgid="2762882888502113944">"Επιτρέπει στον κάτοχο τη δέσμευση στη διεπαφή ανωτάτου επιπέδου μιας υπηρεσίας ανταλλαγής μηνυμάτων εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται για συνήθεις εφαρμογές."</string> - <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"δέσμευση σε υπηρεσίες εταιρείας κινητής τηλεφωνίας"</string> + <string name="permlab_bindCarrierServices" msgid="3233108656245526783">"δεσμεύεται σε υπηρεσίες του παρόχου κινητής τηλεφωνίας"</string> <string name="permdesc_bindCarrierServices" msgid="1391552602551084192">"Δίνει στον κάτοχο τη δυνατότητα δέσμευσης σε υπηρεσίες εταιρείας κινητής τηλεφωνίας. Δεν απαιτείται ποτέ για κανονικές εφαρμογές."</string> - <string name="permlab_access_notification_policy" msgid="4247510821662059671">"πρόσβαση στη λειτουργία \"Μην ενοχλείτε\""</string> + <string name="permlab_access_notification_policy" msgid="4247510821662059671">"έχει πρόσβαση στη λειτουργία \"Μην ενοχλείτε\""</string> <string name="permdesc_access_notification_policy" msgid="3296832375218749580">"Επιτρέπει στην εφαρμογή την εγγραφή και τη σύνταξη διαμόρφωσης για τη λειτουργία \"Μην ενοχλείτε\"."</string> <string name="policylab_limitPassword" msgid="4497420728857585791">"Ορισμός κανόνων κωδικού πρόσβασης"</string> <string name="policydesc_limitPassword" msgid="2502021457917874968">"Ελέγξτε την έκταση και τους επιτρεπόμενους χαρακτήρες σε κωδικούς πρόσβασης κλειδώματος οθόνης και PIN."</string> @@ -792,17 +792,17 @@ <string name="autofill_parish" msgid="8202206105468820057">"Ενορία"</string> <string name="autofill_area" msgid="3547409050889952423">"Περιοχή"</string> <string name="autofill_emirate" msgid="2893880978835698818">"Εμιράτο"</string> - <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"ανάγνωση των σελιδοδεικτών και του ιστορικού ιστού σας"</string> + <string name="permlab_readHistoryBookmarks" msgid="3775265775405106983">"διαβάζει τους σελιδοδείκτες και το ιστορικού ιστού"</string> <string name="permdesc_readHistoryBookmarks" msgid="8462378226600439658">"Επιτρέπει στην εφαρμογή την ανάγνωση του ιστορικού όλων των διευθύνσεων URL που έχει επισκεφτεί το πρόγραμμα περιήγησης, καθώς και όλων των σελιδοδεικτών του προγράμματος περιήγησης. Σημείωση: αυτή η άδεια ίσως να μην μπορεί να εφαρμοστεί από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης ιστού."</string> - <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"εγγραφή σελιδοδεικτών και ιστορικού ιστού"</string> + <string name="permlab_writeHistoryBookmarks" msgid="3714785165273314490">"εγγράφει σελιδοδείκτες και ιστορικό ιστού"</string> <string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="6825527469145760922">"Επιτρέπει στην εφαρμογή την τροποποίηση του ιστορικού του προγράμματος περιήγησης ή των σελιδοδεικτών που έχουν αποθηκευτεί στο tablet σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να διαγράφει ή να τροποποιεί δεδομένα του προγράμματος περιήγησης. Σημείωση: αυτή η άδεια ίσως να μην μπορεί να εφαρμοστεί από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης ιστού."</string> <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"Επιτρέπει στην εφαρμογή να τροποποιεί το ιστορικό του προγράμματος περιήγησης ή τους σελιδοδείκτες που είναι αποθηκευμένοι στην τηλεόρασή σας. Σημείωση: Αυτό το δικαίωμα δεν πρέπει να εφαρμόζεται από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης στον ιστό."</string> <string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"Επιτρέπει στην εφαρμογή την τροποποίηση του ιστορικού του προγράμματος περιήγησης ή των σελιδοδεικτών που έχουν αποθηκευτεί στο τηλέφωνό σας. Αυτό μπορεί να δίνει τη δυνατότητα στην εφαρμογή να διαγράφει ή να τροποποιεί δεδομένα του προγράμματος περιήγησης. Σημείωση: αυτή η άδεια ίσως να μην μπορεί να εφαρμοστεί από τρίτα προγράμματα περιήγησης ή άλλες εφαρμογές με δυνατότητες περιήγησης ιστού."</string> - <string name="permlab_setAlarm" msgid="1379294556362091814">"ρύθμιση ξυπνητηριού"</string> + <string name="permlab_setAlarm" msgid="1379294556362091814">"ρυθμίζει το ξυπνητήρι"</string> <string name="permdesc_setAlarm" msgid="316392039157473848">"Επιτρέπει στην εφαρμογή τη ρύθμιση μιας ειδοποίησης σε μια εγκατεστημένη εφαρμογή ξυπνητηριού. Ορισμένες εφαρμογές ξυπνητηριού ενδέχεται να μην μπορούν να ενσωματώσουν αυτήν τη λειτουργία."</string> - <string name="permlab_addVoicemail" msgid="5525660026090959044">"προσθήκη τηλεφωνητή"</string> + <string name="permlab_addVoicemail" msgid="5525660026090959044">"προσθέτει τηλεφωνητή"</string> <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Επιτρέπει στην εφαρμογή να προσθέτει μηνύματα στα εισερχόμενα του αυτόματου τηλεφωνητή σας."</string> - <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"τροποποίηση δικαιωμάτων γεωγραφικής θέσης του Προγράμματος περιήγησης"</string> + <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"τροποποιεί δικαιώματα γεωγραφικής θέσης του Προγράμματος περιήγησης"</string> <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Επιτρέπει στην εφαρμογή την τροποποίηση των αδειών γεωτοποθεσίας του Προγράμματος περιήγησης. Τυχόν κακόβουλες εφαρμογές ενδέχεται να το χρησιμοποιήσουν για να επιτρέψουν την αποστολή πληροφοριών τοποθεσίας σε αυθαίρετους ιστότοπους."</string> <string name="save_password_message" msgid="767344687139195790">"Θέλετε το πρόγραμμα περιήγησης να διατηρήσει αυτόν τον κωδικό πρόσβασης;"</string> <string name="save_password_notnow" msgid="6389675316706699758">"Να μην γίνει τώρα"</string> @@ -1202,11 +1202,11 @@ <string name="ext_media_status_formatting" msgid="1085079556538644861">"Διαμόρφωση…"</string> <string name="ext_media_status_missing" msgid="5638633895221670766">"Δεν έχει εισαχθεί"</string> <string name="activity_list_empty" msgid="1675388330786841066">"Δεν βρέθηκαν δραστηριότητες που να συμφωνούν με τα κριτήρια."</string> - <string name="permlab_route_media_output" msgid="6243022988998972085">"δρομολόγηση εξόδου μέσων"</string> + <string name="permlab_route_media_output" msgid="6243022988998972085">"δρομολογεί την έξοδο μέσων"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"Επιτρέπει σε μια εφαρμογή τη διαγραφή διαδρομής δεδομένων εξόδου μέσων σε άλλες εξωτερικές συσκευές."</string> - <string name="permlab_readInstallSessions" msgid="3713753067455750349">"ανάγνωση περιόδων σύνδεσης εγκατάστασης"</string> + <string name="permlab_readInstallSessions" msgid="3713753067455750349">"διαβάζει τις περιόδους σύνδεσης εγκατάστασης"</string> <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"Επιτρέπει σε μια εφαρμογή την ανάγνωση των περιόδων σύνδεσης εγκατάστασης. Αυτό της επιτρέπει να βλέπει λεπτομέρειες σχετικά με τις εγκαταστάσεις του ενεργού πακέτου."</string> - <string name="permlab_requestInstallPackages" msgid="5782013576218172577">"αίτημα εγκατάστασης πακέτων"</string> + <string name="permlab_requestInstallPackages" msgid="5782013576218172577">"ζητά πακέτα εγκατάστασης"</string> <string name="permdesc_requestInstallPackages" msgid="5740101072486783082">"Επιτρέπει σε μια εφαρμογή να ζητά εγκατάσταση πακέτων."</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"Πατήστε δύο φορές για έλεγχο εστίασης"</string> <string name="gadget_host_error_inflating" msgid="4882004314906466162">"Δεν ήταν δυνατή η προσθήκη του γραφικού στοιχείου."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index c63a2ea3e911..c6d6663c2d6a 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1569,7 +1569,7 @@ <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizado por tu administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eliminado por tu administrador"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para ayudar a mejorar la duración de la batería, la función de ahorro de energía reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de energía se desactiva automáticamente cuando el dispositivo se está cargando."</string> - <string name="data_saver_description" msgid="6015391409098303235">"El Economizador de Datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string> + <string name="data_saver_description" msgid="6015391409098303235">"El ahorro de datos evita que algunas aplicaciones envíen o reciban datos en segundo plano, lo que permite reducir el uso de datos. Una aplicación activa podrá acceder a los datos, aunque con menos frecuencia. Esto significa que, por ejemplo, algunas imágenes no se muestren hasta que no las toques."</string> <string name="data_saver_enable_title" msgid="4674073932722787417">"¿Activar ahorro de datos?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"Activar"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 635494c69ce3..fefca0ccd58b 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -254,7 +254,7 @@ <string name="permgrouplab_storage" msgid="1971118770546336966">"Penyimpanan"</string> <string name="permgroupdesc_storage" msgid="637758554581589203">"mengakses foto, media, dan file di perangkat"</string> <string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string> - <string name="permgroupdesc_microphone" msgid="4988812113943554584">"rekam audio"</string> + <string name="permgroupdesc_microphone" msgid="4988812113943554584">"merekam audio"</string> <string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string> <string name="permgroupdesc_camera" msgid="3250611594678347720">"mengambil gambar dan merekam video"</string> <string name="permgrouplab_phone" msgid="5229115638567440675">"Telepon"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index 7c244a8ad9a7..7cb97a7c56b7 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -815,9 +815,9 @@ <string name="menu_space_shortcut_label" msgid="2410328639272162537">"space"</string> <string name="menu_enter_shortcut_label" msgid="2743362785111309668">"enter"</string> <string name="menu_delete_shortcut_label" msgid="3658178007202748164">"ಅಳಿಸು"</string> - <string name="search_go" msgid="8298016669822141719">"ಹುಡುಕು"</string> + <string name="search_go" msgid="8298016669822141719">"ಹುಡುಕಿ"</string> <string name="search_hint" msgid="1733947260773056054">"ಹುಡುಕಿ…"</string> - <string name="searchview_description_search" msgid="6749826639098512120">"ಹುಡುಕು"</string> + <string name="searchview_description_search" msgid="6749826639098512120">"ಹುಡುಕಿ"</string> <string name="searchview_description_query" msgid="5911778593125355124">"ಪ್ರಶ್ನೆಯನ್ನು ಹುಡುಕಿ"</string> <string name="searchview_description_clear" msgid="1330281990951833033">"ಪ್ರಶ್ನೆಯನ್ನು ತೆರವುಗೊಳಿಸು"</string> <string name="searchview_description_submit" msgid="2688450133297983542">"ಪ್ರಶ್ನೆಯನ್ನು ಸಲ್ಲಿಸು"</string> @@ -1211,7 +1211,7 @@ <string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"ಝೂಮ್ ನಿಯಂತ್ರಿಸಲು ಎರಡು ಬಾರಿ ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="gadget_host_error_inflating" msgid="4882004314906466162">"ವಿಜೆಟ್ ಸೇರಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ."</string> <string name="ime_action_go" msgid="8320845651737369027">"ಹೋಗು"</string> - <string name="ime_action_search" msgid="658110271822807811">"ಹುಡುಕು"</string> + <string name="ime_action_search" msgid="658110271822807811">"ಹುಡುಕಿ"</string> <string name="ime_action_send" msgid="2316166556349314424">"ಕಳುಹಿಸು"</string> <string name="ime_action_next" msgid="3138843904009813834">"ಮುಂದೆ"</string> <string name="ime_action_done" msgid="8971516117910934605">"ಮುಗಿದಿದೆ"</string> @@ -1269,8 +1269,8 @@ <string name="share" msgid="1778686618230011964">"ಹಂಚು"</string> <string name="find" msgid="4808270900322985960">"ಹುಡುಕಿ"</string> <string name="websearch" msgid="4337157977400211589">"ವೆಬ್ ಹುಡುಕಾಟ"</string> - <string name="find_next" msgid="5742124618942193978">"ಮುಂದಿನದನ್ನು ಹುಡುಕು"</string> - <string name="find_previous" msgid="2196723669388360506">"ಹಿಂದಿನದನ್ನು ಹುಡುಕು"</string> + <string name="find_next" msgid="5742124618942193978">"ಮುಂದಿನದನ್ನು ಹುಡುಕಿ"</string> + <string name="find_previous" msgid="2196723669388360506">"ಹಿಂದಿನದನ್ನು ಹುಡುಕಿ"</string> <string name="gpsNotifTicker" msgid="5622683912616496172">"<xliff:g id="NAME">%s</xliff:g> ಅವರಿಂದ ಸ್ಥಾನ ವಿನಂತಿ"</string> <string name="gpsNotifTitle" msgid="5446858717157416839">"ಸ್ಥಾನ ವಿನಂತಿ"</string> <string name="gpsNotifMessage" msgid="1374718023224000702">"<xliff:g id="NAME">%1$s</xliff:g> (<xliff:g id="SERVICE">%2$s</xliff:g>) ಅವರಿಂದ ವಿನಂತಿಸಲಾಗಿದೆ"</string> @@ -1649,7 +1649,7 @@ <string name="language_picker_section_suggested" msgid="8414489646861640885">"ಸೂಚಿತ ಭಾಷೆ"</string> <string name="language_picker_section_all" msgid="3097279199511617537">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string> <string name="region_picker_section_all" msgid="8966316787153001779">"ಎಲ್ಲಾ ಪ್ರದೇಶಗಳು"</string> - <string name="locale_search_menu" msgid="2560710726687249178">"ಹುಡುಕು"</string> + <string name="locale_search_menu" msgid="2560710726687249178">"ಹುಡುಕಿ"</string> <string name="work_mode_off_title" msgid="8954725060677558855">"ಕೆಲಸದ ಮೋಡ್ ಆಫ್ ಆಗಿದೆ"</string> <string name="work_mode_off_message" msgid="3286169091278094476">"ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಹಿನ್ನೆಲೆ ಸಿಂಕ್ ಮತ್ತು ಇತರ ಸಂಬಂಧಿತ ವೈಶಿಷ್ಟ್ಯಗಳು ಸೇರಿದಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಅನುಮತಿಸಿ."</string> <string name="work_mode_turn_on" msgid="2062544985670564875">"ಆನ್ ಮಾಡು"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 7aed9efc8623..9952a7c5a109 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1105,7 +1105,7 @@ <string name="volume_icon_description_media" msgid="4217311719665194215">"Medijos garsumas"</string> <string name="volume_icon_description_notification" msgid="7044986546477282274">"Pranešimo apimtis"</string> <string name="ringtone_default" msgid="3789758980357696936">"Numatytasis skambėjimo tonas"</string> - <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Numatytasis skambėjimo tonas (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> + <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Numatytasis skambėjimo tonas („<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>“)"</string> <string name="ringtone_silent" msgid="7937634392408977062">"Nėra"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Skambėjimo tonai"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Nežinomas skambėjimo tonas"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index ff828b3441a1..395b049c1d2d 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -152,7 +152,7 @@ <string name="httpErrorAuth" msgid="1435065629438044534">"Није могуће потврдити аутентичност."</string> <string name="httpErrorProxyAuth" msgid="1788207010559081331">"Потврда идентитета преко прокси сервера није успела."</string> <string name="httpErrorConnect" msgid="8714273236364640549">"Није могуће повезати се са сервером."</string> - <string name="httpErrorIO" msgid="2340558197489302188">"Није могуће комуницирати са сервером. Покушајте поново касније."</string> + <string name="httpErrorIO" msgid="2340558197489302188">"Није могуће комуницирати са сервером. Пробајте поново касније."</string> <string name="httpErrorTimeout" msgid="4743403703762883954">"Веза са сервером је истекла."</string> <string name="httpErrorRedirectLoop" msgid="8679596090392779516">"Страница садржи превише веза за преусмеравање са сервера."</string> <string name="httpErrorUnsupportedScheme" msgid="5015730812906192208">"Протокол није подржан."</string> @@ -160,7 +160,7 @@ <string name="httpErrorBadUrl" msgid="3636929722728881972">"Страницу није могуће отворити зато што је URL адреса неважећа."</string> <string name="httpErrorFile" msgid="2170788515052558676">"Није могуће приступити датотеци."</string> <string name="httpErrorFileNotFound" msgid="6203856612042655084">"Није могуће пронаћи тражену датотеку."</string> - <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Превише захтева се обрађује. Покушајте поново касније."</string> + <string name="httpErrorTooManyRequests" msgid="1235396927087188253">"Превише захтева се обрађује. Пробајте поново касније."</string> <string name="notification_title" msgid="8967710025036163822">"Грешка при пријављивању за <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string> <string name="contentServiceSync" msgid="8353523060269335667">"Синхронизација"</string> <string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Синхронизација"</string> @@ -440,19 +440,19 @@ <string name="permdesc_manageFingerprint" msgid="178208705828055464">"Дозвољава апликацији да активира методе за додавање и брисање шаблона отисака прстију који ће се користити."</string> <string name="permlab_useFingerprint" msgid="3150478619915124905">"користи хардвер за отиске прстију"</string> <string name="permdesc_useFingerprint" msgid="9165097460730684114">"Дозвољава апликацији да користи хардвер за отиске прстију ради потврде аутентичности"</string> - <string name="fingerprint_acquired_partial" msgid="735082772341716043">"Откривен је делимични отисак прста. Покушајте поново."</string> - <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Није успела обрада отиска прста. Покушајте поново."</string> + <string name="fingerprint_acquired_partial" msgid="735082772341716043">"Откривен је делимични отисак прста. Пробајте поново."</string> + <string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"Није успела обрада отиска прста. Пробајте поново."</string> <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"Сензор за отиске прстију је прљав. Очистите га и покушајте поново."</string> - <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Пребрзо сте померили прст. Покушајте поново."</string> - <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Превише споро сте померили прст. Покушајте поново."</string> + <string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"Пребрзо сте померили прст. Пробајте поново."</string> + <string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Превише споро сте померили прст. Пробајте поново."</string> <string-array name="fingerprint_acquired_vendor"> </string-array> <string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Хардвер за отиске прстију није доступан."</string> <string name="fingerprint_error_no_space" msgid="1055819001126053318">"Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију."</string> - <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Покушајте поново."</string> + <string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Пробајте поново."</string> <string name="fingerprint_error_canceled" msgid="4402024612660774395">"Радња са отиском прста је отказана."</string> - <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Превише покушаја. Покушајте поново касније."</string> - <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Покушајте поново."</string> + <string name="fingerprint_error_lockout" msgid="5536934748136933450">"Превише покушаја. Пробајте поново касније."</string> + <string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Пробајте поново."</string> <string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string> <string-array name="fingerprint_error_vendor"> </string-array> @@ -680,8 +680,8 @@ <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Хитне службе"</string> <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Назад на позив"</string> <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"Тачно!"</string> - <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Покушајте поново"</string> - <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Покушајте поново"</string> + <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Пробајте поново"</string> + <string name="lockscreen_password_wrong" msgid="5737815393253165301">"Пробајте поново"</string> <string name="lockscreen_storage_locked" msgid="9167551160010625200">"Откључај за све функције и податке"</string> <string name="faceunlock_multiple_failures" msgid="754137583022792429">"Премашен је највећи дозвољени број покушаја Откључавања лицем"</string> <string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"Нема SIM картице"</string> @@ -705,19 +705,19 @@ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Погледајте Кориснички водич или контактирајте Корисничку подршку."</string> <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM картица је закључана."</string> <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"Откључавање SIM картице…"</string> - <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте неправилно нацртали шаблон за откључавање. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> - <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте погрешно унели лозинку. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> - <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте погрешно унели PIN. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте нетачно унели шаблон за откључавање. Након још <xliff:g id="NUMBER_1">%2$d</xliff:g> несупешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу података за пријављивање на Google.\n\n Покушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"Неисправно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја од вас ће бити затражено да откључате ТВ помоћу података за пријављивање на Google.\n\n Покушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте нетачно унели шаблон за откључавање. Након још <xliff:g id="NUMBER_1">%2$d</xliff:g> несупешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу података за пријављивање на Google.\n\n Покушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> + <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте неправилно нацртали шаблон за откључавање. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте погрешно унели лозинку. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте погрешно унели PIN. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте нетачно унели шаблон за откључавање. Након још <xliff:g id="NUMBER_1">%2$d</xliff:g> несупешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу података за пријављивање на Google.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"Неисправно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја од вас ће бити затражено да откључате ТВ помоћу података за пријављивање на Google.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"<xliff:g id="NUMBER_0">%1$d</xliff:g> пута сте нетачно унели шаблон за откључавање. Након још <xliff:g id="NUMBER_1">%2$d</xliff:g> несупешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу података за пријављивање на Google.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Неправилно сте покушали да откључате таблет <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Након још неуспешних покушаја (<xliff:g id="NUMBER_1">%2$d</xliff:g>) таблет ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"Покушали сте да откључате ТВ нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја ТВ ће бити ресетован на подразумевана фабричка подешавања и сви кориснички подаци ће бити изгубљени."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Неисправно сте покушали да откључате телефон <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Након још неуспешних покушаја (<xliff:g id="NUMBER_1">%2$d</xliff:g>) телефон ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Неисправно сте покушали да откључате таблет <xliff:g id="NUMBER">%d</xliff:g> пута. Таблет ће сада бити враћен на подразумевана фабричка подешавања."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"Покушали сте да откључате ТВ нетачно <xliff:g id="NUMBER">%d</xliff:g> пута. ТВ ће сада бити ресетован на подразумевана фабричка подешавања."</string> <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Неисправно сте покушали да откључате телефон <xliff:g id="NUMBER">%d</xliff:g> пута. Телефон ће сада бити враћен на подразумевана фабричка подешавања."</string> - <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Покушајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде(и)."</string> + <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Пробајте поново за <xliff:g id="NUMBER">%d</xliff:g> секунде(и)."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Заборавили сте шаблон?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Откључавање налога"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Превише покушаја уноса шаблона"</string> @@ -1421,7 +1421,7 @@ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Погрешан шаблон"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Погрешна лозинка"</string> <string name="kg_wrong_pin" msgid="1131306510833563801">"Погрешан PIN"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Покушајте поново за <xliff:g id="NUMBER">%1$d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Пробајте поново за <xliff:g id="NUMBER">%1$d</xliff:g> секунде(и)."</string> <string name="kg_pattern_instructions" msgid="398978611683075868">"Нацртајте шаблон"</string> <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Унесите PIN SIM картице"</string> <string name="kg_pin_instructions" msgid="2377242233495111557">"Унесите PIN"</string> @@ -1443,18 +1443,18 @@ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Неважеће корисничко име или лозинка."</string> <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Заборавили сте корисничко име или лозинку?\nПосетите адресу "<b>"google.com/accounts/recovery"</b>"."</string> <string name="kg_login_checking_password" msgid="1052685197710252395">"Провера налога…"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Унели сте нетачни PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Унели сте нетачну лозинку <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПокушајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Унели сте нетачни PIN <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Унели сте нетачну лозинку <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. \n\nПробајте поново за <xliff:g id="NUMBER_1">%2$d</xliff:g> секунде(и)."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Покушали сте да откључате таблет нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. Након још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја таблет ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"Покушали сте да откључате ТВ нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја ТВ ће бити ресетован на подразумевана фабричка подешавања и сви кориснички подаци ће бити изгубљени."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Покушали сте да откључате телефон нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја телефон ће бити ресетован на фабричка подешавања и сви кориснички подаци ће бити изгубљени."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Покушали сте да откључате таблет нетачно <xliff:g id="NUMBER">%d</xliff:g> пута. Таблет ће сада бити враћен на подразумевана фабричка подешавања."</string> <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"Покушали сте да откључате ТВ нетачно <xliff:g id="NUMBER">%d</xliff:g> пута. ТВ ће сада бити ресетован на подразумевана фабричка подешавања."</string> <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Покушали сте да откључате телефон нетачно <xliff:g id="NUMBER">%d</xliff:g> пута. Телефон ће сада бити враћен на подразумевана фабричка подешавања."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПокушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> - <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Неисправно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате ТВ помоћу налога е-поште.\n\n Покушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПокушајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате таблет помоћу налога е-поште.\n\nПробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> + <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Неисправно сте нацртали шаблон за откључавање <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате ТВ помоћу налога е-поште.\n\n Пробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> сек."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Нацртали сте шаблон за откључавање нетачно <xliff:g id="NUMBER_0">%1$d</xliff:g> пута. После још <xliff:g id="NUMBER_1">%2$d</xliff:g> неуспешна(их) покушаја, од вас ће бити затражено да откључате телефон помоћу налога е-поште.\n\nПробајте поново за <xliff:g id="NUMBER_2">%3$d</xliff:g> секунде(и)."</string> <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" – "</string> <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Уклони"</string> <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Желите да појачате звук изнад препорученог нивоа?\n\nСлушање гласне музике дуже време може да вам оштети слух."</string> @@ -1565,14 +1565,14 @@ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Нови PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Потврдите нови PIN"</string> <string name="restr_pin_create_pin" msgid="8017600000263450337">"Направите PIN за измену ограничења"</string> - <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ови се не подударају. Покушајте поново."</string> + <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ови се не подударају. Пробајте поново."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN је прекратак. Мора да садржи најмање 4 цифре."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688"> - <item quantity="one">Покушајте поново за <xliff:g id="COUNT">%d</xliff:g> секунду</item> - <item quantity="few">Покушајте поново за <xliff:g id="COUNT">%d</xliff:g> секунде</item> - <item quantity="other">Покушајте поново за <xliff:g id="COUNT">%d</xliff:g> секунди</item> + <item quantity="one">Пробајте поново за <xliff:g id="COUNT">%d</xliff:g> секунду</item> + <item quantity="few">Пробајте поново за <xliff:g id="COUNT">%d</xliff:g> секунде</item> + <item quantity="other">Пробајте поново за <xliff:g id="COUNT">%d</xliff:g> секунди</item> </plurals> - <string name="restr_pin_try_later" msgid="973144472490532377">"Покушајте поново касније"</string> + <string name="restr_pin_try_later" msgid="973144472490532377">"Пробајте поново касније"</string> <string name="immersive_cling_title" msgid="8394201622932303336">"Приказује се цео екран"</string> <string name="immersive_cling_description" msgid="3482371193207536040">"Да бисте изашли, превуците надоле одозго."</string> <string name="immersive_cling_positive" msgid="5016839404568297683">"Важи"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index e210f87e090c..704ade8e27dd 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1104,8 +1104,8 @@ <string name="volume_icon_description_incall" msgid="8890073218154543397">"Гучність сигналу виклику"</string> <string name="volume_icon_description_media" msgid="4217311719665194215">"Гучність медіа"</string> <string name="volume_icon_description_notification" msgid="7044986546477282274">"Гучність сповіщення"</string> - <string name="ringtone_default" msgid="3789758980357696936">"Мелодія за умовч."</string> - <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Мелодія за умовч. (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> + <string name="ringtone_default" msgid="3789758980357696936">"Мелодія за умовчанням"</string> + <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Мелодія за умовчанням (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> <string name="ringtone_silent" msgid="7937634392408977062">"Немає"</string> <string name="ringtone_picker_title" msgid="3515143939175119094">"Мелодії"</string> <string name="ringtone_unknown" msgid="5477919988701784788">"Невідома мелодія"</string> diff --git a/core/res/res/values-watch/colors_device_defaults.xml b/core/res/res/values-watch/colors_device_defaults.xml new file mode 100644 index 000000000000..9150cc409e13 --- /dev/null +++ b/core/res/res/values-watch/colors_device_defaults.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2016 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- Colors specific to DeviceDefault themes. These are mostly pass-throughs to enable + overlaying new theme colors. --> +<resources> + <color name="button_normal_device_default_dark">@color/btn_default_material_dark</color> +</resources> diff --git a/core/res/res/values-watch/colors_material.xml b/core/res/res/values-watch/colors_material.xml index 54eece4f2bdf..18bfd4db5ae0 100644 --- a/core/res/res/values-watch/colors_material.xml +++ b/core/res/res/values-watch/colors_material.xml @@ -17,8 +17,10 @@ <color name="background_material_dark">#ff232e33</color> <color name="background_floating_material_dark">#ff3e5059</color> - <color name="accent_material_dark">#ff5e97f6</color> + <color name="accent_material_700">#ff2e4978</color> <color name="accent_material_light">#ff4285f4</color> + <color name="accent_material_dark">#ff5e97f6</color> + <color name="accent_material_50">#ffd0def7</color> <color name="primary_material_dark">#4D4D4D</color> diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml index 8a080d9c155d..af4207ed4e6f 100644 --- a/core/res/res/values-watch/styles_material.xml +++ b/core/res/res/values-watch/styles_material.xml @@ -95,7 +95,7 @@ please see styles_device_defaults.xml. </style> <style name="DialogWindowTitle.Material"> - <item name="maxLines">3</item> + <item name="maxLines">@empty</item> <item name="scrollHorizontally">false</item> <item name="textAppearance">@style/TextAppearance.Material.DialogWindowTitle</item> <item name="gravity">@integer/config_dialogTextGravity</item> diff --git a/core/res/res/values-watch/themes_device_defaults.xml b/core/res/res/values-watch/themes_device_defaults.xml index 2313b26c1f8d..aa1594d46516 100644 --- a/core/res/res/values-watch/themes_device_defaults.xml +++ b/core/res/res/values-watch/themes_device_defaults.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Copyright (C) 2014 The Android Open Source Project +<!-- Copyright (C) 2011 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. @@ -18,26 +18,328 @@ =============================================================== PLEASE READ =============================================================== -This file contains the themes that are the Device Defaults. -If you want to edit themes to skin your device, do it here. -We recommend that you do not edit themes.xml and instead edit -this file. - -Editing this file instead of themes.xml will greatly simplify +This file contains the themes that are the Device Defaults on +Watch. If you want to edit themes to skin your device, do it +here. Editing this file instead of themes.xml will greatly simplify merges for future platform versions and CTS compliance will be easier. + +You should also have a look at themes.xml, to +understand why we define Dialogs and Settings with color +palette Dark. It's because themes.xml modify Material in +a similar way. =============================================================== PLEASE READ =============================================================== --> <resources> + <style name="Theme.DeviceDefault" parent="Theme.DeviceDefaultBase"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- Variant of {@link #Theme_DeviceDefault} with no action bar --> + <style name="Theme.DeviceDefault.NoActionBar" parent="Theme.Material.NoActionBar"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar. This theme + sets {@link android.R.attr#windowFullscreen} to true. --> + <style name="Theme.DeviceDefault.NoActionBar.Fullscreen" parent="Theme.Material.NoActionBar.Fullscreen"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar and + extending in to overscan region. This theme + sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan} + to true. --> + <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Material.NoActionBar.Overscan"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent + system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and + {@link android.R.attr#windowTranslucentNavigation} to true. --> + <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Material.NoActionBar.TranslucentDecor"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + <!-- Theme used for the intent picker activity. --> - <style name="Theme.DeviceDefault.Resolver" parent="Theme.Material"> + <style name="Theme.DeviceDefault.Resolver"> <item name="colorControlActivated">?attr/colorControlHighlight</item> <item name="listPreferredItemPaddingStart">?attr/dialogPreferredPadding</item> <item name="listPreferredItemPaddingEnd">?attr/dialogPreferredPadding</item> </style> <!-- Use a dark theme for watches. --> - <style name="Theme.DeviceDefault.System" parent="Theme.Material" /> + <style name="Theme.DeviceDefault.System" /> + + <!-- DeviceDefault style for input methods, which is used by the + {@link android.inputmethodservice.InputMethodService} class.--> + <style name="Theme.DeviceDefault.InputMethod" parent="Theme.DeviceDefault.Panel"> + <item name="windowAnimationStyle">@style/Animation.InputMethod</item> + <item name="imeFullscreenBackground">?colorBackground</item> + <item name="imeExtractEnterAnimation">@anim/input_method_extract_enter</item> + </style> + + <!-- DeviceDefault theme for dialog windows and activities. In contrast to Material, the + watch theme is not floating. You can set this theme on an activity if you would like to make + an activity that looks like a Dialog.--> + <style name="Theme.DeviceDefault.Dialog" parent="Theme.Material.Dialog" > + <item name="windowIsFloating">false</item> + <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item> + <item name="windowAnimationStyle">@style/Animation.DeviceDefault.Dialog</item> + + <item name="buttonBarStyle">@style/DeviceDefault.ButtonBar.AlertDialog</item> + <item name="borderlessButtonStyle">@style/Widget.DeviceDefault.Button.Borderless.Small</item> + + <item name="textAppearance">@style/TextAppearance.DeviceDefault</item> + <item name="textAppearanceInverse">@style/TextAppearance.DeviceDefault.Inverse</item> + + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault theme for a window that should look like the Settings app. --> + <style name="Theme.DeviceDefault.Settings" parent="Theme.DeviceDefault"/> + <style name="Theme.DeviceDefault.Settings.NoActionBar" parent="Theme.DeviceDefault"/> + <style name="Theme.DeviceDefault.Settings.BaseDialog" parent="Theme.DeviceDefault.Dialog"/> + <style name="Theme.DeviceDefault.Settings.Dialog" parent="Theme.DeviceDefault.Settings.BaseDialog"/> + <style name="Theme.DeviceDefault.Settings.DialogWhenLarge" parent="Theme.DeviceDefault.DialogWhenLarge"/> + <style name="Theme.DeviceDefault.Settings.DialogWhenLarge.NoActionBar" parent="Theme.DeviceDefault.DialogWhenLarge.NoActionBar"/> + <style name="Theme.DeviceDefault.Settings.Dialog.Presentation" parent="Theme.DeviceDefault.Dialog.Presentation"/> + <style name="Theme.DeviceDefault.Settings.SearchBar" parent="Theme.DeviceDefault.SearchBar"/> + + <style name="Theme.DeviceDefault.Settings.Dialog.Alert" parent="Theme.Material.Dialog.Alert"> + <item name="windowIsFloating">false</item> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <style name="Theme.DeviceDefault.Settings.CompactMenu" parent="Theme.Material.CompactMenu"> + <item name="windowIsFloating">false</item> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- Variant of {@link #Theme_DeviceDefault_Dialog} that has a nice minimum width for a + regular dialog. --> + <style name="Theme.DeviceDefault.Dialog.MinWidth" parent="Theme.Material.Dialog.MinWidth"> + <item name="windowIsFloating">false</item> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- Variant of {@link #Theme_DeviceDefault_Dialog} without an action bar --> + <style name="Theme.DeviceDefault.Dialog.NoActionBar" parent="Theme.Material.Dialog.NoActionBar"> + <item name="windowIsFloating">false</item> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- Variant of {@link #Theme_DeviceDefault_Dialog_NoActionBar} that has a nice minimum width + for a regular dialog. --> + <style name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" parent="Theme.Material.Dialog.NoActionBar.MinWidth"> + <item name="windowIsFloating">false</item> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault theme for a window that will be displayed either full-screen on smaller + screens (small, normal) or as a dialog on larger screens (large, xlarge). --> + <style name="Theme.DeviceDefault.DialogWhenLarge" parent="Theme.Material.DialogWhenLarge"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault theme for a window without an action bar that will be displayed either + full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, + xlarge). --> + <style name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" parent="Theme.Material.DialogWhenLarge.NoActionBar"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault theme for a presentation window on a secondary display. --> + <style name="Theme.DeviceDefault.Dialog.Presentation" parent="Theme.Material.Dialog.Presentation"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault theme for panel windows. This removes all extraneous window + decorations, so you basically have an empty rectangle in which to place your content. It makes + the window floating, with a transparent background, and turns off dimming behind the window. --> + <style name="Theme.DeviceDefault.Panel" parent="Theme.Material.Panel"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear + behind them. --> + <style name="Theme.DeviceDefault.Wallpaper" parent="Theme.Material.Wallpaper"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear + behind them and without an action bar. --> + <style name="Theme.DeviceDefault.Wallpaper.NoTitleBar" parent="Theme.Material.Wallpaper.NoTitleBar"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <!-- DeviceDefault style for input methods, which is used by the + {@link android.service.voice.VoiceInteractionSession} class.--> + <style name="Theme.DeviceDefault.VoiceInteractionSession" parent="Theme.Material.VoiceInteractionSession"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Material.Dialog.Alert"> + <item name="windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item> + + <!-- Color palette Dialog --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">?attr/colorBackgroundFloating</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <style name="Theme.DeviceDefault.SearchBar" parent="Theme.Material.SearchBar"> + <!-- Color palette Dark --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">@color/background_device_default_dark</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> + + <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Material.Dialog.NoFrame"> + <item name="windowIsFloating">false</item> + <!-- Color palette Dialog --> + <item name="colorPrimary">@color/primary_device_default_dark</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_dark</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + <item name="colorBackground">?attr/colorBackgroundFloating</item> + <item name="colorBackgroundFloating">@color/background_floating_device_default_dark</item> + <item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_device_default</item> + <item name="colorButtonNormal">@color/button_normal_device_default_dark</item> + </style> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 479ba1ec2cd1..8c89df842b7b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1736,6 +1736,12 @@ turned off and the screen off animation has been performed. --> <bool name="config_dozeAfterScreenOff">false</bool> + <!-- Doze: should the TYPE_PICK_UP_GESTURE sensor be used as a pulse signal. --> + <bool name="config_dozePulsePickup">false</bool> + + <!-- Type of the double tap sensor. Empty if double tap is not supported. --> + <string name="config_dozeDoubleTapSensorType" translatable="false"></string> + <!-- Power Management: Specifies whether to decouple the auto-suspend state of the device from the display on/off state. diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 92d987edbf7d..e7d4b2b3fa88 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2680,6 +2680,9 @@ <java-symbol type="string" name="config_emergency_call_number" /> <java-symbol type="array" name="config_emergency_mcc_codes" /> + <java-symbol type="string" name="config_dozeDoubleTapSensorType" /> + <java-symbol type="bool" name="config_dozePulsePickup" /> + <!-- Used for MimeIconUtils. --> <java-symbol type="drawable" name="ic_doc_apk" /> <java-symbol type="drawable" name="ic_doc_audio" /> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 0e98adea434a..b19858ef194d 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -49,7 +49,7 @@ easier. Type.DeviceDefault.Etc (for example, {@code Widget.DeviceDefault.Button} and {@code TextAppearance.DeviceDefault.Widget.PopupMenu.Large}).</p> --> - <style name="Theme.DeviceDefault" parent="Theme.Material" > + <style name="Theme.DeviceDefaultBase" parent="Theme.Material" > <!-- Text styles --> <item name="textAppearance">@style/TextAppearance.DeviceDefault</item> <item name="textAppearanceInverse">@style/TextAppearance.DeviceDefault.Inverse</item> @@ -206,6 +206,8 @@ easier. </style> + <style name="Theme.DeviceDefault" parent="Theme.DeviceDefaultBase" /> + <!-- Variant of {@link #Theme_DeviceDefault} with no action bar --> <style name="Theme.DeviceDefault.NoActionBar" parent="Theme.Material.NoActionBar"> <!-- Color palette --> diff --git a/docs/html/about/versions/nougat/android-7.0-samples.jd b/docs/html/about/versions/nougat/android-7.0-samples.jd index e283a7a22f83..ff63beff1dd9 100644 --- a/docs/html/about/versions/nougat/android-7.0-samples.jd +++ b/docs/html/about/versions/nougat/android-7.0-samples.jd @@ -6,7 +6,7 @@ page.image=images/cards/card-n-samples_2x.png <p> Use the code samples below to learn about Android 7.0 capabilities and APIs. To - download the samples in Android Studio, select the <b>File > Import + download the samples in Android Studio, select the <b>File > New > Import Samples</b> menu option. </p> diff --git a/docs/html/guide/topics/renderscript/reference/rs_allocation_create.jd b/docs/html/guide/topics/renderscript/reference/rs_allocation_create.jd new file mode 100644 index 000000000000..2defca3d32d5 --- /dev/null +++ b/docs/html/guide/topics/renderscript/reference/rs_allocation_create.jd @@ -0,0 +1,1060 @@ +page.title=RenderScript Allocation Creation Functions + +@jd:body + +<div class='renderscript'> +<h2>Overview</h2> +<p> The functions below are used to create allocations from within a script. +These functions can be called directly or indirectly from an invokable +function. It is an error if any control flow can result in calling these functions +from a RenderScript kernel function. +</p> +<h2>Summary</h2> +<table class='jd-sumtable'><tbody> + <tr><th colspan='2'>Functions</th></tr> + <tr class='alt-color api apilevel-1'> + <td class='jd-linkcol'> + <a href='rs_allocation_create.html#android_rs:rsCreateAllocation'>rsCreateAllocation</a> + </td> + <td class='jd-descrcol' width='100%'> + Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_allocation>rs_allocation</a> object of given <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_type>rs_type</a> + </td> + </tr> + <tr class='alt-color api apilevel-1'> + <td class='jd-linkcol'> + <a href='rs_allocation_create.html#android_rs:rsCreateElement'>rsCreateElement</a> + </td> + <td class='jd-descrcol' width='100%'> + Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> object of the specified data type + </td> + </tr> + <tr class='alt-color api apilevel-1'> + <td class='jd-linkcol'> + <a href='rs_allocation_create.html#android_rs:rsCreatePixelElement'>rsCreatePixelElement</a> + </td> + <td class='jd-descrcol' width='100%'> + Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> object of the specified data type and data kind + </td> + </tr> + <tr class='alt-color api apilevel-1'> + <td class='jd-linkcol'> + <a href='rs_allocation_create.html#android_rs:rsCreateType'>rsCreateType</a> + </td> + <td class='jd-descrcol' width='100%'> + Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_type>rs_type</a> object with the specified <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> and shape attributes + </td> + </tr> + <tr class='alt-color api apilevel-1'> + <td class='jd-linkcol'> + <a href='rs_allocation_create.html#android_rs:rsCreateVectorElement'>rsCreateVectorElement</a> + </td> + <td class='jd-descrcol' width='100%'> + Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> object of the specified data type and vector width + </td> + </tr> +</tbody></table> +<h2>Functions</h2> +<a name='android_rs:rsCreateAllocation'></a> +<div class='jd-details'> + <h4 class='jd-details-title'> + <span class='sympad'>rsCreateAllocation</span> + <span class='normal'>: Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_allocation>rs_allocation</a> object of given <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_type>rs_type</a></span> + </h4> + <div class='jd-details-descr'> + <table class='jd-tagtable'><tbody> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation(<a href='rs_object_types.html#android_rs:rs_type'>rs_type</a> type); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation(<a href='rs_object_types.html#android_rs:rs_type'>rs_type</a> type, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> usage); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_char4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_double4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_float4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_half4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_int4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_long4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_short4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uchar4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_uint4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ulong4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort2(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort3(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> rsCreateAllocation_ushort4(<a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + </tbody></table> + </div> + <div class='jd-tagdata'> <h5 class='jd-tagtitle'>Parameters</h5> + <table class='jd-tagtable'><tbody> + <tr><th>type</th><td>Type of the allocation</td></tr> + <tr><th>usage</th><td>How the allocation should be used. A valid value is either of the following or their combination:<br>RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE,<br>RS_ALLOCATION_USAGE_SCRIPT.</td></tr> + <tr><th>mipmap</th><td>A boolean flag indicating if the allocation is mipmapped and has multiple levels of detail (LoD).</td></tr> + <tr><th>dimX</th><td>Size on dimension x. Must be non zero.</td></tr> + <tr><th>dimY</th><td>Size on dimension y. 0 for single-dimension allocations.</td></tr> + <tr><th>dimZ</th><td>Size on dimension z. 0 for single-dimension and two-dimension allocations.</td></tr> + </tbody></table> + </div> + <div class='jd-tagdata jd-tagdescr'> +<p> Creates an rs_allocation object of the given rs_type and for the specified usages. +</p> + +<p> RS_ALLOCATION_USAGE_SCRIPT and RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE are the + only supported usage flags for Allocations created from within a RenderScript + script. +</p> + +<p> You can also use rsCreateAllocation_<type><width> wrapper functions to directly + create allocations of scalar and vector numerical types without creating + intermediate rs_element or rs_type objects. +</p> + +<p> For example, rsCreateAllocation_int4() returns an Allocation of int4 data type of + specified dimensions. +</p> + </div> +</div> + +<a name='android_rs:rsCreateElement'></a> +<div class='jd-details'> + <h4 class='jd-details-title'> + <span class='sympad'>rsCreateElement</span> + <span class='normal'>: Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> object of the specified data type</span> + </h4> + <div class='jd-details-descr'> + <table class='jd-tagtable'><tbody> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_element'>rs_element</a> rsCreateElement(<a href='rs_object_types.html#android_rs:rs_data_type'>rs_data_type</a> data_type); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + </tbody></table> + </div> + <div class='jd-tagdata'> <h5 class='jd-tagtitle'>Parameters</h5> + <table class='jd-tagtable'><tbody> + <tr><th>data_type</th><td>Data type of the Element</td></tr> + </tbody></table> + </div> + <div class='jd-tagdata jd-tagdescr'> +<p> Creates an rs_element object of the specified data type. The data kind of + the element will be set to RS_KIND_USER and vector width will be set to 1, + indicating non-vector. +</p> + </div> +</div> + +<a name='android_rs:rsCreatePixelElement'></a> +<div class='jd-details'> + <h4 class='jd-details-title'> + <span class='sympad'>rsCreatePixelElement</span> + <span class='normal'>: Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> object of the specified data type and data kind</span> + </h4> + <div class='jd-details-descr'> + <table class='jd-tagtable'><tbody> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_element'>rs_element</a> rsCreatePixelElement(<a href='rs_object_types.html#android_rs:rs_data_type'>rs_data_type</a> data_type, <a href='rs_object_types.html#android_rs:rs_data_kind'>rs_data_kind</a> data_kind); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + </tbody></table> + </div> + <div class='jd-tagdata'> <h5 class='jd-tagtitle'>Parameters</h5> + <table class='jd-tagtable'><tbody> + <tr><th>data_type</th><td>Data type of the Element</td></tr> + <tr><th>data_kind</th><td>Data kind of the Element</td></tr> + </tbody></table> + </div> + <div class='jd-tagdata jd-tagdescr'> +<p> Creates an rs_element object of the specified data type and data kind. The + vector width of the rs_element object will be set to 1, indicating non-vector. +</p> + </div> +</div> + +<a name='android_rs:rsCreateType'></a> +<div class='jd-details'> + <h4 class='jd-details-title'> + <span class='sympad'>rsCreateType</span> + <span class='normal'>: Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_type>rs_type</a> object with the specified <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> and shape attributes</span> + </h4> + <div class='jd-details-descr'> + <table class='jd-tagtable'><tbody> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_type'>rs_type</a> rsCreateType(<a href='rs_object_types.html#android_rs:rs_element'>rs_element</a> element, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_type'>rs_type</a> rsCreateType(<a href='rs_object_types.html#android_rs:rs_element'>rs_element</a> element, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_type'>rs_type</a> rsCreateType(<a href='rs_object_types.html#android_rs:rs_element'>rs_element</a> element, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_type'>rs_type</a> rsCreateType(<a href='rs_object_types.html#android_rs:rs_element'>rs_element</a> element, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimX, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimY, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> dimZ, bool mipmaps, bool faces, <a href='rs_object_types.html#android_rs:rs_yuv_format'>rs_yuv_format</a> yuv_format); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + </tbody></table> + </div> + <div class='jd-tagdata'> <h5 class='jd-tagtitle'>Parameters</h5> + <table class='jd-tagtable'><tbody> + <tr><th>element</th><td>An <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> object that specifies the cell data type of an allocation.</td></tr> + <tr><th>dimX</th><td>Size on dimension x. Must be non zero.</td></tr> + <tr><th>dimY</th><td>Size on dimension y. 0 for single-dimension allocations.</td></tr> + <tr><th>dimZ</th><td>Size on dimension z. 0 for single-dimension and two-dimension allocations.</td></tr> + <tr><th>mipmaps</th><td>A boolean flag indicating if the allocation is mipmapped and has multiple levels of detail (LoD).</td></tr> + <tr><th>faces</th><td>A boolean flag indicating if the allocation is a cubemap that has cube faces.</td></tr> + <tr><th>yuv_format</th><td>Tye YUV layout.</td></tr> + </tbody></table> + </div> + <div class='jd-tagdata jd-tagdescr'> +<p> Creates an rs_type object with the specified element and shape attributes. +</p> + +<p> dimX specifies the size of the X dimension. +</p> + +<p> dimY, if present and non-zero, indicates that the Y dimension is present and + indicates its size. +</p> + +<p> dimZ, if present and non-zero, indicates that the Z dimension is present and + indicates its size. +</p> + +<p> mipmaps indicates the presence of level of detail (LOD). +</p> + +<p> faces indicates the presence of cubemap faces. +</p> + +<p> yuv_format indicates the associated YUV format (or RS_YUV_NONE). +</p> + </div> +</div> + +<a name='android_rs:rsCreateVectorElement'></a> +<div class='jd-details'> + <h4 class='jd-details-title'> + <span class='sympad'>rsCreateVectorElement</span> + <span class='normal'>: Creates an <a href={@docRoot}guide/topics/renderscript/reference/rs_object_types.html#android_rs:rs_element>rs_element</a> object of the specified data type and vector width</span> + </h4> + <div class='jd-details-descr'> + <table class='jd-tagtable'><tbody> + <tr> + <td><a href='rs_object_types.html#android_rs:rs_element'>rs_element</a> rsCreateVectorElement(<a href='rs_object_types.html#android_rs:rs_data_type'>rs_data_type</a> data_type, <a href='rs_value_types.html#android_rs:uint32_t'>uint32_t</a> vector_width); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + </tbody></table> + </div> + <div class='jd-tagdata'> <h5 class='jd-tagtitle'>Parameters</h5> + <table class='jd-tagtable'><tbody> + <tr><th>data_type</th><td>Data type of the Element</td></tr> + <tr><th>vector_width</th><td>Vector width</td></tr> + </tbody></table> + </div> + <div class='jd-tagdata jd-tagdescr'> +<p> Creates an rs_element object of the specified data type and vector width. + Value of vector_width must be 2, 3 or 4. The data kind of the rs_element object will + be set to RS_KIND_USER. +</p> + </div> +</div> + +</div> diff --git a/docs/html/guide/topics/renderscript/reference/rs_for_each.jd b/docs/html/guide/topics/renderscript/reference/rs_for_each.jd index 9ba56149f142..8b19ba6e7542 100644 --- a/docs/html/guide/topics/renderscript/reference/rs_for_each.jd +++ b/docs/html/guide/topics/renderscript/reference/rs_for_each.jd @@ -1,10 +1,10 @@ -page.title=RenderScript Kernel Invocation Functions and Types +page.title=RenderScript Kernel Launch Functions and Types @jd:body <div class='renderscript'> <h2>Overview</h2> -<p> The <a href='rs_for_each.html#android_rs:rsForEach'>rsForEach</a>() function can be used to invoke the root kernel of a script. +<p> The <a href='rs_for_each.html#android_rs:rsForEach'>rsForEach</a>() and <a href='rs_for_each.html#android_rs:rsForEachWithOptions'>rsForEachWithOptions</a>() functions are used to launch foreach kernels. </p> <p> The other functions are used to get the characteristics of the invocation of @@ -24,6 +24,14 @@ a <a href='rs_for_each.html#android_rs:rs_kernel_context'>rs_kernel_context</a> </tr> <tr class='alt-color api apilevel-1'> <td class='jd-linkcol'> + <a href='rs_for_each.html#android_rs:rs_kernel'>rs_kernel</a> + </td> + <td class='jd-descrcol' width='100%'> + Handle to a kernel function + </td> + </tr> + <tr class='alt-color api apilevel-1'> + <td class='jd-linkcol'> <a href='rs_for_each.html#android_rs:rs_kernel_context'>rs_kernel_context</a> </td> <td class='jd-descrcol' width='100%'> @@ -46,7 +54,15 @@ a <a href='rs_for_each.html#android_rs:rs_kernel_context'>rs_kernel_context</a> <a href='rs_for_each.html#android_rs:rsForEach'>rsForEach</a> </td> <td class='jd-descrcol' width='100%'> - Invoke the root kernel of a script + Launches a kernel + </td> + </tr> + <tr class='alt-color api apilevel-1'> + <td class='jd-linkcol'> + <a href='rs_for_each.html#android_rs:rsForEachWithOptions'>rsForEachWithOptions</a> + </td> + <td class='jd-descrcol' width='100%'> + Launches a kernel with options </td> </tr> <tr class='alt-color api apilevel-1'> @@ -198,6 +214,21 @@ locality when the processing is distributed over multiple cores. </div> </div> +<a name='android_rs:rs_kernel'></a> +<div class='jd-details'> + <h4 class='jd-details-title'> + <span class='sympad'>rs_kernel</span> + <span class='normal'>: Handle to a kernel function</span> + </h4> + <div class='jd-details-descr'> +<p>A typedef of: void* Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> +</p> +<p> An opaque type for a function that is defined with the kernel attribute. A value + of this type can be used in a <a href='rs_for_each.html#android_rs:rsForEach'>rsForEach</a> call to launch a kernel. +</p> + </div> +</div> + <a name='android_rs:rs_kernel_context'></a> <div class='jd-details'> <h4 class='jd-details-title'> @@ -249,7 +280,7 @@ versions, it will also be used to provide hint on how to best iterate over the cells. </p> -<p> The Start fields are inclusive and the End fields are exclusive. E.g. to iterate +<p> The Start fields are inclusive and the End fields are exclusive. For example, to iterate over cells 4, 5, 6, and 7 in the X dimension, set xStart to 4 and xEnd to 8. </p> </div> @@ -260,14 +291,20 @@ over cells 4, 5, 6, and 7 in the X dimension, set xStart to 4 and xEnd to 8. <div class='jd-details'> <h4 class='jd-details-title'> <span class='sympad'>rsForEach</span> - <span class='normal'>: Invoke the root kernel of a script</span> + <span class='normal'>: Launches a kernel</span> </h4> <div class='jd-details-descr'> <table class='jd-tagtable'><tbody> <tr> + <td>void rsForEach(<a href='rs_for_each.html#android_rs:rs_kernel'>rs_kernel</a> kernel, ... ...); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + <tr> <td>void rsForEach(<a href='rs_object_types.html#android_rs:rs_script'>rs_script</a> script, <a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> input, <a href='rs_object_types.html#android_rs:rs_allocation'>rs_allocation</a> output); </td> - <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 14</a> + <td> <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 14 - 23</a> </td> </tr> <tr> @@ -300,35 +337,89 @@ over cells 4, 5, 6, and 7 in the X dimension, set xStart to 4 and xEnd to 8. <table class='jd-tagtable'><tbody> <tr><th>script</th><td>Script to call.</td></tr> <tr><th>input</th><td>Allocation to source data from.</td></tr> - <tr><th>output</th><td>Allocation to write date into.</td></tr> + <tr><th>output</th><td>Allocation to write data into.</td></tr> <tr><th>usrData</th><td>User defined data to pass to the script. May be NULL.</td></tr> <tr><th>sc</th><td>Extra control information used to select a sub-region of the allocation to be processed or suggest a walking strategy. May be NULL.</td></tr> <tr><th>usrDataLen</th><td>Size of the userData structure. This will be used to perform a shallow copy of the data if necessary.</td></tr> + <tr><th>kernel</th><td>Function designator of the kernel function to call, which must be defined with the kernel attribute.</td></tr> + <tr><th>...</th><td>Input and output allocations</td></tr> </tbody></table> </div> <div class='jd-tagdata jd-tagdescr'> -<p> Invoke the kernel named "root" of the specified script. Like other kernels, this root() -function will be invoked repeatedly over the cells of the specificed allocation, filling -the output allocation with the results. +<p> Runs the kernel over zero or more input allocations. They are passed after the +<a href='rs_for_each.html#android_rs:rs_kernel'>rs_kernel</a> argument. If the specified kernel returns a value, an output allocation +must be specified as the last argument. All input allocations, +and the output allocation if it exists, must have the same dimensions. </p> -<p> When rsForEach is called, the root script is launched immediately. rsForEach returns -only when the script has completed and the output allocation is ready to use. +<p> This is a synchronous function. A call to this function only returns after all +the work has completed. If the kernel +function returns any value, the call waits until all results have been written +to the output allocation. </p> -<p> The rs_script argument is typically initialized using a global variable set from Java. +<p> Up to API level 23, the kernel is implicitly specified as the kernel named +"root" in the specified script, and only a single input allocation can be used. +Starting in API level 24, an arbitrary kernel function can be used, +as specified by the kernel argument. +The kernel must be defined in the current script. In addition, more than one +input can be used. </p> -<p> The kernel can be invoked with just an input allocation or just an output allocation. -This can be done by defining an rs_allocation variable and not initializing it. E.g.<code><br/> -rs_script gCustomScript;<br/> -void specializedProcessing(rs_allocation in) {<br/> - rs_allocation ignoredOut;<br/> - rsForEach(gCustomScript, in, ignoredOut);<br/> -}<br/></code> +<p> For example,<code><br/> +float __attribute__((kernel)) square(float a) {<br/> + return a * a;<br/> +}<br/> +<br/> +void compute(rs_allocation ain, rs_allocation aout) {<br/> + rsForEach(square, ain, aout);<br/> +}<br/> +<br/></code> +</p> + </div> +</div> + +<a name='android_rs:rsForEachWithOptions'></a> +<div class='jd-details'> + <h4 class='jd-details-title'> + <span class='sympad'>rsForEachWithOptions</span> + <span class='normal'>: Launches a kernel with options</span> + </h4> + <div class='jd-details-descr'> + <table class='jd-tagtable'><tbody> + <tr> + <td>void rsForEachWithOptions(<a href='rs_for_each.html#android_rs:rs_kernel'>rs_kernel</a> kernel, <a href='rs_for_each.html#android_rs:rs_script_call_t'>rs_script_call_t</a>* options, ... ...); +</td> + <td> Added in <a href='http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLevels'>API level 24</a> + </td> + </tr> + </tbody></table> + </div> + <div class='jd-tagdata'> <h5 class='jd-tagtitle'>Parameters</h5> + <table class='jd-tagtable'><tbody> + <tr><th>kernel</th><td>Function designator to a function that is defined with the kernel attribute.</td></tr> + <tr><th>options</th><td>Launch options</td></tr> + <tr><th>...</th><td>Input and output allocations</td></tr> + </tbody></table> + </div> + <div class='jd-tagdata jd-tagdescr'> +<p> Launches kernel in a way similar to <a href='rs_for_each.html#android_rs:rsForEach'>rsForEach</a>. However, instead of processing +all cells in the input, this function only processes cells in the subspace of +the index space specified in options. With the index space explicitly specified +by options, no input or output allocation is required for a kernel launch using +this API. If allocations are passed in, they must match the number of arguments +and return value expected by the kernel function. The output allocation is +present if and only if the kernel has a non-void return value. </p> -<p> If both input and output allocations are specified, they must have the same dimensions. +<p> For example,<code><br/> + rs_script_call_t opts = {0};<br/> + opts.xStart = 0;<br/> + opts.xEnd = dimX;<br/> + opts.yStart = 0;<br/> + opts.yEnd = dimY / 2;<br/> + rsForEachWithOptions(foo, &opts, out, out);<br/> +</code> </p> </div> </div> @@ -359,7 +450,7 @@ over and rarely used indices, like the Array0 index. </p> <p> You can access the kernel context by adding a special parameter named "context" of -type rs_kernel_context to your kernel function. E.g.<br/> +type rs_kernel_context to your kernel function. For example,<br/> <code>short RS_KERNEL myKernel(short value, uint32_t x, rs_kernel_context context) {<br/> // The current index in the common x, y, z dimensions are accessed by<br/> // adding these variables as arguments. For the more rarely used indices<br/> @@ -644,7 +735,7 @@ over and rarely used indices, like the Array0 index. </p> <p> You can access it by adding a special parameter named "context" of -type rs_kernel_context to your kernel function. E.g.<br/> +type rs_kernel_context to your kernel function. For example,<br/> <code>int4 RS_KERNEL myKernel(int4 value, rs_kernel_context context) {<br/> uint32_t size = rsGetDimX(context); //...<br/></code> </p> diff --git a/docs/html/samples/new/index.jd b/docs/html/samples/new/index.jd index a7ffa8c45fe8..4d6262edb501 100644 --- a/docs/html/samples/new/index.jd +++ b/docs/html/samples/new/index.jd @@ -5,7 +5,7 @@ page.image=images/cards/samples-new_2x.png <p>The following code samples were recently published. You can download them in the Android SDK Manager under the <b>Samples for SDK</b> -component for Android 6.0 (API 23).</p> +component for Android 7.1 (API 25).</p> <p class="note"> <strong>Note:</strong> The downloadable projects are designed @@ -14,115 +14,67 @@ component for Android 6.0 (API 23).</p> <!-- NOTE TO EDITORS: add most recent samples first --> -<h3 id="ActiveNotification"> - <a href="{@docRoot}samples/ActiveNotifications/index.html">Active - Notification</a> -</h3> -<p> - This sample demonstrates how to use the {@link - android.app.NotificationManager} to tell you how many notifications your app - is currently showing. -</p> - -<h3 id="AutomaticBackup"> - <a href="{@docRoot}samples/AutoBackupForApps/index.html">Auto Backup for - Apps</a> -</h3> - -<p> - Android 6.0 (API level 23) introduces automatic backup for app settings. This - sample demonstrates how to add filtering rules to an app to manage settings - backup. -</p> +<h3 id="app-shortcuts">App shortcuts sample</h3> -<h3 id="Camera2Raw"> - <a href="{@docRoot}samples/Camera2Raw/index.html">Camera 2 Raw</a> -</h3> +<!-- TBA +<img src="sample-img.png" style="float: left; padding-right: 0.5em" + width="xxx"/> +--> <p> - This sample demonstrates how to use the - <a href="{@docRoot}reference/android/hardware/camera2/package-summary.html"> - <code>Camera2</code></a> API to capture RAW camera buffers and save them as - DNG files. -</p> - -<h3 id="ConfirmCredential"> - <a href="{@docRoot}samples/ConfirmCredential/index.html">Confirm - Credential</a> -</h3> - -<p> - This sample demonstrates how to use device credentials as an authentication method in your app. + This sample demonstrates how to use the <a href= + "/preview/app-shortcuts.html">app shortcuts API</a> introduced in Android 7.1 + (API level 25). This API allows an application to define a set of intents + which are displayed when a user long-presses on the app's launcher icon. + Examples are given for registering links both statically in XML, as well as + dynamically at runtime. </p> -<h3 id="DeviceOwner"> - <a href="{@docRoot}samples/DeviceOwner/index.html">Device Owner</a> -</h3> - <p> - This sample demonstrates how to use the device owner features to manage and - configure a device. + <a href="/samples/AppShortcuts/index.html">App shortcuts sample</a> </p> -<h3 id="DirectShare"> - <a href="{@docRoot}samples/DirectShare/index.html">Direct Share</a> -</h3> - -<p> - This sample demonstrates how to provide the - <a href="{@docRoot}about/versions/marshmallow/android-6.0.html#direct-share">Direct - Share</a> feature. The app shows some options directly in the list of share - intent candidates. -</p> +<h3 id="img-kbd-app">Image keyboard app sample</h3> -<h3 id="FingerprintDialog"> - <a href="{@docRoot}samples/FingerprintDialog/index.html">Fingerprint - Dialog</a> -</h3> +<!-- TBA +<img src="sample-img.png" style="float: left; padding-right: 0.5em" + width="xxx"/> +--> <p> - This sample demonstrates how to recognize registered fingerprints to - authenticate your app's user. + This sample demonstrates how to implement the <a href= + "/reference/android/view/inputmethod/InputConnection.html#commitContent(android.view.inputmethod.InputContentInfo,%20int,%20android.os.Bundle)"> + Commit Content API</a>, using the <a href= + "/topic/libraries/support-library/index.html">Android Support Library</a>. + This API provides a universal way for IMEs to send images and other rich + content directly to a text editor in an app, allowing users to compose + content using custom emojis, stickers, or other rich content provided by + other applications. </p> -<h3 id="MidiScope"> - <a href="{@docRoot}samples/MidiScope/index.html">MidiScope</a> -</h3> - <p> - This sample demonstrates how to use the <a href= - "{@docRoot}reference/android/media/midi/package-summary.html">MIDI API</a> to - receive and process MIDI signals coming from an attached input device. + <a href="/samples/CommitContentSampleApp/index.html">Image keyboard app sample</a> </p> -<h3 id="MidiSynth"> - <a href="{@docRoot}samples/MidiSynth/index.html">MidiSynth</a> -</h3> +<h3 id="img-kbd-ime">Image keyboard IME sample</h3> -<p> - This sample demonstrates how to use the <a href= - "{@docRoot}reference/android/media/midi/package-summary.html">MIDI API</a> to - receive and play MIDI messages coming from an attached input device. -</p> - -<h3 id="NfcProvisioning"> - <a href="{@docRoot}samples/NfcProvisioning/index.html">NFC Provisioning</a> -</h3> +<!-- TBA +<img src="sample-img.png" style="float: left; padding-right: 0.5em" + width="xxx"/> +--> <p> - This sample demonstrates how to use NFC to provision other devices with a - specific device owner. + This sample demonstrates how to write a <a href= + "/preview/image-keyboard.html">custom image keyboard</a> using the <a href= + "/reference/android/view/inputmethod/InputConnection.html#commitContent(android.view.inputmethod.InputContentInfo,%20int,%20android.os.Bundle)"> + Commit Content API</a> and the <a href= + "/topic/libraries/support-library/index.html">Android Support Library</a>. + This keyboard will be displayed inside compatible apps (also using the Commit + Content API), allowing users to insert emojis, stickers, or other rich + content into text editors. </p> -<h3 id="RuntimePermissions"> - <a href= - "{@docRoot}samples/RuntimePermissions/index.html">RuntimePermissions</a> -</h3> - <p> - This sample shows runtime permissions available in Android 6.0 (API level 23) - and higher. Display the log on screen to follow the execution. If executed on - an Android 6.0 device, the app displays an additional option to access - contacts using an 6.0-only optional permission. + <a href="/samples/CommitContentSampleIME/index.html">Image keyboard IME sample</a> </p> diff --git a/docs/html/training/location/geofencing.jd b/docs/html/training/location/geofencing.jd index ce6ad55ad889..046e99e9bed1 100644 --- a/docs/html/training/location/geofencing.jd +++ b/docs/html/training/location/geofencing.jd @@ -332,22 +332,39 @@ LocationServices.GeofencingApi.removeGeofences( <p>This section outlines recommendations for using geofencing with the location APIs for Android.</p> -<h3>Reduce power consumption</h3> +<h3> + Reduce power consumption +</h3> -<p>You can use the following techniques to optimize power consumption in your apps that use geofencing:</p> +<p> + You can use the following techniques to optimize power consumption in your + apps that use geofencing: +</p> <ul> -<li><p>Set the <a href="{@docRoot}android/reference/com/google/android/gms/location/Geofence.Builder.html#setNotificationResponsiveness(int)"> -notification responsiveness</a> to a higher value. Doing so improves power consumption by -increasing the latency of geofence alerts. For example, if you set a responsiveness value of five -minutes your app only checks for an entrance or exit alert once every five minutes. -Setting lower values does not necessarily mean that users will be notified within that time period -(for example, if you set a value of 5 seconds it may take a bit longer than that to receive the -alert).</p></li> -<li><p>Use a larger geofence radius for locations where a user spends a significant amount of time, -such as home or work. While a larger radius doesn't directly reduce power consumption, it reduces -the frequency at which the app checks for entrance or exit, effectively lowering overall power -consumption.</p></li> + <li> + <p> + Set the <a href= + "https://developers.google.com/android/reference/com/google/android/gms/location/Geofence.Builder.html#setNotificationResponsiveness(int)"> + notification responsiveness</a> to a higher value. Doing so improves + power consumption by increasing the latency of geofence alerts. For + example, if you set a responsiveness value of five minutes your app only + checks for an entrance or exit alert once every five minutes. Setting + lower values does not necessarily mean that users will be notified + within that time period (for example, if you set a value of 5 seconds it + may take a bit longer than that to receive the alert). + </p> + </li> + + <li> + <p> + Use a larger geofence radius for locations where a user spends a + significant amount of time, such as home or work. While a larger radius + doesn't directly reduce power consumption, it reduces the frequency at + which the app checks for entrance or exit, effectively lowering overall + power consumption. + </p> + </li> </ul> <h3>Choose the optimal radius for your geofence</h3> diff --git a/docs/html/training/tv/tif/tvinput.jd b/docs/html/training/tv/tif/tvinput.jd index 1a53398e6e4c..2153ef866860 100644 --- a/docs/html/training/tv/tif/tvinput.jd +++ b/docs/html/training/tv/tif/tvinput.jd @@ -10,9 +10,8 @@ trainingnavtop=true <div id="tb"> <h2>This lesson teaches you to</h2> <ol> - <li><a href="#manifest">Declare Your TV Input Service in the Manifest</a></li> - <li><a href="#tvinput">Define Your TV Input Service</a></li> - <li><a href="#setup">Define Your Setup Activity</a></li> + <li><a href="#TIFCompanion">Create a TV Input Service Using the TIF Companion Library</a></li> + <li><a href="#NoTIFCompanion">Create a TV Input Service Using the TIF Framework</a></li> </ol> <h2>You should also read</h2> <ul> @@ -30,14 +29,253 @@ trainingnavtop=true </div> <p>A TV input service represents a media stream source, and lets you present your media content in a -linear, broadcast TV fashion as channels and programs. With the TV input service, you can provide +linear, broadcast TV fashion as channels and programs. With a TV input service, you can provide parental controls, program guide information, and content ratings. The TV input service works -with the Android system TV app, developed for the device and immutable by third-party apps, which -ultimately controls and presents content on the TV. See +with the Android system TV app. This app ultimately controls and presents channel content +on the TV. The system TV app is developed specifically for the device and immutable +by third-party apps. For more information about the TV Input Framework (TIF) +architecture and its components, see <a class="external-link" href="http://source.android.com/devices/tv/index.html"> -TV Input Framework</a> for more information about the framework architecture and its components.</p> +TV Input Framework</a>.</p> -<p>To develop a TV input service, you implement the following components:</p> +<h2 id="TIFCompanion">Create a TV Input Service Using the TIF Companion Library</h2> + +<p> +The TIF Companion Library is a framework that provides extensible +implementations of common TV input service features. Use the TIF Companion +Library to quickly and easily create your own TV input service that follows +best practices for Android TV. +</p> + +<h3 id="build">Update your build.gradle file</h3> + +<p> +To get started using the TIF Companion Library, add the following line to your +app's <code>build.gradle</code> file: +</p> + +<pre> +compile 'com.google.android.media.tv.companionlibrary:1.0.0' +</pre> + +<p>The TIF Companion Library is not currently part of the Android +framework. It is distributed as part of the <a class="external-link" +href="https://github.com/googlesamples/androidtv-sample-inputs"> +TV Input Service sample app</a>, and not with the Android SDK. +</p> + +<h3 id="manifest">Declare your TV input service in the manifest</h3> + +<p>Your app must provide a {@link android.media.tv.TvInputService}-compatible +service that the system uses to access your app. The TIF +Companion Library provides the <code>BaseTvInputService</code> class, which +provides a default implementation of {@link android.media.tv.TvInputService} +that you can customize. Create a subclass of <code>BaseTvInputService</code>, +and declare the subclass in your manifest as a service.</p> + +<p>Within the manifest declaration, specify the +{@link android.Manifest.permission#BIND_TV_INPUT} permission to allow the +service to connect the TV input to the system. A system service +performs the binding and has the +{@link android.Manifest.permission#BIND_TV_INPUT} permission. +The system TV app sends requests to TV input services +via the {@link android.media.tv.TvInputManager} interface.</p> + +<p>In your service declaration, include an intent filter that specifies +{@link android.media.tv.TvInputService} as the action to perform with the +intent. Also declare the service metadata as a separate XML resource. The +service declaration, intent filter, and service metadata declaration are shown +in the following example:</p> + +<pre> +<service android:name=".rich.RichTvInputService" + android:label="@string/rich_input_label" + android:permission="android.permission.BIND_TV_INPUT"> + <!-- Required filter used by the system to launch our account service. --> + <intent-filter> + <action android:name="android.media.tv.TvInputService" /> + </intent-filter> + <!-- An XML file which describes this input. This provides pointers to + the RichTvInputSetupActivity to the system/TV app. --> + <meta-data + android:name="android.media.tv.input" + android:resource="@xml/richtvinputservice" /> +</service> +</pre> + +<p>Define the service metadata in a separate XML file. The service +metadata XML file must include a setup interface that describes the TV input's +initial configuration and channel scan. The metadata file should also contain a +flag stating whether or not users are able to record content. For more +information on how to support recording content in your app, see +<a href="{@docRoot}preview/features/tv-recording-api.html">TV Recording</a>. +</p> + +<p>The service metadata file is located in the XML resources directory +for your app and must match the name of the resource you declared in the +manifest. Using the manifest entries from the previous example, you would +create the XML file at <code>res/xml/richtvinputservice.xml</code>, with the +following contents:</p> + +<pre> +<?xml version="1.0" encoding="utf-8"?> +<tv-input xmlns:android="http://schemas.android.com/apk/res/android" + android:canRecord="true" + android:setupActivity="com.example.android.sampletvinput.rich.RichTvInputSetupActivity" /> +</pre> + +<h3 id="setup">Define channels and create your setup activity</h3> + +<p>Your TV input service must define at least one channel that users +access via the system TV app. You should register your channels +in the system database, and provide a setup activity that the system +invokes when it cannot find a channel for your app.</p> + +<p>First, enable your app to read from and write to the system Electronic +Programming Guide (EPG), whose data includes channels and programs available +to the user. To enable your app to perform these actions, and sync with the +EPG after device restart, add the following elements to your app manifest:</p> + +<pre> +<uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA" /> +<uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA" /> +<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED "/> +</pre> + +<p>Add the following element to ensure that your app shows up in the +Google Play Store as an app that provides content channels in Android TV:</p> + +<pre> +<uses-feature + android:name="android.software.live_tv" + android:required="true" /> +</pre> + +<p>Next, create a class which extends the <code>EpgSyncJobService</code> +class. This abstract class makes it easy to create a job service that +creates and updates channels in the system database.</p> + +<p>In your subclass, create and return your full list of channels in +<code>getChannels()</code>. If your channels come from an XMLTV file, +use the <code>XmlTvParser</code> class. Otherwise generate +channels programmatically using the <code>Channel.Builder</code> class. +</p> + +<p>For each channel, the system calls <code>getProgramsForChannel()</code> +when it needs a list of programs that can be viewed within a given time window +on the channel. Return a list of <code>Program</code> objects for the +channel. Use the <code>XmlTvParser</code> class to obtain programs from an +XMLTV file, or generate them programmatically using the +<code>Program.Builder</code> class.</p> + +<p>For each <code>Program</code> object, use an +<code>InternalProviderData</code> object to set program information such as the +program's video type. If you only have a limited number of programs that you +want the channel to repeat in a loop, use the +<code>InternalProviderData.setRepeatable()</code> method with a value of +<code>true</code> when setting information about your program.</p> + +<p>After you've implemented the job service, add it to your app manifest:</p> + +<pre> +<service + android:name=".sync.SampleJobService" + android:permission="android.permission.BIND_JOB_SERVICE" + android:exported="true" /> +</pre> + +<p>Finally, create a setup activity. Your setup activity should provide a way +to sync channel and program data. One way to do this is for the user to do it +via the UI in the activity. You might also have the app do it automatically +when the activity starts. When the setup activity needs to sync channel and +program info, the app should start the job service:</p> + +<pre> +String inputId = getActivity().getIntent().getStringExtra(TvInputInfo.EXTRA_INPUT_ID); +EpgSyncJobService.cancelAllSyncRequests(getActivity()); +EpgSyncJobService.requestImmediateSync(getActivity(), inputId, + new ComponentName(getActivity(), SampleJobService.class)); +</pre> + +<p>Use the <code>requestImmediateSync()</code> method to sync +the job service. The user must wait for the sync to finish, so you should +keep your request period relatively short.</p> + +<p>Use the <code>setUpPeriodicSync()</code> method to have the job service +periodically sync channel and program data in the background:</p> + +<pre> +EpgSyncJobService.setUpPeriodicSync(context, inputId, + new ComponentName(context, SampleJobService.class)); +</pre> + +<p>The TIF Companion Library provides an additional overloaded method of +<code>requestImmediateSync()</code> that lets you specify the duration of +channel data to sync in milliseconds. The default method syncs one hour's +worth of channel data. +</p> + +<p>The TIF Companion Library also provides an additional overloaded method of +<code>setUpPeriodicSync()</code> that lets you specify the duration of +channel data to sync, and how often the periodic sync should occur. The +default method syncs 48 hours of channel data every 12 hours. +</p> + +<p>For more details about channel data and the EPG, see +<a href="{@docRoot}training/tv/tif/channel.html"> Working with Channel Data</a>. +</p> + +<h3 id="playback">Handle tuning requests and media playback</h3> + +<p>When a user selects a specific channel, the system TV app uses a +<code>Session</code>, created by your app, to tune to the requested channel +and play content. The TIF Companion Library provides several +classes you can extend to handle channel and session calls from the system.</p> + +<p>Your <code>BaseTvInputService</code> subclass creates sessions which handle +tuning requests. Override the +<code>onCreateSession()</code> method, create a session extended from +the <code>BaseTvInputService.Session</code> class, and call +<code>super.sessionCreated()</code> with your new session. In the following +example, <code>onCreateSession()</code> returns a +<code>RichTvInputSessionImpl</code> object that extends +<code>BaseTvInputService.Session</code>:</p> + +<pre> +@Override +public final Session onCreateSession(String inputId) { + RichTvInputSessionImpl session = new RichTvInputSessionImpl(this, inputId); + session.setOverlayViewEnabled(true); + return super.sessionCreated(session); +} +</pre> + +<p>When the user uses the system TV app to start viewing one of your channels, +the system calls your session's <code>onPlayChannel()</code> method. Override +this method if you need to do any special channel initialization before the +program starts playing.</p> + +<p>The system then obtains the currently scheduled program and calls your +session's <code>onPlayProgram()</code> method, specifying the program +information and start time in milliseconds. Use the +<code>TvPlayer</code> interface to start playing the program.</p> + +<p>Your media player code should implement <code>TvPlayer</code> to handle +specific playback events. The <code>TvPlayer</code> class handles features +like time-shifting controls without adding complexity to your +<code>BaseTvInputService</code> implementation.</p> + +<p>In your session's <code>getTvPlayer()</code> method, return +your media player that implements <code>TvPlayer</code>. The +<a class="external-link" +href="https://github.com/googlesamples/androidtv-sample-inputs"> +TV Input Service sample app</a> implements a media player that uses +<a href="{@docRoot}guide/topics/media/exoplayer.html">ExoPlayer</a>.</p> + +<h2 id="NoTIFCompanion">Create a TV Input Service Using the TIF Framework</h2> + +<p>If your TV input service can't use the TIF Companion Library, you need +to implement the following components:</p> <ul> <li>{@link android.media.tv.TvInputService} provides long-running and background availability for @@ -56,43 +294,18 @@ TV Input Framework</a> for more information about the framework architecture and the interaction with TV inputs and apps</li> </ul> -<h2 id="manifest">Declare Your TV Input Service in the Manifest</h2> - -<p>Your app manifest must declare your {@link android.media.tv.TvInputService}. Within that -declaration, specify the {@link android.Manifest.permission#BIND_TV_INPUT} permission to allow the -service to connect the TV input to the system. A system service (<code>TvInputManagerService</code>) -performs the binding and has that permission. The system TV app sends requests to TV input services -via the {@link android.media.tv.TvInputManager} interface. The service declaration must also -include an intent filter that specifies the {@link android.media.tv.TvInputService} -as the action to perform with the intent. Also within the service declaration, declare the service -meta data in a separate XML resource. The service declaration, the intent filter and the service -meta data are described in the following example.</p> - -<pre> -<service android:name="com.example.sampletvinput.SampleTvInput" - android:label="@string/sample_tv_input_label" - android:permission="android.permission.BIND_TV_INPUT"> - <intent-filter> - <action android:name="android.media.tv.TvInputService" /> - </intent-filter> - <meta-data android:name="android.media.tv.input" - android:resource="@xml/sample_tv_input" /> -</service> -</pre> - -<p>Define the service meta data in separate XML file, as shown in the following example. The service -meta data must include a setup interface that describes the TV input's initial configuration and -channel scan. The service meta data file is located in the XML resources directory -for your application and must match the name of the resource in the manifest. Using the example -manifest entries above, you would create an XML file in the location -<code>res/xml/sample_tv_input.xml</code>, with the following contents:</p> +<p>You also need to do the following:</p> -<pre> -<tv-input xmlns:android="http://schemas.android.com/apk/res/android" - android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity" /> -</pre> +<ol> +<li>Declare your TV input service in the manifest, as +described in <a href="#manifest">Declare your TV input service in the +manifest</a>.</li> +<li>Create the service metadata file.</li> +<li>Create and register your channel and program information.</li> +<li>Create your setup activity.</li> +</ol> -<h2 id="tvinput">Define Your TV Input Service</h2> +<h3 id="tvinput">Define your TV input service</h3> <div class="figure"> <img id="tvinputlife" src="{@docRoot}images/tv/tvinput-life.png" alt=""/> @@ -102,7 +315,7 @@ manifest entries above, you would create an XML file in the location <p>For your service, you extend the {@link android.media.tv.TvInputService} class. A {@link android.media.tv.TvInputService} implementation is a <a href="{@docRoot}guide/components/bound-services.html">bound service</a> where the system service -(<code>TvInputManagerService</code>) is the client that binds to it. The service life cycle methods +is the client that binds to it. The service life cycle methods you need to implement are illustrated in figure 1.</p> <p>The {@link android.app.Service#onCreate()} method initializes and starts the @@ -145,7 +358,8 @@ you may want to handle in your TV input service.</p> <p>The {@link android.media.tv.TvInputService} creates a {@link android.media.tv.TvInputService.Session} that implements {@link android.os.Handler.Callback} -to handle player state changes. With {@link android.media.tv.TvInputService.Session#onSetSurface(android.view.Surface) onSetSurface()}, +to handle player state changes. With +{@link android.media.tv.TvInputService.Session#onSetSurface(android.view.Surface) onSetSurface()}, the {@link android.media.tv.TvInputService.Session} sets the {@link android.view.Surface} with the video content. See <a href="{@docRoot}training/tv/tif/ui.html#surface">Integrate Player with Surface</a> for more information about working with {@link android.view.Surface} to render video.</p> @@ -153,16 +367,16 @@ for more information about working with {@link android.view.Surface} to render v <p>The {@link android.media.tv.TvInputService.Session} handles the {@link android.media.tv.TvInputService.Session#onTune(android.net.Uri) onTune()} event when the user selects a channel, and notifies the system TV app for changes in the content and -content meta data. These <code>notify()</code> methods are described in +content metadata. These <code>notify()</code> methods are described in <a href="{@docRoot}training/tv/tif/ui.html#control"> Control Content</a> and <a href="{@docRoot}training/tv/tif/ui.html#track">Handle Track Selection</a> further in this training.</p> -<h2 id="setup">Define Your Setup Activity</h2> +<h3 id="setup">Define your setup activity</h3> <p>The system TV app works with the setup activity you define for your TV input. The setup activity is required and must provide at least one channel record for the system database. The -system TV app will invoke the setup activity when it cannot find a channel for the TV input. +system TV app invokes the setup activity when it cannot find a channel for the TV input. <p>The setup activity describes to the system TV app the channels made available through the TV input, as demonstrated in the next lesson, <a href="{@docRoot}training/tv/tif/channel.html">Creating -and Updating Channel Data</a>.</p> +and Updating Channel Data</a>.</p>
\ No newline at end of file diff --git a/docs/html/wear/preview/downloads.jd b/docs/html/wear/preview/downloads.jd index da6a06d485c0..bfa384bf2f10 100644 --- a/docs/html/wear/preview/downloads.jd +++ b/docs/html/wear/preview/downloads.jd @@ -346,7 +346,8 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement </p> <p class="warning"> - <strong>Warning:</strong> Installing a system image on a watch removes all data from the + <strong>Warning:</strong> Installing a system image on a watch + removes all data from the watch, so you should back up your data first. </p> @@ -355,8 +356,7 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement </h4> <p> - From the phone, unpair ("Forget") the watch. - Then on the watch, enable the Developer Options menu and ADB debugging as + On the watch, enable the Developer Options menu and ADB debugging as follows: </p> @@ -365,14 +365,14 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement </li> <li>Scroll to the bottom of the menu. If no <strong>Developer - Options</strong> item is provided, tap <strong>About</strong>. + Options</strong> item is provided, tap <strong>System</strong> + and then <strong>About</strong>. </li> <li>Tap the build number 7 times. </li> - <li>From the Settings menu, tap the <strong>Developer Options</strong> - item. + <li>From the Settings menu, tap <strong>Developer Options</strong>. </li> <li>Enable ADB debugging. @@ -418,7 +418,9 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement </li> <li>Use the following <a href="{@docRoot}tools/help/adb.html">adb - command</a> to confirm that the watch is available for flashing: + command</a> to confirm that the watch is recognized. + You may need to turn ADB debugging off and then on for the watch to + be recognized: <code>adb devices</code> </li> @@ -432,11 +434,11 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement devices, <code>fastboot oem unlock</code> </li> - <li>On the watch, select the <strong>Unlock</strong> option. + <li>On the watch, select the option to unlock the bootloader. </li> - <li>Navigate to the directory where you unzipped the system image in Step - 1. At the top level of that directory, + <li>On your computer, navigate to the directory where you unzipped the + system image in Step 1. At the top level of that directory, execute the <code>flash-all</code> script by typing <code>flash-all.sh</code> or, in the case of Windows, <code>flash-all.bat</code>. The following may need to @@ -449,16 +451,16 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement Set up the watch </h4> - <p> - After the <code>flash-all</code> script finishes, your watch reboots. - Only pair the watch with a phone (so you can begin testing the preview) - by using the instructions in <a href="#set_up_a_phone">Set Up a Phone</a>. - Additionally, before installing an app, perform the - following steps on the watch to re-secure the watch's bootloader: + <p> + After the <code>flash-all</code> script finishes, the watch reboots. + Only pair the watch with a phone (so you can begin testing the preview) + by using the instructions in <a href="#set_up_a_phone">Set Up a Phone</a>. + Additionally, before installing an app, perform the + following steps on the watch to re-secure the watch's bootloader: </p> <ol> - <li>Open the Settings menu (on the watch). + <li>Open the Settings menu by long-pressing the physical button. </li> <li>Scroll to the bottom of the menu and tap <strong>About</strong>. @@ -467,15 +469,16 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <li>Tap the build number 7 times. </li> - <li>From the Settings menu, tap the <strong>Developer Options</strong> - item. + <li>From the Settings menu, tap <strong>Developer Options</strong>. </li> <li>Enable ADB debugging. </li> <li>Connect the watch to your computer and tap <strong>Always allow from - this computer</strong>. + this computer</strong>. (You may need to turn ADB debugging off + and then on, to be prompted to always allow ADB debugging from + the connected computer.) </li> <li>Use the following adb command to start the device in fastboot mode: @@ -487,8 +490,11 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement devices, <code>fastboot oem lock</code> </li> - <li>On the watch, continue the boot by choosing - <strong>Start</strong> and touching <strong>'0'</strong>. + <li>On the watch, continue the boot as follows: + On an LGE Watch Urbane 2nd Edition, choose + <strong>Start</strong> and touch <strong>'0'</strong>. + On a Huawei Watch, confirm that <strong>Reboot</strong> is chosen and + long-press the physical button. </li> </ol> @@ -610,7 +616,8 @@ This is the Android Wear SDK Preview License Agreement (the “License Agreement <p> After you install the beta version of the companion app on a phone, - you can pair the phone to the watch: + unpair ("Forget") any obsolete watch pairings, if necessary. + Then you can pair the phone to a newly-imaged watch: </p> <ol> diff --git a/include/androidfw/Asset.h b/include/androidfw/Asset.h index ee77e971011b..52c863774efb 100644 --- a/include/androidfw/Asset.h +++ b/include/androidfw/Asset.h @@ -44,7 +44,7 @@ namespace android { */ class Asset { public: - virtual ~Asset(void); + virtual ~Asset(void) = default; static int32_t getGlobalCount(); static String8 getAssetAllocations(); @@ -119,6 +119,19 @@ public: const char* getAssetSource(void) const { return mAssetSource.string(); } protected: + /* + * Adds this Asset to the global Asset list for debugging and + * accounting. + * Concrete subclasses must call this in their constructor. + */ + static void registerAsset(Asset* asset); + + /* + * Removes this Asset from the global Asset list. + * Concrete subclasses must call this in their destructor. + */ + static void unregisterAsset(Asset* asset); + Asset(void); // constructor; only invoked indirectly /* handle common seek() housekeeping */ diff --git a/include/androidfw/AssetManager.h b/include/androidfw/AssetManager.h index 099d82eb564f..31b692d6624e 100644 --- a/include/androidfw/AssetManager.h +++ b/include/androidfw/AssetManager.h @@ -74,7 +74,7 @@ public: static const char* OVERLAY_DIR; /* * If OVERLAY_SKU_DIR_PROPERTY is set, search for runtime resource overlay - * APKs in OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> rather than in + * APKs in OVERLAY_DIR/<value of OVERLAY_SKU_DIR_PROPERTY> in addition to * OVERLAY_DIR. */ static const char* OVERLAY_SKU_DIR_PROPERTY; diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp index 4e14b13dc8bd..6ae39d5d5d01 100644 --- a/libs/androidfw/Asset.cpp +++ b/libs/androidfw/Asset.cpp @@ -52,6 +52,47 @@ static int32_t gCount = 0; static Asset* gHead = NULL; static Asset* gTail = NULL; +void Asset::registerAsset(Asset* asset) +{ + AutoMutex _l(gAssetLock); + gCount++; + asset->mNext = asset->mPrev = NULL; + if (gTail == NULL) { + gHead = gTail = asset; + } else { + asset->mPrev = gTail; + gTail->mNext = asset; + gTail = asset; + } + + if (kIsDebug) { + ALOGI("Creating Asset %p #%d\n", asset, gCount); + } +} + +void Asset::unregisterAsset(Asset* asset) +{ + AutoMutex _l(gAssetLock); + gCount--; + if (gHead == asset) { + gHead = asset->mNext; + } + if (gTail == asset) { + gTail = asset->mPrev; + } + if (asset->mNext != NULL) { + asset->mNext->mPrev = asset->mPrev; + } + if (asset->mPrev != NULL) { + asset->mPrev->mNext = asset->mNext; + } + asset->mNext = asset->mPrev = NULL; + + if (kIsDebug) { + ALOGI("Destroying Asset in %p #%d\n", asset, gCount); + } +} + int32_t Asset::getGlobalCount() { AutoMutex _l(gAssetLock); @@ -79,43 +120,8 @@ String8 Asset::getAssetAllocations() } Asset::Asset(void) - : mAccessMode(ACCESS_UNKNOWN) + : mAccessMode(ACCESS_UNKNOWN), mNext(NULL), mPrev(NULL) { - AutoMutex _l(gAssetLock); - gCount++; - mNext = mPrev = NULL; - if (gTail == NULL) { - gHead = gTail = this; - } else { - mPrev = gTail; - gTail->mNext = this; - gTail = this; - } - if (kIsDebug) { - ALOGI("Creating Asset %p #%d\n", this, gCount); - } -} - -Asset::~Asset(void) -{ - AutoMutex _l(gAssetLock); - gCount--; - if (gHead == this) { - gHead = mNext; - } - if (gTail == this) { - gTail = mPrev; - } - if (mNext != NULL) { - mNext->mPrev = mPrev; - } - if (mPrev != NULL) { - mPrev->mNext = mNext; - } - mNext = mPrev = NULL; - if (kIsDebug) { - ALOGI("Destroying Asset in %p #%d\n", this, gCount); - } } /* @@ -361,6 +367,9 @@ off64_t Asset::handleSeek(off64_t offset, int whence, off64_t curPosn, off64_t m _FileAsset::_FileAsset(void) : mStart(0), mLength(0), mOffset(0), mFp(NULL), mFileName(NULL), mMap(NULL), mBuf(NULL) { + // Register the Asset with the global list here after it is fully constructed and its + // vtable pointer points to this concrete type. b/31113965 + registerAsset(this); } /* @@ -369,6 +378,10 @@ _FileAsset::_FileAsset(void) _FileAsset::~_FileAsset(void) { close(); + + // Unregister the Asset from the global list here before it is destructed and while its vtable + // pointer still points to this concrete type. b/31113965 + unregisterAsset(this); } /* @@ -685,6 +698,9 @@ _CompressedAsset::_CompressedAsset(void) : mStart(0), mCompressedLen(0), mUncompressedLen(0), mOffset(0), mMap(NULL), mFd(-1), mZipInflater(NULL), mBuf(NULL) { + // Register the Asset with the global list here after it is fully constructed and its + // vtable pointer points to this concrete type. b/31113965 + registerAsset(this); } /* @@ -693,6 +709,10 @@ _CompressedAsset::_CompressedAsset(void) _CompressedAsset::~_CompressedAsset(void) { close(); + + // Unregister the Asset from the global list here before it is destructed and while its vtable + // pointer still points to this concrete type. b/31113965 + unregisterAsset(this); } /* diff --git a/libs/androidfw/tests/Android.mk b/libs/androidfw/tests/Android.mk index 2bc026b79ca2..1fe1773578fa 100644 --- a/libs/androidfw/tests/Android.mk +++ b/libs/androidfw/tests/Android.mk @@ -22,6 +22,7 @@ LOCAL_PATH:= $(call my-dir) testFiles := \ AppAsLib_test.cpp \ + Asset_test.cpp \ AttributeFinder_test.cpp \ ByteBucketArray_test.cpp \ Config_test.cpp \ diff --git a/libs/androidfw/tests/Asset_test.cpp b/libs/androidfw/tests/Asset_test.cpp new file mode 100644 index 000000000000..45c8cef92918 --- /dev/null +++ b/libs/androidfw/tests/Asset_test.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <androidfw/Asset.h> + +#include <gtest/gtest.h> + +using namespace android; + +TEST(AssetTest, FileAssetRegistersItself) { + const int32_t count = Asset::getGlobalCount(); + Asset* asset = new _FileAsset(); + EXPECT_EQ(count + 1, Asset::getGlobalCount()); + delete asset; + EXPECT_EQ(count, Asset::getGlobalCount()); +} + +TEST(AssetTest, CompressedAssetRegistersItself) { + const int32_t count = Asset::getGlobalCount(); + Asset* asset = new _CompressedAsset(); + EXPECT_EQ(count + 1, Asset::getGlobalCount()); + delete asset; + EXPECT_EQ(count, Asset::getGlobalCount()); +} diff --git a/libs/hwui/FrameBuilder.cpp b/libs/hwui/FrameBuilder.cpp index 37d9d0e749e6..7524ba0dcea6 100644 --- a/libs/hwui/FrameBuilder.cpp +++ b/libs/hwui/FrameBuilder.cpp @@ -591,7 +591,7 @@ void FrameBuilder::deferArcOp(const ArcOp& op) { } static bool hasMergeableClip(const BakedOpState& state) { - return state.computedState.clipState + return !state.computedState.clipState || state.computedState.clipState->mode == ClipMode::Rectangle; } diff --git a/libs/hwui/tests/unit/FrameBuilderTests.cpp b/libs/hwui/tests/unit/FrameBuilderTests.cpp index 53dbede2f8e1..e2dc3a0a2c66 100644 --- a/libs/hwui/tests/unit/FrameBuilderTests.cpp +++ b/libs/hwui/tests/unit/FrameBuilderTests.cpp @@ -477,6 +477,35 @@ RENDERTHREAD_TEST(FrameBuilder, clippedMerging) { EXPECT_EQ(4, renderer.getIndex()); } +RENDERTHREAD_TEST(FrameBuilder, regionClipStopsMerge) { + class RegionClipStopsMergeTestRenderer : public TestRendererBase { + public: + void onTextOp(const TextOp& op, const BakedOpState& state) override { mIndex++; } + }; + auto node = TestUtils::createNode(0, 0, 400, 400, + [](RenderProperties& props, TestCanvas& canvas) { + SkPath path; + path.addCircle(200, 200, 200, SkPath::kCW_Direction); + canvas.save(SaveFlags::MatrixClip); + canvas.clipPath(&path, SkRegion::kIntersect_Op); + SkPaint paint; + paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); + paint.setAntiAlias(true); + paint.setTextSize(50); + TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 100); + TestUtils::drawUtf8ToCanvas(&canvas, "Test string1", paint, 100, 200); + canvas.restore(); + }); + + FrameBuilder frameBuilder(SkRect::MakeWH(400, 400), 400, 400, + sLightGeometry, Caches::getInstance()); + frameBuilder.deferRenderNode(*TestUtils::getSyncedNode(node)); + + RegionClipStopsMergeTestRenderer renderer; + frameBuilder.replayBakedOps<TestDispatcher>(renderer); + EXPECT_EQ(2, renderer.getIndex()); +} + RENDERTHREAD_TEST(FrameBuilder, textMerging) { class TextMergingTestRenderer : public TestRendererBase { public: diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 5e00dc1a4fa3..6f24f763d6a6 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -1557,16 +1557,13 @@ public class ExifInterface { * <p> * This method is only supported for JPEG files. * </p> - * - * @throws UnsupportedOperationException If this method is called with unsupported files. */ public void saveAttributes() throws IOException { if (!mIsSupportedFile || mIsRaw) { - throw new UnsupportedOperationException( - "ExifInterface only supports saving attributes on JPEG formats."); + throw new IOException("ExifInterface only supports saving attributes on JPEG formats."); } if (mIsInputStream || (mSeekableFileDescriptor == null && mFilename == null)) { - throw new UnsupportedOperationException( + throw new IOException( "ExifInterface does not support saving attributes for the current input."); } diff --git a/media/java/android/media/Ringtone.java b/media/java/android/media/Ringtone.java index 6658e88184b0..00bdc69b5759 100644 --- a/media/java/android/media/Ringtone.java +++ b/media/java/android/media/Ringtone.java @@ -470,9 +470,7 @@ public class Ringtone { synchronized (sActiveRingtones) { sActiveRingtones.remove(Ringtone.this); } - if (mLocalPlayer != null) { - mLocalPlayer.setOnCompletionListener(null); - } + mp.setOnCompletionListener(null); // Help the Java GC: break the refcount cycle. } } } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java index db326ba6e2c2..012041ff1380 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/unit/ExifInterfaceTest.java @@ -416,7 +416,7 @@ public class ExifInterfaceTest extends AndroidTestCase { in = getContext().getAssets().open(imageFile.getName()); ExifInterface exifInterface = new ExifInterface(in); exifInterface.saveAttributes(); - } catch (UnsupportedOperationException e) { + } catch (IOException e) { // Expected. saveAttributes is not supported with an ExifInterface object which was // created with InputStream. return; diff --git a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java index 177ba0d20154..d87bc11a8495 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java +++ b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java @@ -42,12 +42,6 @@ public class IconUtils { public static Drawable loadMimeIcon( Context context, String mimeType, String authority, String docId, int mode) { if (Document.MIME_TYPE_DIR.equals(mimeType)) { - // TODO: eventually move these hacky assets into that package - if ("com.android.providers.media.documents".equals(authority) - && docId.startsWith("album")) { - return context.getDrawable(R.drawable.ic_doc_album); - } - if (mode == State.MODE_GRID) { return context.getDrawable(R.drawable.ic_grid_folder); } else { diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java index cebc9b05679e..557a2f6abc9f 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsLoader.java @@ -157,6 +157,9 @@ public class RecentsLoader extends AsyncTaskLoader<DirectoryResult> { throw new RuntimeException(e); } catch (ExecutionException e) { // We already logged on other side + } catch (Exception e) { + Log.e(TAG, "Failed to query Recents for authority: " + task.authority + + ". Skip this authority in Recents.", e); } } else { allDone = false; diff --git a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java index 0a2960f8ffe0..94b8277f4edd 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java +++ b/packages/DocumentsUI/src/com/android/documentsui/dirlist/Model.java @@ -107,7 +107,13 @@ public class Model { mSortOrder = result.sortOrder; doc = result.doc; - updateModelData(); + try { + updateModelData(); + } catch (Exception e) { + Log.e(TAG, "Error while accessing cursors", e); + notifyUpdateListeners(e); + return; + } final Bundle extras = mCursor.getExtras(); if (extras != null) { diff --git a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java index 90dd4406346a..8f254e9735da 100644 --- a/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java +++ b/packages/MtpDocumentsProvider/src/com/android/mtp/MtpManager.java @@ -282,8 +282,8 @@ class MtpManager { } final MtpDeviceInfo info = mtpDevice.getDeviceInfo(); if (info != null) { - operationsSupported = mtpDevice.getDeviceInfo().getOperationsSupported(); - eventsSupported = mtpDevice.getDeviceInfo().getEventsSupported(); + operationsSupported = info.getOperationsSupported(); + eventsSupported = info.getEventsSupported(); } } else { roots = new MtpRoot[0]; diff --git a/packages/SettingsLib/res/values/config.xml b/packages/SettingsLib/res/values/config.xml index e2e721c5ae6b..0aa76a024d5b 100755 --- a/packages/SettingsLib/res/values/config.xml +++ b/packages/SettingsLib/res/values/config.xml @@ -23,8 +23,8 @@ <!-- Default data warning level in mb --> <integer name="default_data_warning_level_mb">2048</integer> - <!-- Whether to send a custom package name with the PSD. translatable="false"--> - <bool name="config_sendPackageName">true</bool> + <!-- Whether to send a custom package name with the PSD.--> + <bool name="config_sendPackageName">false</bool> <!-- Name for the set of keys associating package names --> <string name="config_helpPackageNameKey" translatable="false"></string> diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index b63752c22521..234ae712c49e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -356,7 +356,11 @@ public class AccessPoint implements Comparable<AccessPoint> { } public DetailedState getDetailedState() { - return mNetworkInfo != null ? mNetworkInfo.getDetailedState() : null; + if (mNetworkInfo != null) { + return mNetworkInfo.getDetailedState(); + } + Log.w(TAG, "NetworkInfo is null, cannot return detailed state"); + return null; } public String getSavedNetworkSummary() { @@ -798,7 +802,10 @@ public class AccessPoint implements Comparable<AccessPoint> { return context.getString(R.string.wifi_connected_no_internet); } } - + if (state == null) { + Log.w(TAG, "state is null, returning empty summary"); + return ""; + } String[] formats = context.getResources().getStringArray((ssid == null) ? R.array.wifi_status : R.array.wifi_status_with_ssid); int index = state.ordinal(); diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index c07fa2344835..fbd523f90a88 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Maak <xliff:g id="ID_1">%s</xliff:g>-instellings oop."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Wysig volgorde van instellings."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Bladsy <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Kennisgewings kan nie stilgemaak of geblokkeer word nie"</string> </resources> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 1e54459dbe5e..98f09f4e5d51 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"የ<xliff:g id="ID_1">%s</xliff:g> ቅንብሮችን ክፈት።"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"የቅንብሮድ ቅደም-ተከተል አርትዕ።"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"ገጽ <xliff:g id="ID_1">%1$d</xliff:g> ከ <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"ማሳወቂያዎች ላይ ድምጸ-ከል ማድረግ ወይም ማገድ አይቻልም"</string> </resources> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index de321ebeb7f3..c954e41107c8 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -659,4 +659,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"فتح إعدادات <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"تعديل ترتيب الإعدادات."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"الصفحة <xliff:g id="ID_1">%1$d</xliff:g> من <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"لا يمكن كتم صوت الإشعارات أو حظرها"</string> </resources> diff --git a/packages/SystemUI/res/values-az-rAZ/strings.xml b/packages/SystemUI/res/values-az-rAZ/strings.xml index 53e38eb43fe6..d2f93d2fc7c7 100644 --- a/packages/SystemUI/res/values-az-rAZ/strings.xml +++ b/packages/SystemUI/res/values-az-rAZ/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını açın."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Ayarların sıralanmasını redaktə edin."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> səhifədən <xliff:g id="ID_1">%1$d</xliff:g> səhifə"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Bildirişlər susdurula və ya blok edilə bilməz"</string> </resources> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 80eae135f84d..19d58d520780 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvori podešavanja za <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Izmeni redosled podešavanja."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. strana od <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Zvuk obaveštenja ne može da se isključi niti ona mogu da se blokiraju"</string> </resources> diff --git a/packages/SystemUI/res/values-be-rBY/strings.xml b/packages/SystemUI/res/values-be-rBY/strings.xml index 14b5017f3c1f..7538a9a06f4e 100644 --- a/packages/SystemUI/res/values-be-rBY/strings.xml +++ b/packages/SystemUI/res/values-be-rBY/strings.xml @@ -657,4 +657,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Адкрыць налады <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Змяніць парадак налад."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Старонка <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Гук паведамленняў нельга адключыць, і іх нельга заблакіраваць"</string> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 7360e8d576b3..b1841429807d 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Отваряне на настройките за <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Редактиране на подредбата на настройките."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Страница <xliff:g id="ID_1">%1$d</xliff:g> от <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Известията не могат да бъдат заглушавани, нито блокирани"</string> </resources> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index 7b5d347d9427..2cd7b0450107 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> সেটিংস খুলুন৷"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ক্রম বা সেটিংস সম্পাদনা করুন৷"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>টির মধ্যে <xliff:g id="ID_1">%1$d</xliff:g> নং পৃষ্ঠা"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"বিজ্ঞপ্তিগুলিকে নীরব বা অবরুদ্ধ করা যাবে না"</string> </resources> diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index f95660e066e0..3fc98fd0d0b4 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -655,4 +655,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvori postavke za: <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Urediti raspored postavki."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Obavještenja nije moguće prigušiti ili blokirati"</string> </resources> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 18ee9b1c7879..483f766f4f46 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Obre la configuració per a <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edita l\'ordre de la configuració."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pàgina <xliff:g id="ID_1">%1$d</xliff:g> (<xliff:g id="ID_2">%2$d</xliff:g> en total)"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Les notificacions no es poden silenciar ni bloquejar"</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index aa26b7a7fbaa..6adcde3d34e2 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -657,4 +657,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otevřít nastavení aplikace <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Upravit pořadí nastavení."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Stránka <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Oznámení nelze ztlumit ani blokovat"</string> </resources> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index a643f8d11a1b..7de602a2f1f0 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -304,7 +304,7 @@ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"Byt om på farver"</string> <string name="quick_settings_color_space_label" msgid="853443689745584770">"Farvekorrigeringstilstand"</string> <string name="quick_settings_more_settings" msgid="326112621462813682">"Flere indstillinger"</string> - <string name="quick_settings_done" msgid="3402999958839153376">"Udført"</string> + <string name="quick_settings_done" msgid="3402999958839153376">"Udfør"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Tilsluttet"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Opretter forbindelse…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Netdeling"</string> @@ -521,7 +521,7 @@ <string name="notification_importance_high" msgid="1729480727023990427">"Se altid smugkig. Ingen afbrydelse af fuld skærm."</string> <string name="notification_importance_max" msgid="2508384624461849111">"Se altid smugkig, og tillad afbrydelse af fuld skærm."</string> <string name="notification_more_settings" msgid="816306283396553571">"Flere indstillinger"</string> - <string name="notification_done" msgid="5279426047273930175">"Færdig"</string> + <string name="notification_done" msgid="5279426047273930175">"Udfør"</string> <string name="notification_gear_accessibility" msgid="94429150213089611">"Kontrolelementer til underretninger for <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> <string name="battery_panel_title" msgid="7944156115535366613">"Batteriforbrug"</string> <string name="battery_detail_charging_summary" msgid="1279095653533044008">"Batterisparefunktionen er ikke tilgængelig under opladning"</string> @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Åbn <xliff:g id="ID_1">%s</xliff:g>-indstillinger."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Rediger rækkefølgen af indstillinger."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Side <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Underretninger kan ikke ignoreres eller blokeres"</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 3f38683378ec..fc6d9a07303f 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -271,7 +271,7 @@ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> Geräte)"</string> <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth aus"</string> - <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Keine Pairing-Geräte verfügbar"</string> + <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Keine gekoppelten Geräte verfügbar"</string> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Helligkeit"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Automatisch drehen"</string> <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Bildschirm automatisch drehen"</string> @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Einstellungen für <xliff:g id="ID_1">%s</xliff:g> öffnen."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Reihenfolge der Einstellungen bearbeiten."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Seite <xliff:g id="ID_1">%1$d</xliff:g> von <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Benachrichtigungen können nicht stummgeschaltet oder blockiert werden"</string> </resources> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 88eb05df03ae..a9b8bb506afe 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -163,7 +163,7 @@ <string name="accessibility_battery_level_charging" msgid="1147587904439319646">"Φόρτιση μπαταρίας, <xliff:g id="BATTERY_PERCENTAGE">%d</xliff:g> τοις εκατό."</string> <string name="accessibility_settings_button" msgid="799583911231893380">"Ρυθμίσεις συστήματος."</string> <string name="accessibility_notifications_button" msgid="4498000369779421892">"Ειδοποιήσεις."</string> - <string name="accessibility_remove_notification" msgid="3603099514902182350">"Εκκαθάριση ειδοποίησης."</string> + <string name="accessibility_remove_notification" msgid="3603099514902182350">"Διαγραφή ειδοποίησης."</string> <string name="accessibility_gps_enabled" msgid="3511469499240123019">"Το GPS ενεργοποιήθηκε."</string> <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"Προσδιορισμός GPS."</string> <string name="accessibility_tty_enabled" msgid="4613200365379426561">"Το TeleTypewriter ενεργοποιήθηκε."</string> @@ -245,7 +245,7 @@ <string name="gps_notification_searching_text" msgid="8574247005642736060">"Αναζήτηση για GPS"</string> <string name="gps_notification_found_text" msgid="4619274244146446464">"Ρύθμιση τοποθεσίας με GPS"</string> <string name="accessibility_location_active" msgid="2427290146138169014">"Τα αιτήματα τοποθεσίας έχουν ενεργοποιηθεί"</string> - <string name="accessibility_clear_all" msgid="5235938559247164925">"Εκκαθάριση όλων των ειδοποιήσεων."</string> + <string name="accessibility_clear_all" msgid="5235938559247164925">"Διαγραφή όλων των ειδοποιήσεων."</string> <string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> <plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> επιπλέον ειδοποιήσεις εντός της ομάδας.</item> @@ -323,7 +323,7 @@ <string name="quick_settings_night_display_summary_on" msgid="1814901757887526769">"Ο Νυχτερινός φωτισμός είναι ενεργοποιημένος. Πατήστε για απενεργοποίηση."</string> <string name="quick_settings_night_display_summary_off" msgid="7892102914128777905">"Ο Νυχτερινός φωτισμός είναι απενεργοποιημένος. Πατήστε για ενεργοποίηση."</string> <string name="recents_empty_message" msgid="808480104164008572">"Δεν υπάρχουν πρόσφατα στοιχεία"</string> - <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Έχει γίνει εκκαθάριση όλων των στοιχείων"</string> + <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Έχει γίνει διαγραφή όλων των στοιχείων"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Πληροφορίες εφαρμογής"</string> <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"καρφίτσωμα οθόνης"</string> <string name="recents_search_bar_label" msgid="8074997400187836677">"αναζήτηση"</string> @@ -438,7 +438,7 @@ <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Θα εμφανιστεί ξανά την επόμενη φορά που θα το ενεργοποιήσετε στις ρυθμίσεις."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Απόκρυψη"</string> <string name="volumeui_prompt_message" msgid="918680947433389110">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> θέλει να γίνει το παράθυρο διαλόγου ελέγχου έντασης"</string> - <string name="volumeui_prompt_allow" msgid="7954396902482228786">"Να επιτραπεί"</string> + <string name="volumeui_prompt_allow" msgid="7954396902482228786">"Να επιτρέπεται"</string> <string name="volumeui_prompt_deny" msgid="5720663643411696731">"Απόρριψη"</string> <string name="volumeui_notification_title" msgid="4906770126345910955">"Η εφαρμογή <xliff:g id="APP_NAME">%1$s</xliff:g> αποτελεί το παράθυρο διαλόγου ελέγχου έντασης"</string> <string name="volumeui_notification_text" msgid="8819536904234337445">"Πατήστε για να επαναφέρετε την αρχική μορφή της εικόνας."</string> @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Άνοιγμα ρυθμίσεων <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Επεξεργασία σειράς ρυθμίσεων."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Σελίδα <xliff:g id="ID_1">%1$d</xliff:g> από <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Δεν είναι δυνατή η σίγαση ή ο αποκλεισμός των ειδοποιήσεων"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 5dc062cd30d2..bed0f5c431a4 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit order of settings."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Notifications can\'t be silenced or blocked"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 5dc062cd30d2..bed0f5c431a4 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit order of settings."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Notifications can\'t be silenced or blocked"</string> </resources> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 5dc062cd30d2..bed0f5c431a4 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Open <xliff:g id="ID_1">%s</xliff:g> settings."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit order of settings."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> of <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Notifications can\'t be silenced or blocked"</string> </resources> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index 79e4b2f026f1..485d2e0ffa17 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir configuración de <xliff:g id="ID_1">%s</xliff:g>"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar orden de configuración"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Las notificaciones no se pueden silenciar ni bloquear"</string> </resources> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 93c23c980c9e..0e0f412459f5 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -233,8 +233,8 @@ <string name="accessibility_quick_settings_work_mode_on" msgid="7650588553988014341">"Modo de trabajo activado."</string> <string name="accessibility_quick_settings_work_mode_changed_off" msgid="5605534876107300711">"Modo de trabajo desactivado."</string> <string name="accessibility_quick_settings_work_mode_changed_on" msgid="249840330756998612">"Modo de trabajo activado."</string> - <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Economizador de Datos desactivado."</string> - <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Economizador de Datos activado."</string> + <string name="accessibility_quick_settings_data_saver_changed_off" msgid="650231949881093289">"Ahorro de datos desactivado."</string> + <string name="accessibility_quick_settings_data_saver_changed_on" msgid="4218725402373934151">"Ahorro de datos activado."</string> <string name="accessibility_brightness" msgid="8003681285547803095">"Brillo de la pantalla"</string> <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"Datos 2G-3G pausados"</string> <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"Datos 4G pausados"</string> @@ -580,9 +580,9 @@ <string name="headset" msgid="4534219457597457353">"Auriculares"</string> <string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"Auriculares conectados"</string> <string name="accessibility_status_bar_headset" msgid="8666419213072449202">"Auriculares conectados"</string> - <string name="data_saver" msgid="5037565123367048522">"Economizador de Datos"</string> - <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Economizador de Datos activado"</string> - <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Economizador de Datos desactivado"</string> + <string name="data_saver" msgid="5037565123367048522">"Ahorro de datos"</string> + <string name="accessibility_data_saver_on" msgid="8454111686783887148">"Ahorro de datos activado"</string> + <string name="accessibility_data_saver_off" msgid="8841582529453005337">"Ahorro de datos desactivado"</string> <string name="switch_bar_on" msgid="1142437840752794229">"Sí"</string> <string name="switch_bar_off" msgid="8803270596930432874">"No"</string> <string name="nav_bar" msgid="1993221402773877607">"Barra de navegación"</string> @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir ajustes de <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Cambiar el orden de los ajustes."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Las notificaciones no se pueden silenciar ni bloquear"</string> </resources> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index d8a7ca760214..0cdf8d20a18e 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Ava teenuse <xliff:g id="ID_1">%s</xliff:g> seaded."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Muuda seadete järjestust."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Leht <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Märguandeid ei saa vaigistada ega blokeerida"</string> </resources> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index bed00b9a4934..94941104f021 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Ireki <xliff:g id="ID_1">%s</xliff:g> ezarpenak."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editatu ezarpenen ordena."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g> orria"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Jakinarazpenak ezin dira ezkutatu edo blokeatu"</string> </resources> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index 021637e01389..abb7e1ee51f3 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"باز کردن تنظیمات <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ویرایش ترتیب تنظیمات."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"صفحه <xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"نمیتوان اعلانها را بیصدا یا مسدود کرد"</string> </resources> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 56e4ee5091f8..910ac29b7b05 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Avaa kohteen <xliff:g id="ID_1">%s</xliff:g> asetukset."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Muokkaa asetusten järjestystä."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Sivu <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Ilmoituksia ei voi mykistää tai estää"</string> </resources> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index a93c25e8f937..8c5e46f747a0 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Ouvrir les paramètres <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Modifier l\'ordre des paramètres."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Impossible de désactiver ou de bloquer les notifications"</string> </resources> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 4f8d57b6b8a5..4b58a6d376df 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Ouvrir les paramètres <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Modifier l\'ordre des paramètres."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> sur <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Impossible d\'ignorer ou de bloquer les notifications"</string> </resources> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 62014013a1a2..449c747814d5 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir a configuración de <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar a orde das opcións de configuración."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Páxina <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"As notificacións non se poden silenciar nin bloquear"</string> </resources> diff --git a/packages/SystemUI/res/values-gu-rIN/strings.xml b/packages/SystemUI/res/values-gu-rIN/strings.xml index 5ef386c3d691..5287576dfdee 100644 --- a/packages/SystemUI/res/values-gu-rIN/strings.xml +++ b/packages/SystemUI/res/values-gu-rIN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> સેટિંગ્સ ખોલો."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"સેટિંગ્સનો ક્રમ સંપાદિત કરો."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> માંથી <xliff:g id="ID_1">%1$d</xliff:g> પૃષ્ઠ"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"સૂચનાઓ શાંત અથવા અવરોધિત કરી શકાતી નથી"</string> </resources> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 6339eee035c4..5c24fe2cf3a9 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> सेटिंग खोलें."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"सेटिंग का क्रम संपादित करें."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"पृष्ठ <xliff:g id="ID_2">%2$d</xliff:g> में से <xliff:g id="ID_1">%1$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"नोटिफ़िकेशन मौन या अवरुद्ध नहीं किए जा सकते हैं"</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 5fca7386fb18..df3ccf1e5fc1 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvaranje postavki za <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Uređivanje redoslijeda postavki."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Stranica <xliff:g id="ID_1">%1$d</xliff:g> od <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Obavijesti se ne mogu utišati niti blokirati"</string> </resources> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 6542fd42feca..425212a56186 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"A(z) <xliff:g id="ID_1">%s</xliff:g> beállításainak megnyitása."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Beállítások sorrendjének szerkesztése."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. oldal, összesen: <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Az értesítéseket nem lehet elnémítani vagy letiltani"</string> </resources> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 1e633369646c..77b1c824a7f4 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Բացել <xliff:g id="ID_1">%s</xliff:g> կարգավորումները:"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Խմբագրել կարգավորումների հերթականությունը:"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Էջ <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Հնարավոր չէ արգելափակել ծանուցումները կամ անջատել դրանց ձայնը"</string> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 9155434149fc..d006addad516 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Buka setelan <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit urutan setelan."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> dari <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Notifikasi tidak dapat disenyapkan atau diblokir"</string> </resources> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index 030e4aac4cde..26b1e74b0cfc 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Opna <xliff:g id="ID_1">%s</xliff:g> stillingar."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Breyta röð stillinga."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Blaðsíða <xliff:g id="ID_1">%1$d</xliff:g> af <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Ekki er hægt að þagga eða loka á tilkynningar"</string> </resources> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 3a17fa93d0fb..dea83ecf2620 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Apri le impostazioni <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Modifica l\'ordine delle impostazioni."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> di <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Le notifiche non possono essere disattivate o bloccate"</string> </resources> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index f1df4c5416c0..19a94a3c53e3 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -655,4 +655,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"פתיחת הגדרות של <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"עריכת סדר ההגדרות."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"דף <xliff:g id="ID_1">%1$d</xliff:g> מתוך <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"לא ניתן להשתיק או לחסום הודעות"</string> </resources> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 7b84277634cc..a6f521b5bc0c 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> の設定を開きます。"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"設定の順序を編集します。"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"ページ <xliff:g id="ID_1">%1$d</xliff:g>/<xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"通知のサイレント設定やブロックはできません"</string> </resources> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 69a6f44f275e..258c90450e48 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> პარამეტრების გახსნა."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"პარამეტრების მიმდევრობის რედაქტირება."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"გვერდი <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>-დან"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"შეტყობინებების გაჩუმება ან დაბლოკვა ვერ მოხერხდება"</string> </resources> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index 0a0b7b284410..25ede612d22d 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> параметрлерін ашу."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Параметрлер тәртібін өзгерту."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ішінен <xliff:g id="ID_1">%1$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Хабарландыруды үнсіз режимге қою не бөгеу мүмкін емес"</string> </resources> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 25a065091029..f839eb648181 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"បើការកំណត់ <xliff:g id="ID_1">%s</xliff:g>"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"កែលំដាប់ការកំណត់"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"ទំព័រ <xliff:g id="ID_1">%1$d</xliff:g> នៃ <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"ការជូនដំណឹងមិនអាចបិទសំឡេង ឬរារាំងបានទេ"</string> </resources> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index 18ca57bc139e..8d9b2dd546b5 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -84,7 +84,7 @@ <string name="accessibility_home" msgid="8217216074895377641">"ಮುಖಪುಟ"</string> <string name="accessibility_menu" msgid="316839303324695949">"ಮೆನು"</string> <string name="accessibility_recent" msgid="5208608566793607626">"ಸಮಗ್ರ ನೋಟ"</string> - <string name="accessibility_search_light" msgid="1103867596330271848">"ಹುಡುಕು"</string> + <string name="accessibility_search_light" msgid="1103867596330271848">"ಹುಡುಕಿ"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"ಕ್ಯಾಮರಾ"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"ಫೋನ್"</string> <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ಧ್ವನಿ ಸಹಾಯಕ"</string> @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ಸೆಟ್ಟಿಂಗ್ಗಳ ಕ್ರಮವನ್ನು ಎಡಿಟ್ ಮಾಡಿ."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="ID_1">%1$d</xliff:g> ಪುಟ"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"ಸೂಚನೆಗಳನ್ನು ಮೌನವಾಗಿಸಲಾಗುವುದಿಲ್ಲ ಅಥವಾ ತಡೆಹಿಡಿಯಲಾಗುವುದಿಲ್ಲ"</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 4917bb80a433..2090404491d1 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> 설정 열기"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"설정 순서 수정"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>페이지 중 <xliff:g id="ID_1">%1$d</xliff:g>페이지"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"알림을 무음으로 설정하거나 차단할 수 없습니다."</string> </resources> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index a00526720aa2..cb404cb30a02 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> жөндөөлөрүн ачуу."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Жөндөөлөрдүн иретин өзгөртүү."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ичинен <xliff:g id="ID_1">%1$d</xliff:g>-бет"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Эскертмелердин үнүн басууга же бөгөттөөгө болбойт"</string> </resources> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index a728921d8658..76350ccf56c7 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"ເປີດການຕັ້ງຄ່າ <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ແກ້ໄຂລຳດັບການຕັ້ງຄ່າ."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"ບໍ່ສາມາດປິດສຽງ ຫຼື ບລັອກການແຈ້ງເຕືອນໄດ້"</string> </resources> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 444045b8512a..480d88a2c09c 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -655,4 +655,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Atidaryti „<xliff:g id="ID_1">%s</xliff:g>“ nustatymus."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Redaguoti nustatymų tvarką."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g> psl. iš <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Pranešimų negalima nutildyti arba užblokuoti"</string> </resources> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index de4c3cac8882..564a29c5f05d 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Atvērt <xliff:g id="ID_1">%s</xliff:g> iestatījumus."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Rediģēt iestatījumu secību."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. lpp. no <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Nevar izslēgt paziņojumu signālu vai tos bloķēt"</string> </resources> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index a173056bf12d..602fdc9fb385 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Отворете ги поставките на <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Уредете го редоследот на поставките."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Страница <xliff:g id="ID_1">%1$d</xliff:g> од <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Известувања не може да се стишат или блокираат"</string> </resources> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index 7e1b4f76c793..ddabf900734c 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ക്രമീകരണം തുറക്കുക."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ക്രമീകരണ ക്രമം എഡിറ്റുചെയ്യുക."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"പേജ് <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"അറിയിപ്പുകൾ നിശബ്ദമാക്കാനോ ബ്ലോക്കുചെയ്യാനോ കഴിയില്ല"</string> </resources> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index 0fcd1abb8cea..df9e7993ea7b 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> тохиргоог нээнэ үү."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Тохиргооны дарааллыг өөрчилнө үү."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>-н <xliff:g id="ID_1">%1$d</xliff:g>-р хуудас"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Мэдэгдлийн дууг хаах, эсвэл блоклох боломжгүй"</string> </resources> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index 34acc11b5a48..006b9bbd5605 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> सेटिंग्ज उघडा."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"सेटिंग्जचा क्रम संपादित करा."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"पृष्ठ <xliff:g id="ID_2">%2$d</xliff:g> पैकी <xliff:g id="ID_1">%1$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"सूचना शांत किंवा अवरोधित केल्या जाऊ शकत नाहीत"</string> </resources> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index b0c591efbe7b..df0faeb287ee 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Buka tetapan <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edit susunan tetapan."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Halaman <xliff:g id="ID_1">%1$d</xliff:g> daripada <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Pemberitahuan tidak boleh disenyapkan atau disekat"</string> </resources> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index bb6f337f7d88..92ee06e0ef54 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ဆက်တင်များကို ဖွင့်ပါ။"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ဆက်တင်များ၏ အစီအစဉ်ကို တည်းဖြတ်ပါ။"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"စာမျက်နှာ <xliff:g id="ID_2">%2$d</xliff:g> အနက်မှ စာမျက်နှာ <xliff:g id="ID_1">%1$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"အကြောင်းကြားချက်များကို အသံတိတ်ခြင်း သို့မဟုတ် ပိတ်ဆို့ခြင်းများ ပြုလုပ်၍ မရပါ"</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 4e67111d1fd6..02cb082305a9 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Åpne <xliff:g id="ID_1">%s</xliff:g>-innstillingene."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Endre rekkefølgen på innstillingene."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Side <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Varslinger kan ikke ignoreres eller blokkeres"</string> </resources> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 2fb31d172da2..79d4b846464b 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> सम्बन्धी सेटिङहरूलाई खोल्नुहोस्।"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"सेटिङहरूको क्रमलाई सम्पादन गर्नुहोस्।"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> मध्ये पृष्ठ <xliff:g id="ID_1">%1$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"सूचनाहरूलाई मौन गर्न वा यसमाथि रोक लगाउन मिल्दैन"</string> </resources> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 695dbcd9d73a..a2a43650dcdf 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g>-instellingen openen."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Volgorde van instellingen bewerken."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> van <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Meldingen kunnen niet op stil worden gezet of worden geblokkeerd"</string> </resources> diff --git a/packages/SystemUI/res/values-pa-rIN/strings.xml b/packages/SystemUI/res/values-pa-rIN/strings.xml index ec2f76ab4064..e000541ed10e 100644 --- a/packages/SystemUI/res/values-pa-rIN/strings.xml +++ b/packages/SystemUI/res/values-pa-rIN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹੋ।"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ਸੈਟਿੰਗਾਂ ਦੇ ਕ੍ਰਮ ਦਾ ਸੰਪਾਦਨ ਕਰੋ।"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> ਦਾ <xliff:g id="ID_1">%1$d</xliff:g> ਪੰਨਾ"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"ਸੂਚਨਾਵਾਂ ਨੂੰ ਖਾਮੋਸ਼ ਜਾਂ ਬਲੌਕ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 4452ad1b56ae..46ab85badcab 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -655,4 +655,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otwórz ustawienia: <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Edytuj kolejność ustawień."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Strona <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Nie można wyciszyć ani zablokować powiadomień"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 9f279e336dc3..25aeb5fbfb5c 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar ordem das configurações."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Não é possível silenciar ou bloquear as notificações"</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index a46ef71588d5..79f1c7d87226 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir as definições de <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar a ordem das definições."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Não é possível silenciar ou bloquear as notificações"</string> </resources> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 9f279e336dc3..25aeb5fbfb5c 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Abrir configurações de <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editar ordem das configurações."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Página <xliff:g id="ID_1">%1$d</xliff:g> de <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Não é possível silenciar ou bloquear as notificações"</string> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 20b8a6e574b8..408edf318920 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -655,4 +655,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Deschideți setările <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Editați ordinea setărilor."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Pagina <xliff:g id="ID_1">%1$d</xliff:g> din <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Notificările nu pot fi dezactivate sau blocate"</string> </resources> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index a9b7346bb9db..7efd8fa63a2f 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -657,4 +657,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Открыть настройки <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Изменить порядок быстрых настроек."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Страница <xliff:g id="ID_1">%1$d</xliff:g> из <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Уведомления нельзя блокировать и показывать без звука"</string> </resources> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 9b941627484f..749231d54782 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> සැකසීම් විවෘත කරන්න."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"සැකසීම්වල අනුපිළිවෙළ සංංස්කරණය කරන්න."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g> න් <xliff:g id="ID_1">%1$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"දැනුම්දීම් නිහඬ හෝ අවහිර කළ නොහැකිය"</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 3a5a4ec0a711..8dd25693fa58 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -657,4 +657,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Otvoriť nastavenia <xliff:g id="ID_1">%s</xliff:g>"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Upraviť poradie nastavení"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Strana <xliff:g id="ID_1">%1$d</xliff:g> z <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Upozornenia nie je možné stlmiť ani blokovať"</string> </resources> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index b889cf946d81..fc81a23b8abf 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -657,4 +657,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Odpri nastavitve za <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Uredi vrstni red nastavitev."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. stran od <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Obvestil ni mogoče utišati ali blokirati"</string> </resources> diff --git a/packages/SystemUI/res/values-sq-rAL/strings.xml b/packages/SystemUI/res/values-sq-rAL/strings.xml index b965b3240e48..68f56852d98d 100644 --- a/packages/SystemUI/res/values-sq-rAL/strings.xml +++ b/packages/SystemUI/res/values-sq-rAL/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Hap cilësimet e <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Modifiko rendin e cilësimeve."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Faqja <xliff:g id="ID_1">%1$d</xliff:g> nga <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Njoftimet nuk mund të vendosen në heshtje ose të bllokohen"</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 2f339a45a1e0..d31305495669 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Отвори подешавања за <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Измени редослед подешавања."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>. страна од <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Звук обавештења не може да се искључи нити она могу да се блокирају"</string> </resources> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index c758f8bffdbd..8176422c8a7a 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Öppna <xliff:g id="ID_1">%s</xliff:g>-inställningarna."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Ändra ordning på inställningarna."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Sida <xliff:g id="ID_1">%1$d</xliff:g> av <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Det går inte att tysta eller blockera aviseringar"</string> </resources> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 54d49f5559ed..f8b825ad868b 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Fungua mipangilio ya <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Badilisha orodha ya mipangilio."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Ukurasa wa <xliff:g id="ID_1">%1$d</xliff:g> kati ya <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Huwezi kuzima wala kuzuia arifa"</string> </resources> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 6b44b09d06e9..0080f8e5301e 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> அமைப்புகளைத் திற."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"அமைப்புகளின் வரிசை முறையைத் திருத்து."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"பக்கம் <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"அறிவிப்புகளை ஒலியடக்க அல்லது தடுக்க முடியவில்லை"</string> </resources> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index fae5ca67d8d3..a1a85fc3ffc2 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> సెట్టింగ్లను తెరవండి."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"సెట్టింగ్ల క్రమాన్ని సవరించండి."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_2">%2$d</xliff:g>లో <xliff:g id="ID_1">%1$d</xliff:g>వ పేజీ"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"నోటిఫికేషన్లను నిశ్శబ్దంగా ఉంచలేరు లేదా బ్లాక్ చేయలేరు"</string> </resources> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 2f04acfc452c..805431d51258 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"เปิดการตั้งค่า <xliff:g id="ID_1">%s</xliff:g>"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"แก้ไขลำดับการตั้งค่า"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"หน้า <xliff:g id="ID_1">%1$d</xliff:g> จาก <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"ไม่สามารถปิดเสียงหรือบล็อกการแจ้งเตือน"</string> </resources> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 849dc45a150d..89af1894a798 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Buksan ang mga setting ng <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"I-edit ang pagkakasunud-sunod ng mga setting."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Page <xliff:g id="ID_1">%1$d</xliff:g> ng <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Hindi maaaring i-silent o i-block ang mga notification"</string> </resources> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 98f493cadcf6..c17e9fc3cbe8 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ayarlarını aç."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Ayarların sırasını düzenle."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Sayfa <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Bildirimler engellenemez veya sesi kapatılamaz"</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 0f278c87d19f..92f137211f86 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -657,4 +657,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Відкрити налаштування <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Змінити порядок налаштувань."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Сторінка <xliff:g id="ID_1">%1$d</xliff:g> з <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Сповіщення не можна вимкнути або заблокувати"</string> </resources> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 790726e57ae8..b7b87eb29902 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> ترتیبات کھولیں۔"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"ترتیبات کی ترتیب میں ترمیم کریں۔"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"صفحہ <xliff:g id="ID_1">%1$d</xliff:g> از <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"اطلاعات کو خاموش یا مسدود نہیں کیا جا سکتا"</string> </resources> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index dccab11591f1..61195c587bc0 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"<xliff:g id="ID_1">%s</xliff:g> sozlamalarini ochish."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Sozlamalar tartibini o‘zgartirish."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"<xliff:g id="ID_1">%1$d</xliff:g>-sahifa, jami: <xliff:g id="ID_2">%2$d</xliff:g> ta sahifa"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Bildirishnomalarni bloklab yoki ovozsiz ko‘rinadigan qilib bo‘lmaydi"</string> </resources> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 158fbf6efd3d..6aaab66f2c45 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Mở cài đặt <xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Chỉnh sửa thứ tự cài đặt."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Trang <xliff:g id="ID_1">%1$d</xliff:g> / <xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Không thể chặn hoặc tắt tiếng thông báo"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index cfabc0844e5c..f10d53868325 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"打开<xliff:g id="ID_1">%s</xliff:g>设置。"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"修改设置顺序。"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"第 <xliff:g id="ID_1">%1$d</xliff:g> 页,共 <xliff:g id="ID_2">%2$d</xliff:g> 页"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"无法将通知静音或屏蔽"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 75cef9a6a2e0..8405fe509bc3 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -653,4 +653,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"開啟<xliff:g id="ID_1">%s</xliff:g>設定頁面。"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"編輯設定次序。"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"第 <xliff:g id="ID_1">%1$d</xliff:g> 頁 (共 <xliff:g id="ID_2">%2$d</xliff:g> 頁)"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"通知無法設為靜音或封鎖"</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index b25830a7df0b..b4f2b27dc7eb 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"開啟「<xliff:g id="ID_1">%s</xliff:g>」設定。"</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"編輯設定順序。"</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"第 <xliff:g id="ID_1">%1$d</xliff:g> 頁,共 <xliff:g id="ID_2">%2$d</xliff:g> 頁"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"無法關閉通知音效或封鎖通知"</string> </resources> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 2b2adb54b974..c6e40444b845 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -651,4 +651,5 @@ <string name="accessibility_quick_settings_open_settings" msgid="7806613775728380737">"Vula izilungiselelo ze-<xliff:g id="ID_1">%s</xliff:g>."</string> <string name="accessibility_quick_settings_edit" msgid="7839992848995240393">"Hlela uhlelo lwezilungiselelo."</string> <string name="accessibility_quick_settings_page" msgid="5032979051755200721">"Ikhasi <xliff:g id="ID_1">%1$d</xliff:g> kwangu-<xliff:g id="ID_2">%2$d</xliff:g>"</string> + <string name="cant_silence_or_block" msgid="999689262131488625">"Izaziso azikwazi ukuthuliswa noma ukuvinjelwa"</string> </resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index eb1a1ebc0850..9eea3750a8ec 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -209,9 +209,6 @@ <!-- Doze: should the significant motion sensor be used as a pulse signal? --> <bool name="doze_pulse_on_significant_motion">false</bool> - <!-- Doze: should the pickup sensor be used as a pulse signal? --> - <bool name="doze_pulse_on_pick_up">false</bool> - <!-- Doze: check proximity sensor before pulsing? --> <bool name="doze_proximity_check_before_pulse">true</bool> @@ -240,9 +237,6 @@ --> <string name="doze_pickup_subtype_performs_proximity_check"></string> - <!-- Type of the double tap sensor. Empty if double tap is not supported. --> - <string name="doze_double_tap_sensor_type" translatable="false"></string> - <!-- Doze: pulse parameter - how long does it take to fade in? --> <integer name="doze_pulse_duration_in">900</integer> diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java index 56f6b8df866b..6c3524356818 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java @@ -43,6 +43,7 @@ import android.text.TextUtils; import android.util.Log; import android.view.Display; +import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.MetricsProto.MetricsEvent; import com.android.systemui.SystemUIApplication; @@ -85,6 +86,8 @@ public class DozeService extends DreamService { private boolean mCarMode; private long mNotificationPulseTime; + private AmbientDisplayConfiguration mConfig; + public DozeService() { if (DEBUG) Log.d(mTag, "new DozeService()"); setDebug(DEBUG); @@ -125,6 +128,7 @@ public class DozeService extends DreamService { setWindowless(true); mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE); + mConfig = new AmbientDisplayConfiguration(mContext); mSensors = new TriggerSensor[] { new TriggerSensor( mSensorManager.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION), @@ -135,12 +139,12 @@ public class DozeService extends DreamService { mPickupSensor = new TriggerSensor( mSensorManager.getDefaultSensor(Sensor.TYPE_PICK_UP_GESTURE), Settings.Secure.DOZE_PULSE_ON_PICK_UP, - mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(), + mConfig.pulseOnPickupAvailable(), mDozeParameters.getVibrateOnPickup(), DozeLog.PULSE_REASON_SENSOR_PICKUP), new TriggerSensor( - findSensorWithType(mDozeParameters.getDoubleTapSensorType()), - Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, - mDozeParameters.getPulseOnPickup(), mDozeParameters.getVibrateOnPickup(), + findSensorWithType(mConfig.doubleTapSensorType()), + Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP, true, + mDozeParameters.getVibrateOnPickup(), DozeLog.PULSE_REASON_SENSOR_DOUBLE_TAP) }; mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); @@ -359,7 +363,7 @@ public class DozeService extends DreamService { private void requestNotificationPulse() { if (DEBUG) Log.d(mTag, "requestNotificationPulse"); - if (!mDozeParameters.getPulseOnNotifications()) return; + if (!mConfig.pulseOnNotificationEnabled(UserHandle.USER_CURRENT)) return; mNotificationPulseTime = SystemClock.elapsedRealtime(); requestPulse(DozeLog.PULSE_REASON_NOTIFICATION); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 2715971db9c3..fc580a5ecc19 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -679,13 +679,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal for (int i = 0; i < taskViewCount; i++) { TaskView tv = taskViews.get(i); Task task = tv.getTask(); - int taskIndex = mStack.indexOfStackTask(task); - TaskViewTransform transform = mCurrentTaskTransforms.get(taskIndex); if (mIgnoreTasks.contains(task.key)) { continue; } + int taskIndex = mStack.indexOfStackTask(task); + TaskViewTransform transform = mCurrentTaskTransforms.get(taskIndex); if (animationOverrides != null && animationOverrides.containsKey(task)) { animation = animationOverrides.get(task); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index d5bf49991cbb..9e9bdd7a172e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -18,11 +18,13 @@ package com.android.systemui.statusbar.phone; import android.content.Context; import android.os.SystemProperties; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; import android.util.MathUtils; import android.util.SparseBooleanArray; +import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.systemui.R; import java.io.PrintWriter; @@ -31,9 +33,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class DozeParameters { - private static final String TAG = "DozeParameters"; - private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - private static final int MAX_DURATION = 60 * 1000; private final Context mContext; @@ -55,10 +54,8 @@ public class DozeParameters { pw.print(" getPulseOutDuration(): "); pw.println(getPulseOutDuration()); pw.print(" getPulseOnSigMotion(): "); pw.println(getPulseOnSigMotion()); pw.print(" getVibrateOnSigMotion(): "); pw.println(getVibrateOnSigMotion()); - pw.print(" getPulseOnPickup(): "); pw.println(getPulseOnPickup()); pw.print(" getVibrateOnPickup(): "); pw.println(getVibrateOnPickup()); pw.print(" getProxCheckBeforePulse(): "); pw.println(getProxCheckBeforePulse()); - pw.print(" getPulseOnNotifications(): "); pw.println(getPulseOnNotifications()); pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold()); pw.print(" getPickupSubtypePerformsProxCheck(): ");pw.println( dumpPickupSubtypePerformsProxCheck()); @@ -106,26 +103,14 @@ public class DozeParameters { return SystemProperties.getBoolean("doze.vibrate.sigmotion", false); } - public boolean getPulseOnPickup() { - return getBoolean("doze.pulse.pickup", R.bool.doze_pulse_on_pick_up); - } - public boolean getVibrateOnPickup() { return SystemProperties.getBoolean("doze.vibrate.pickup", false); } - public String getDoubleTapSensorType() { - return mContext.getString(R.string.doze_double_tap_sensor_type); - } - public boolean getProxCheckBeforePulse() { return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse); } - public boolean getPulseOnNotifications() { - return getBoolean("doze.pulse.notifications", R.bool.doze_pulse_on_notifications); - } - public int getPickupVibrationThreshold() { return getInt("doze.pickup.vibration.threshold", R.integer.doze_pickup_vibration_threshold); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 1d91346673c3..30613bc76e49 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -4231,7 +4231,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } updateKeyguardState(staying, false /* fromShadeLocked */); - if (viewToClick != null) { + if (viewToClick != null && viewToClick.isAttachedToWindow()) { viewToClick.callOnClick(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java index 7a2ae22ed466..e4991d5ef66b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java @@ -343,9 +343,7 @@ public class QuickStatusBarHeader extends BaseStatusBarHeader implements } } else if (v == mAlarmStatus && mNextAlarm != null) { PendingIntent showIntent = mNextAlarm.getShowIntent(); - if (showIntent != null && showIntent.isActivity()) { - mActivityStarter.startActivity(showIntent.getIntent(), true /* dismissShade */); - } + mActivityStarter.startPendingIntentDismissingKeyguard(showIntent); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index f3e5c94be032..a6fe4382475e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -1853,24 +1853,34 @@ public class NotificationStackScrollLayout extends ViewGroup } updateBackgroundBounds(); if (!mCurrentBounds.equals(mBackgroundBounds)) { - if (mAnimateNextBackgroundTop || mAnimateNextBackgroundBottom || areBoundsAnimating()) { + boolean animate = mAnimateNextBackgroundTop || mAnimateNextBackgroundBottom + || areBoundsAnimating(); + if (!isExpanded()) { + abortBackgroundAnimators(); + animate = false; + } + if (animate) { startBackgroundAnimation(); } else { mCurrentBounds.set(mBackgroundBounds); applyCurrentBackgroundBounds(); } } else { - if (mBottomAnimator != null) { - mBottomAnimator.cancel(); - } - if (mTopAnimator != null) { - mTopAnimator.cancel(); - } + abortBackgroundAnimators(); } mAnimateNextBackgroundBottom = false; mAnimateNextBackgroundTop = false; } + private void abortBackgroundAnimators() { + if (mBottomAnimator != null) { + mBottomAnimator.cancel(); + } + if (mTopAnimator != null) { + mTopAnimator.cancel(); + } + } + private boolean areBoundsAnimating() { return mBottomAnimator != null || mTopAnimator != null; } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 0f8db2e65659..6757fcce43ce 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -203,7 +203,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } finally { mBluetoothLock.readLock().unlock(); } - Slog.d(TAG, "state" + st); + Slog.d(TAG, "Airplane Mode change - current state: " + st); if (isAirplaneModeOn()) { // Clear registered LE apps to force shut-off @@ -266,6 +266,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mContext.registerReceiver(mReceiver, filter); loadStoredNameAndAddress(); if (isBluetoothPersistedStateOn()) { + if (DBG) Slog.d(TAG, "Startup: Bluetooth persisted state is ON."); mEnableExternal = true; } @@ -292,8 +293,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { * Returns true if the Bluetooth saved state is "on" */ private final boolean isBluetoothPersistedStateOn() { - return Settings.Global.getInt(mContentResolver, - Settings.Global.BLUETOOTH_ON, BLUETOOTH_ON_BLUETOOTH) != BLUETOOTH_OFF; + int state = Settings.Global.getInt(mContentResolver, + Settings.Global.BLUETOOTH_ON, -1); + if (DBG) Slog.d(TAG, "Bluetooth persisted state: " + state); + return state != BLUETOOTH_OFF; } /** @@ -309,6 +312,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { * */ private void persistBluetoothSetting(int value) { + if (DBG) Slog.d(TAG, "Persisting Bluetooth Setting: " + value); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.BLUETOOTH_ON, value); @@ -1366,7 +1370,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { { int prevState = msg.arg1; int newState = msg.arg2; - if (DBG) Slog.d(TAG, "MESSAGE_BLUETOOTH_STATE_CHANGE: prevState = " + prevState + ", newState=" + newState); + if (DBG) Slog.d(TAG, "MESSAGE_BLUETOOTH_STATE_CHANGE: prevState = " + prevState + ", newState =" + newState); mState = newState; bluetoothStateChangeHandler(prevState, newState); // handle error state transition case from TURNING_ON to OFF @@ -1678,6 +1682,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private void bluetoothStateChangeHandler(int prevState, int newState) { boolean isStandardBroadcast = true; + if (DBG) Slog.d(TAG, "bluetoothStateChangeHandler: " + prevState + " -> " + newState); if (prevState != newState) { //Notify all proxy objects first of adapter state change if (newState == BluetoothAdapter.STATE_BLE_ON || diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 5f59e32ebb6b..614a94fa1e20 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2261,11 +2261,19 @@ public class ConnectivityService extends IConnectivityManager.Stub synchronized (mNetworkForNetId) { nai = mNetworkForNetId.get(netId); } - // If captive portal status has changed, update capabilities. + // If captive portal status has changed, update capabilities or disconnect. if (nai != null && (visible != nai.lastCaptivePortalDetected)) { final int oldScore = nai.getCurrentScore(); nai.lastCaptivePortalDetected = visible; nai.everCaptivePortalDetected |= visible; + if (nai.lastCaptivePortalDetected && + Settings.Global.CAPTIVE_PORTAL_MODE_AVOID == getCaptivePortalMode()) { + if (DBG) log("Avoiding captive portal network: " + nai.name()); + nai.asyncChannel.sendMessage( + NetworkAgent.CMD_PREVENT_AUTOMATIC_RECONNECT); + teardownUnneededNetwork(nai); + break; + } updateCapabilities(oldScore, nai, nai.networkCapabilities); } if (!visible) { @@ -2286,6 +2294,12 @@ public class ConnectivityService extends IConnectivityManager.Stub return true; } + private int getCaptivePortalMode() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.CAPTIVE_PORTAL_MODE, + Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); + } + private boolean maybeHandleNetworkAgentInfoMessage(Message msg) { switch (msg.what) { default: diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 8c07e01d1163..de858e39b800 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -4463,7 +4463,9 @@ final class ActivityStack { "moveTaskToBackAndShowHome"); } - adjustFocusedActivityLocked(mResumedActivity, "moveTaskToBack"); + // Using currently focused activity value from service instead of mResumedActivity, + // because if this happens when device is locked the mResumedActivity will be null. + adjustFocusedActivityLocked(mService.mFocusedActivity, "moveTaskToBack"); mStackSupervisor.resumeFocusedStackTopActivityLocked(); return true; } diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 6eb89facca76..c73d1dd95437 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -211,7 +211,9 @@ public class NetworkMonitor extends StateMachine { private final NetworkRequest mDefaultRequest; private final IpConnectivityLog mMetricsLog; - private boolean mIsCaptivePortalCheckEnabled; + @VisibleForTesting + protected boolean mIsCaptivePortalCheckEnabled; + private boolean mUseHttps; // Set if the user explicitly selected "Do not use this network" in captive portal sign-in app. @@ -265,7 +267,8 @@ public class NetworkMonitor extends StateMachine { setInitialState(mDefaultState); mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(), - Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1; + Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT) + != Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE; mUseHttps = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_USE_HTTPS, 1) == 1; @@ -632,7 +635,10 @@ public class NetworkMonitor extends StateMachine { @VisibleForTesting protected CaptivePortalProbeResult isCaptivePortal() { - if (!mIsCaptivePortalCheckEnabled) return new CaptivePortalProbeResult(204); + if (!mIsCaptivePortalCheckEnabled) { + validationLog("Validation disabled."); + return new CaptivePortalProbeResult(204); + } URL pacUrl = null, httpsUrl = null, httpUrl = null, fallbackUrl = null; diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 4e236d164a69..07276298d66d 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -838,7 +838,7 @@ public final class ContentService extends IContentService.Stub { SyncManager syncManager = getSyncManager(); if (syncManager != null) { return syncManager.computeSyncable( - account, userId, providerName); + account, userId, providerName, false); } } finally { restoreCallingIdentity(identityToken); @@ -854,6 +854,8 @@ public final class ContentService extends IContentService.Stub { mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SYNC_SETTINGS, "no permission to write the sync settings"); + syncable = normalizeSyncable(syncable); + int userId = UserHandle.getCallingUserId(); long identityToken = clearCallingIdentity(); try { @@ -1156,6 +1158,15 @@ public final class ContentService extends IContentService.Stub { } } + private static int normalizeSyncable(int syncable) { + if (syncable > 0) { + return SyncStorageEngine.AuthorityInfo.SYNCABLE; + } else if (syncable == 0) { + return SyncStorageEngine.AuthorityInfo.NOT_SYNCABLE; + } + return SyncStorageEngine.AuthorityInfo.UNDEFINED; + } + /** * Hide this class since it is not part of api, * but current unittest framework requires it to be public diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 131da0bc9d66..653d2410f800 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -1001,7 +1001,12 @@ public class SyncManager { } } - public int computeSyncable(Account account, int userId, String authority) { + private int computeSyncable(Account account, int userId, String authority) { + return computeSyncable(account, userId, authority, true); + } + + public int computeSyncable(Account account, int userId, String authority, + boolean checkAccountAccess) { final int status = getIsSyncable(account, userId, authority); if (status == AuthorityInfo.NOT_SYNCABLE) { return AuthorityInfo.NOT_SYNCABLE; @@ -1025,7 +1030,7 @@ public class SyncManager { } catch (RemoteException e) { /* ignore - local call */ } - if (!canAccessAccount(account, owningPackage, owningUid)) { + if (checkAccountAccess && !canAccessAccount(account, owningPackage, owningUid)) { Log.w(TAG, "Access to " + account + " denied for package " + owningPackage + " in UID " + syncAdapterInfo.uid); return AuthorityInfo.SYNCABLE_NO_ACCOUNT_ACCESS; diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 935fa13adb47..a1e3d62c12bc 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -321,7 +321,6 @@ class AutomaticBrightnessController { mLightSensorEnabled = false; mRecentLightSamples = 0; mHandler.removeMessages(MSG_UPDATE_AMBIENT_LUX); - Slog.d(TAG, "disabling light sensor"); mSensorManager.unregisterListener(mLightSensorListener); } } @@ -349,7 +348,6 @@ class AutomaticBrightnessController { } mAmbientLightRingBuffer.prune(time - mAmbientLightHorizon); mAmbientLightRingBuffer.push(time, lux); - Slog.d(TAG, "pushing lux: " + lux); // Remember this sample value. mLastObservedLux = lux; diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index 20bccf19f131..1991c00ff4e1 100644 --- a/services/core/java/com/android/server/dreams/DreamManagerService.java +++ b/services/core/java/com/android/server/dreams/DreamManagerService.java @@ -18,6 +18,7 @@ package com.android.server.dreams; import static android.Manifest.permission.BIND_DREAM_SERVICE; +import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.util.DumpUtils; import com.android.server.FgThread; import com.android.server.LocalServices; @@ -88,6 +89,8 @@ public final class DreamManagerService extends SystemService { private int mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN; private int mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT; + private AmbientDisplayConfiguration mDozeConfig; + public DreamManagerService(Context context) { super(context); mContext = context; @@ -97,6 +100,7 @@ public final class DreamManagerService extends SystemService { mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE); mPowerManagerInternal = getLocalService(PowerManagerInternal.class); mDozeWakeLock = mPowerManager.newWakeLock(PowerManager.DOZE_WAKE_LOCK, TAG); + mDozeConfig = new AmbientDisplayConfiguration(mContext); } @Override @@ -121,7 +125,7 @@ public final class DreamManagerService extends SystemService { } }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler); mContext.getContentResolver().registerContentObserver( - Settings.Secure.getUriFor(Settings.Secure.DOZE_ENABLED), false, + Settings.Secure.getUriFor(Settings.Secure.DOZE_PULSE_ON_DOUBLE_TAP), false, mDozeEnabledObserver, UserHandle.USER_ALL); writePulseGestureEnabled(); } @@ -326,19 +330,12 @@ public final class DreamManagerService extends SystemService { } private ComponentName getDozeComponent(int userId) { - // Read the component from a system property to facilitate debugging. - // Note that for production devices, the dream should actually be declared in - // a config.xml resource. - String name = Build.IS_DEBUGGABLE ? SystemProperties.get("debug.doze.component") : null; - if (TextUtils.isEmpty(name)) { - // Read the component from a config.xml resource. - // The value should be specified in a resource overlay for the product. - name = mContext.getResources().getString( - com.android.internal.R.string.config_dozeComponent); - } - boolean enabled = Settings.Secure.getIntForUser(mContext.getContentResolver(), - Settings.Secure.DOZE_ENABLED, 1, userId) != 0; - return TextUtils.isEmpty(name) || !enabled ? null : ComponentName.unflattenFromString(name); + if (mDozeConfig.enabled(userId)) { + return ComponentName.unflattenFromString(mDozeConfig.ambientDisplayComponent()); + } else { + return null; + } + } private ServiceInfo getServiceInfo(ComponentName name) { diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 5dc9d02a71c5..72ee218fba2c 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -2011,6 +2011,9 @@ public final class HdmiControlService extends SystemService { @ServiceThreadOnly void standby() { assertRunOnServiceThread(); + if (!canGoToStandby()) { + return; + } mStandbyMessageReceived = true; mPowerManager.goToSleep(SystemClock.uptimeMillis(), PowerManager.GO_TO_SLEEP_REASON_HDMI, 0); // PowerManger will send the broadcast Intent.ACTION_SCREEN_OFF and after this gets @@ -2038,10 +2041,13 @@ public final class HdmiControlService extends SystemService { @ServiceThreadOnly private void onStandby(final int standbyAction) { assertRunOnServiceThread(); - if (!canGoToStandby()) return; mPowerStatus = HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY; invokeVendorCommandListenersOnControlStateChanged(false, HdmiControlManager.CONTROL_STATE_CHANGED_REASON_STANDBY); + if (!canGoToStandby()) { + mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; + return; + } final List<HdmiCecLocalDevice> devices = getAllLocalDevices(); disableDevices(new PendingActionClearedCallback() { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 8419b98d3bc9..986bae9005e5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -464,8 +464,8 @@ public class PackageManagerService extends IPackageManager.Stub { private static final String VENDOR_OVERLAY_DIR = "/vendor/overlay"; /** - * If VENDOR_OVERLAY_SKU_PROPERTY is set, search for runtime resource overlay APKs in - * VENDOR_OVERLAY_DIR/<value of VENDOR_OVERLAY_SKU_PROPERTY> rather than in + * If VENDOR_OVERLAY_SKU_PROPERTY is set, search for runtime resource overlay APKs also in + * VENDOR_OVERLAY_DIR/<value of VENDOR_OVERLAY_SKU_PROPERTY> in addition to * VENDOR_OVERLAY_DIR. */ private static final String VENDOR_OVERLAY_SKU_PROPERTY = "ro.boot.vendor.overlay.sku"; @@ -2271,18 +2271,17 @@ public class PackageManagerService extends IPackageManager.Stub { } } - // Collect vendor overlay packages. - // (Do this before scanning any apps.) + // Collect vendor overlay packages. (Do this before scanning any apps.) // For security and version matching reason, only consider // overlay packages if they reside in the right directory. - File vendorOverlayDir; String overlaySkuDir = SystemProperties.get(VENDOR_OVERLAY_SKU_PROPERTY); if (!overlaySkuDir.isEmpty()) { - vendorOverlayDir = new File(VENDOR_OVERLAY_DIR, overlaySkuDir); - } else { - vendorOverlayDir = new File(VENDOR_OVERLAY_DIR); + scanDirTracedLI(new File(VENDOR_OVERLAY_DIR, overlaySkuDir), mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR + | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0); } - scanDirTracedLI(vendorOverlayDir, mDefParseFlags + scanDirTracedLI(new File(VENDOR_OVERLAY_DIR), mDefParseFlags | PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0); diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 760e298693d4..372094001cf8 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1487,7 +1487,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { lockWP.cropHint.set(sysWP.cropHint); lockWP.width = sysWP.width; lockWP.height = sysWP.height; - lockWP.allowBackup = false; + lockWP.allowBackup = sysWP.allowBackup; // Migrate the bitmap files outright; no need to copy try { diff --git a/services/core/java/com/android/server/wm/CircularDisplayMask.java b/services/core/java/com/android/server/wm/CircularDisplayMask.java index ae4154131079..0a9b33404b37 100644 --- a/services/core/java/com/android/server/wm/CircularDisplayMask.java +++ b/services/core/java/com/android/server/wm/CircularDisplayMask.java @@ -21,6 +21,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; @@ -85,12 +86,115 @@ class CircularDisplayMask { mSurfaceControl = ctrl; mDrawNeeded = true; mPaint = new Paint(); - mPaint.setAntiAlias(true); - mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); mScreenOffset = screenOffset; mMaskThickness = maskThickness; } + static private double distanceFromCenterSquared(double x, double y) { + return x*x + y*y; + } + + static private double distanceFromCenter(double x, double y) { + return Math.sqrt(distanceFromCenterSquared(x, y)); + } + + static private double verticalLineIntersectsCircle(double x, double radius) { + return Math.sqrt(radius*radius - x*x); + } + + static private double horizontalLineIntersectsCircle(double y, double radius) { + return Math.sqrt(radius*radius - y*y); + } + + static private double triangleArea(double width, double height) { + return width * height / 2.0; + } + + static private double trapezoidArea(double width, double height1, double height2) { + return width * (height1 + height2) / 2.0; + } + + static private double areaUnderChord(double radius, double chordLength) { + double isocelesHeight = Math.sqrt(radius*radius - chordLength * chordLength / 4.0); + double areaUnderIsoceles = isocelesHeight * chordLength / 2.0; + double halfAngle = Math.asin(chordLength / (2.0 * radius)); + double areaUnderArc = halfAngle * radius * radius; + + return areaUnderArc - triangleArea(chordLength, isocelesHeight); + } + + // Returns the fraction of the pixel at (px, py) covered by + // the circle with center (cx, cy) and radius 'radius' + static private double calcPixelShading(double cx, double cy, double px, + double py, double radius) { + // Translate so the center is at the origin + px -= cx; + py -= cy; + + // Reflect across the axis so the point is in the first quadrant + px = Math.abs(px); + py = Math.abs(py); + + // One more transformation which simplifies the logic later + if (py > px) { + double temp; + + temp = px; + px = py; + py = temp; + } + + double left = px - 0.5; + double right = px + 0.5; + double bottom = py - 0.5; + double top = py + 0.5; + + if (distanceFromCenterSquared(left, bottom) > radius*radius) { + return 0.0; + } + + if (distanceFromCenterSquared(right, top) < radius*radius) { + return 1.0; + } + + // Check if only the bottom-left corner of the pixel is inside the circle + if (distanceFromCenterSquared(left, top) > radius*radius) { + double triangleWidth = horizontalLineIntersectsCircle(bottom, radius) - left; + double triangleHeight = verticalLineIntersectsCircle(left, radius) - bottom; + double chordLength = distanceFromCenter(triangleWidth, triangleHeight); + + return triangleArea(triangleWidth, triangleHeight) + + areaUnderChord(radius, chordLength); + + } + + // Check if only the top-right corner of the pixel is outside the circle + if (distanceFromCenterSquared(right, bottom) < radius*radius) { + double triangleWidth = right - horizontalLineIntersectsCircle(top, radius); + double triangleHeight = top - verticalLineIntersectsCircle(right, radius); + double chordLength = distanceFromCenter(triangleWidth, triangleHeight); + + return 1 - triangleArea(triangleWidth, triangleHeight) + + areaUnderChord(radius, chordLength); + } + + // It must be that the top-left and bottom-left corners are inside the circle + double trapezoidWidth1 = horizontalLineIntersectsCircle(top, radius) - left; + double trapezoidWidth2 = horizontalLineIntersectsCircle(bottom, radius) - left; + double chordLength = distanceFromCenter(1, trapezoidWidth2 - trapezoidWidth1); + double shading = trapezoidArea(1.0, trapezoidWidth1, trapezoidWidth2) + + areaUnderChord(radius, chordLength); + + // When top >= 0 and bottom <= 0 it's possible for the circle to intersect the pixel 4 times. + // If so, remove the area of the section which crosses the right-hand edge. + if (top >= 0 && bottom <= 0 && radius > right) { + shading -= areaUnderChord(radius, 2 * verticalLineIntersectsCircle(right, radius)); + } + + return shading; + } + private void drawIfNeeded() { if (!mDrawNeeded || !mVisible || mDimensionsUnequal) { return; @@ -123,11 +227,41 @@ class CircularDisplayMask { break; } - int circleRadius = mScreenSize.x / 2; c.drawColor(Color.BLACK); - // The radius is reduced by mMaskThickness to provide an anti aliasing effect on the display edges. - c.drawCircle(circleRadius, circleRadius, circleRadius - mMaskThickness, mPaint); + int maskWidth = mScreenSize.x - 2*mMaskThickness; + int maskHeight; + + // Don't render the whole mask if it is partly offscreen. + if (maskWidth > mScreenSize.y) { + maskHeight = mScreenSize.y; + } else { + // To ensure the mask can be properly centered on the canvas the + // bitmap dimensions must have the same parity as those of the canvas. + maskHeight = mScreenSize.y - ((mScreenSize.y - maskWidth) & ~1); + } + + double cx = (maskWidth - 1.0) / 2.0; + double cy = (maskHeight - 1.0) / 2.0; + double radius = maskWidth / 2.0; + int[] pixels = new int[maskWidth * maskHeight]; + + for (int py=0; py<maskHeight; py++) { + for (int px=0; px<maskWidth; px++) { + double shading = calcPixelShading(cx, cy, px, py, radius); + pixels[maskWidth*py + px] = + Color.argb(255 - (int)Math.round(255.0*shading), 0, 0, 0); + } + } + + Bitmap transparency = Bitmap.createBitmap(pixels, maskWidth, maskHeight, + Bitmap.Config.ARGB_8888); + + c.drawBitmap(transparency, + (float)mMaskThickness, + (float)((mScreenSize.y - maskHeight) / 2), + mPaint); + mSurface.unlockCanvasAndPost(c); } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 7b1a523e74a4..e8104c4c9377 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -28,15 +28,11 @@ import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; import static com.android.server.wm.WindowState.RESIZE_HANDLE_WIDTH_IN_DP; import android.app.ActivityManager.StackId; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.Region.Op; -import android.os.Build; -import android.os.UserHandle; import android.util.DisplayMetrics; import android.util.Slog; import android.view.Display; @@ -728,8 +724,7 @@ class DisplayContent { for (int i = 0; i < windowCount; i++) { WindowState window = windows.get(i); if (window.mAttrs.type == TYPE_TOAST && window.mOwnerUid == uid - && !window.mPermanentlyHidden && !window.mAnimatingExit - && !window.mRemoveOnExit) { + && !window.isRemovedOrHidden()) { return false; } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 55bf39472b7b..fbef2c626a9c 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -2961,4 +2961,10 @@ final class WindowState implements WindowManagerPolicy.WindowState { public boolean isRtl() { return mMergedConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; } + + public boolean isRemovedOrHidden() { + return mPermanentlyHidden || mAnimatingExit + || mRemoveOnExit || mWindowRemovalAllowed + || mViewVisibility == View.GONE; + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index f1166221ae3f..37144950e97d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -222,6 +222,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final String ATTR_PERMISSION_POLICY = "permission-policy"; private static final String ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED = "device-provisioning-config-applied"; + private static final String ATTR_DEVICE_PAIRED = "device-paired"; private static final String ATTR_DELEGATED_CERT_INSTALLER = "delegated-cert-installer"; private static final String ATTR_APPLICATION_RESTRICTIONS_MANAGER @@ -301,6 +302,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private static final int CODE_NONSYSTEM_USER_EXISTS = 5; private static final int CODE_ACCOUNTS_NOT_EMPTY = 6; private static final int CODE_NOT_SYSTEM_USER = 7; + private static final int CODE_HAS_PAIRED = 8; @Retention(RetentionPolicy.SOURCE) @IntDef({ CODE_OK, CODE_HAS_DEVICE_OWNER, CODE_USER_HAS_PROFILE_OWNER, CODE_USER_NOT_RUNNING, @@ -344,6 +346,11 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { */ boolean mHasFeature; + /** + * Whether or not this device is a watch. + */ + boolean mIsWatch; + private final SecurityLogMonitor mSecurityLogMonitor; private final AtomicBoolean mRemoteBugreportServiceIsActive = new AtomicBoolean(); @@ -424,6 +431,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { int mPasswordOwner = -1; long mLastMaximumTimeToLock = -1; boolean mUserSetupComplete = false; + boolean mPaired = false; int mUserProvisioningState; int mPermissionPolicy; @@ -611,7 +619,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { static final long DEF_MAXIMUM_TIME_TO_UNLOCK = 0; long maximumTimeToUnlock = DEF_MAXIMUM_TIME_TO_UNLOCK; - long strongAuthUnlockTimeout = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS; + long strongAuthUnlockTimeout = 0; // admin doesn't participate by default static final int DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE = 0; int maximumFailedPasswordsForWipe = DEF_MAXIMUM_FAILED_PASSWORDS_FOR_WIPE; @@ -1615,6 +1623,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mHasFeature = mContext.getPackageManager() .hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN); + mIsWatch = mContext.getPackageManager() + .hasSystemFeature(PackageManager.FEATURE_WATCH); if (!mHasFeature) { // Skip the rest of the initialization return; @@ -2215,6 +2225,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { out.attribute(null, ATTR_SETUP_COMPLETE, Boolean.toString(true)); } + if (policy.mPaired) { + out.attribute(null, ATTR_DEVICE_PAIRED, + Boolean.toString(true)); + } if (policy.mDeviceProvisioningConfigApplied) { out.attribute(null, ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED, Boolean.toString(true)); @@ -2379,6 +2393,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (userSetupComplete != null && Boolean.toString(true).equals(userSetupComplete)) { policy.mUserSetupComplete = true; } + String paired = parser.getAttributeValue(null, ATTR_DEVICE_PAIRED); + if (paired != null && Boolean.toString(true).equals(paired)) { + policy.mPaired = true; + } String deviceProvisioningConfigApplied = parser.getAttributeValue(null, ATTR_DEVICE_PROVISIONING_CONFIG_APPLIED); if (deviceProvisioningConfigApplied != null @@ -2613,7 +2631,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Register an observer for watching for user setup complete. new SetupContentObserver(mHandler).register(); // Initialize the user setup state, to handle the upgrade case. - updateUserSetupComplete(); + updateUserSetupCompleteAndPaired(); List<String> packageList; synchronized (this) { @@ -4248,10 +4266,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return; } Preconditions.checkNotNull(who, "ComponentName is null"); - Preconditions.checkArgument(timeoutMs >= MINIMUM_STRONG_AUTH_TIMEOUT_MS, - "Timeout must not be lower than the minimum strong auth timeout."); - Preconditions.checkArgument(timeoutMs <= DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS, - "Timeout must not be higher than the default strong auth timeout."); + Preconditions.checkArgument(timeoutMs >= 0, "Timeout must not be a negative number."); + // timeoutMs with value 0 means that the admin doesn't participate + // timeoutMs is clamped to the interval in case the internal constants change in the future + if (timeoutMs != 0 && timeoutMs < MINIMUM_STRONG_AUTH_TIMEOUT_MS) { + timeoutMs = MINIMUM_STRONG_AUTH_TIMEOUT_MS; + } + if (timeoutMs > DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS) { + timeoutMs = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS; + } final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (this) { @@ -4267,7 +4290,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { /** * Return a single admin's strong auth unlock timeout or minimum value (strictest) of all * admins if who is null. - * Returns default timeout if not configured. + * Returns 0 if not configured for the provided admin. */ @Override public long getRequiredStrongAuthTimeout(ComponentName who, int userId, boolean parent) { @@ -4278,9 +4301,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { if (who != null) { ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userId, parent); - return admin != null ? Math.max(admin.strongAuthUnlockTimeout, - MINIMUM_STRONG_AUTH_TIMEOUT_MS) - : DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS; + return admin != null ? admin.strongAuthUnlockTimeout : 0; } // Return the strictest policy across all participating admins. @@ -4288,8 +4309,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { long strongAuthUnlockTimeout = DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS; for (int i = 0; i < admins.size(); i++) { - strongAuthUnlockTimeout = Math.min(admins.get(i).strongAuthUnlockTimeout, - strongAuthUnlockTimeout); + final long timeout = admins.get(i).strongAuthUnlockTimeout; + if (timeout != 0) { // take only participating admins into account + strongAuthUnlockTimeout = Math.min(timeout, strongAuthUnlockTimeout); + } } return Math.max(strongAuthUnlockTimeout, MINIMUM_STRONG_AUTH_TIMEOUT_MS); } @@ -6128,6 +6151,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return getUserData(userHandle).mUserSetupComplete; } + private boolean hasPaired(int userHandle) { + if (!mHasFeature) { + return true; + } + return getUserData(userHandle).mPaired; + } + @Override public int getUserProvisioningState() { if (!mHasFeature) { @@ -6406,6 +6436,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { case CODE_ACCOUNTS_NOT_EMPTY: throw new IllegalStateException("Not allowed to set the device owner because there " + "are already some accounts on the device"); + case CODE_HAS_PAIRED: + throw new IllegalStateException("Not allowed to set the device owner because this " + + "device has already paired"); default: throw new IllegalStateException("Unknown @DeviceOwnerPreConditionCode " + code); } @@ -8157,14 +8190,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } /** - * We need to update the internal state of whether a user has completed setup once. After - * that, we ignore any changes that reset the Settings.Secure.USER_SETUP_COMPLETE changes - * as we don't trust any apps that might try to reset it. + * We need to update the internal state of whether a user has completed setup or a + * device has paired once. After that, we ignore any changes that reset the + * Settings.Secure.USER_SETUP_COMPLETE or Settings.Secure.DEVICE_PAIRED change + * as we don't trust any apps that might try to reset them. * <p> * Unfortunately, we don't know which user's setup state was changed, so we write all of * them. */ - void updateUserSetupComplete() { + void updateUserSetupCompleteAndPaired() { List<UserInfo> users = mUserManager.getUsers(true); final int N = users.size(); for (int i = 0; i < N; i++) { @@ -8179,6 +8213,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } } + if (mIsWatch && mInjector.settingsSecureGetIntForUser(Settings.Secure.DEVICE_PAIRED, 0, + userHandle) != 0) { + DevicePolicyData policy = getUserData(userHandle); + if (!policy.mPaired) { + policy.mPaired = true; + synchronized (this) { + saveSettingsLocked(userHandle); + } + } + } } } @@ -8188,6 +8232,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { Settings.Secure.USER_SETUP_COMPLETE); private final Uri mDeviceProvisioned = Settings.Global.getUriFor( Settings.Global.DEVICE_PROVISIONED); + private final Uri mPaired = Settings.Secure.getUriFor(Settings.Secure.DEVICE_PAIRED); public SetupContentObserver(Handler handler) { super(handler); @@ -8196,12 +8241,15 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { void register() { mInjector.registerContentObserver(mUserSetupComplete, false, this, UserHandle.USER_ALL); mInjector.registerContentObserver(mDeviceProvisioned, false, this, UserHandle.USER_ALL); + if (mIsWatch) { + mInjector.registerContentObserver(mPaired, false, this, UserHandle.USER_ALL); + } } @Override public void onChange(boolean selfChange, Uri uri) { - if (mUserSetupComplete.equals(uri)) { - updateUserSetupComplete(); + if (mUserSetupComplete.equals(uri) || (mIsWatch && mPaired.equals(uri))) { + updateUserSetupCompleteAndPaired(); } else if (mDeviceProvisioned.equals(uri)) { synchronized (DevicePolicyManagerService.this) { // Set PROPERTY_DEVICE_OWNER_PRESENT, for the SUW case where setting the property @@ -8611,6 +8659,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mUserManager.isUserRunning(new UserHandle(deviceOwnerUserId))) { return CODE_USER_NOT_RUNNING; } + if (mIsWatch && hasPaired(UserHandle.USER_SYSTEM)) { + return CODE_HAS_PAIRED; + } if (isAdb) { // if shell command runs after user setup completed check device status. Otherwise, OK. if (hasUserSetupCompleted(UserHandle.USER_SYSTEM)) { diff --git a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java index 4af1cf1a0df8..65f9399c5a80 100644 --- a/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/ConnectivityServiceTest.java @@ -236,6 +236,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { private final IdleableHandlerThread mHandlerThread; private final ConditionVariable mDisconnected = new ConditionVariable(); private final ConditionVariable mNetworkStatusReceived = new ConditionVariable(); + private final ConditionVariable mPreventReconnectReceived = new ConditionVariable(); private int mScore; private NetworkAgent mNetworkAgent; private int mStartKeepaliveError = PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED; @@ -291,6 +292,11 @@ public class ConnectivityServiceTest extends AndroidTestCase { mRedirectUrl = redirectUrl; mNetworkStatusReceived.open(); } + + @Override + protected void preventAutomaticReconnect() { + mPreventReconnectReceived.open(); + } }; // Waits for the NetworkAgent to be registered, which includes the creation of the // NetworkMonitor. @@ -375,11 +381,6 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWrappedNetworkMonitor.gen204ProbeResult = 200; mWrappedNetworkMonitor.gen204ProbeRedirectUrl = redirectUrl; connect(false); - waitFor(new Criteria() { public boolean get() { - NetworkCapabilities caps = mCm.getNetworkCapabilities(getNetwork()); - return caps != null && caps.hasCapability(NET_CAPABILITY_CAPTIVE_PORTAL);} }); - mWrappedNetworkMonitor.gen204ProbeResult = 500; - mWrappedNetworkMonitor.gen204ProbeRedirectUrl = null; } public void disconnect() { @@ -391,6 +392,10 @@ public class ConnectivityServiceTest extends AndroidTestCase { return new Network(mNetworkAgent.netId); } + public ConditionVariable getPreventReconnectReceived() { + return mPreventReconnectReceived; + } + public ConditionVariable getDisconnectedCV() { return mDisconnected; } @@ -597,6 +602,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { @Override protected CaptivePortalProbeResult isCaptivePortal() { + if (!mIsCaptivePortalCheckEnabled) { return new CaptivePortalProbeResult(204); } return new CaptivePortalProbeResult(gen204ProbeResult, gen204ProbeRedirectUrl, null); } } @@ -743,6 +749,9 @@ public class ConnectivityServiceTest extends AndroidTestCase { mService.systemReady(); mCm = new WrappedConnectivityManager(getContext(), mService); mCm.bindProcessToNetwork(null); + + // Ensure that the default setting for Captive Portals is used for most tests + setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); } public void tearDown() throws Exception { @@ -1704,6 +1713,47 @@ public class ConnectivityServiceTest extends AndroidTestCase { validatedCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); } + @LargeTest + public void testAvoidOrIgnoreCaptivePortals() { + final TestNetworkCallback captivePortalCallback = new TestNetworkCallback(); + final NetworkRequest captivePortalRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_CAPTIVE_PORTAL).build(); + mCm.registerNetworkCallback(captivePortalRequest, captivePortalCallback); + + final TestNetworkCallback validatedCallback = new TestNetworkCallback(); + final NetworkRequest validatedRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_VALIDATED).build(); + mCm.registerNetworkCallback(validatedRequest, validatedCallback); + + setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_AVOID); + // Bring up a network with a captive portal. + // Expect it to fail to connect and not result in any callbacks. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + String firstRedirectUrl = "http://example.com/firstPath"; + + ConditionVariable disconnectCv = mWiFiNetworkAgent.getDisconnectedCV(); + ConditionVariable avoidCv = mWiFiNetworkAgent.getPreventReconnectReceived(); + mWiFiNetworkAgent.connectWithCaptivePortal(firstRedirectUrl); + waitFor(disconnectCv); + waitFor(avoidCv); + + assertNoCallbacks(captivePortalCallback, validatedCallback); + + // Now test ignore mode. + setCaptivePortalMode(Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE); + + // Bring up a network with a captive portal. + // Since we're ignoring captive portals, the network will validate. + mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); + String secondRedirectUrl = "http://example.com/secondPath"; + mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl); + + // Expect NET_CAPABILITY_VALIDATED onAvailable callback. + validatedCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + // But there should be no CaptivePortal callback. + captivePortalCallback.assertNoCallback(); + } + @SmallTest public void testInvalidNetworkSpecifier() { boolean execptionCalled = true; @@ -1844,6 +1894,11 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCm.unregisterNetworkCallback(cellNetworkCallback); } + private void setCaptivePortalMode(int mode) { + ContentResolver cr = mServiceContext.getContentResolver(); + Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE, mode); + } + private void setMobileDataAlwaysOn(boolean enable) { ContentResolver cr = mServiceContext.getContentResolver(); Settings.Global.putInt(cr, Settings.Global.MOBILE_DATA_ALWAYS_ON, enable ? 1 : 0); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 2d96bff29bd7..11ec7ac64eda 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -1909,6 +1909,61 @@ public class DevicePolicyManagerTest extends DpmTestBase { verifyScreenTimeoutCall(Integer.MAX_VALUE, false); } + public void testSetRequiredStrongAuthTimeout_DeviceOwner() throws Exception { + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; + setupDeviceOwner(); + mContext.callerPermissions.add(permission.MANAGE_PROFILE_AND_DEVICE_OWNERS); + + final long MINIMUM_STRONG_AUTH_TIMEOUT_MS = 1 * 60 * 60 * 1000; // 1h + final long ONE_MINUTE = 60 * 1000; + + // aggregation should be the default if unset by any admin + assertEquals(dpm.getRequiredStrongAuthTimeout(null), + DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS); + + // admin not participating by default + assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0); + + //clamping from the top + dpm.setRequiredStrongAuthTimeout(admin1, + DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE); + assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), + DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS); + assertEquals(dpm.getRequiredStrongAuthTimeout(null), + DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS); + + // 0 means default + dpm.setRequiredStrongAuthTimeout(admin1, 0); + assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0); + assertEquals(dpm.getRequiredStrongAuthTimeout(null), + DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS); + + // clamping from the bottom + dpm.setRequiredStrongAuthTimeout(admin1, MINIMUM_STRONG_AUTH_TIMEOUT_MS - ONE_MINUTE); + assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MINIMUM_STRONG_AUTH_TIMEOUT_MS); + assertEquals(dpm.getRequiredStrongAuthTimeout(null), MINIMUM_STRONG_AUTH_TIMEOUT_MS); + + // value within range + dpm.setRequiredStrongAuthTimeout(admin1, MINIMUM_STRONG_AUTH_TIMEOUT_MS + ONE_MINUTE); + assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), MINIMUM_STRONG_AUTH_TIMEOUT_MS + + ONE_MINUTE); + assertEquals(dpm.getRequiredStrongAuthTimeout(null), MINIMUM_STRONG_AUTH_TIMEOUT_MS + + ONE_MINUTE); + + // reset to default + dpm.setRequiredStrongAuthTimeout(admin1, 0); + assertEquals(dpm.getRequiredStrongAuthTimeout(admin1), 0); + assertEquals(dpm.getRequiredStrongAuthTimeout(null), + DevicePolicyManager.DEFAULT_STRONG_AUTH_TIMEOUT_MS); + + // negative value + try { + dpm.setRequiredStrongAuthTimeout(admin1, -ONE_MINUTE); + fail("Didn't throw IllegalArgumentException"); + } catch (IllegalArgumentException iae) { + } + } + private void verifyScreenTimeoutCall(Integer expectedTimeout, boolean shouldStayOnWhilePluggedInBeCleared) { if (expectedTimeout == null) { diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java index 0dcd1521deac..dd7b5a8752e5 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java @@ -27,6 +27,9 @@ import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel; import android.text.TextUtils; import android.util.Slog; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Locale; import java.util.UUID; @@ -40,7 +43,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { static final boolean DBG = false; private static final String NAME = "sound_model.db"; - private static final int VERSION = 5; + private static final int VERSION = 6; public static interface SoundModelContract { public static final String TABLE = "sound_model"; @@ -58,15 +61,19 @@ public class DatabaseHelper extends SQLiteOpenHelper { // Table Create Statement private static final String CREATE_TABLE_SOUND_MODEL = "CREATE TABLE " + SoundModelContract.TABLE + "(" - + SoundModelContract.KEY_MODEL_UUID + " TEXT PRIMARY KEY," - + SoundModelContract.KEY_VENDOR_UUID + " TEXT, " + + SoundModelContract.KEY_MODEL_UUID + " TEXT," + + SoundModelContract.KEY_VENDOR_UUID + " TEXT," + SoundModelContract.KEY_KEYPHRASE_ID + " INTEGER," + SoundModelContract.KEY_TYPE + " INTEGER," + SoundModelContract.KEY_DATA + " BLOB," + SoundModelContract.KEY_RECOGNITION_MODES + " INTEGER," + SoundModelContract.KEY_LOCALE + " TEXT," + SoundModelContract.KEY_HINT_TEXT + " TEXT," - + SoundModelContract.KEY_USERS + " TEXT" + ")"; + + SoundModelContract.KEY_USERS + " TEXT," + + "PRIMARY KEY (" + SoundModelContract.KEY_KEYPHRASE_ID + "," + + SoundModelContract.KEY_LOCALE + "," + + SoundModelContract.KEY_USERS + ")" + + ")"; public DatabaseHelper(Context context) { super(context, NAME, null, VERSION); @@ -93,6 +100,44 @@ public class DatabaseHelper extends SQLiteOpenHelper { oldVersion++; } } + if (oldVersion == 5) { + // We need to enforce the new primary key constraint that the + // keyphrase id, locale, and users are unique. We have to first pull + // everything out of the database, remove duplicates, create the new + // table, then push everything back in. + String selectQuery = "SELECT * FROM " + SoundModelContract.TABLE; + Cursor c = db.rawQuery(selectQuery, null); + List<SoundModelRecord> old_records = new ArrayList<SoundModelRecord>(); + try { + if (c.moveToFirst()) { + do { + try { + old_records.add(new SoundModelRecord(5, c)); + } catch (Exception e) { + Slog.e(TAG, "Failed to extract V5 record", e); + } + } while (c.moveToNext()); + } + } finally { + c.close(); + } + db.execSQL("DROP TABLE IF EXISTS " + SoundModelContract.TABLE); + onCreate(db); + for (SoundModelRecord record : old_records) { + if (record.ifViolatesV6PrimaryKeyIsFirstOfAnyDuplicates(old_records)) { + try { + long return_value = record.writeToDatabase(6, db); + if (return_value == -1) { + Slog.e(TAG, "Database write failed " + record.modelUuid + ": " + + return_value); + } + } catch (Exception e) { + Slog.e(TAG, "Failed to update V6 record " + record.modelUuid, e); + } + } + } + oldVersion++; + } } /** @@ -279,4 +324,93 @@ public class DatabaseHelper extends SQLiteOpenHelper { } return users; } + + private static class SoundModelRecord { + public final String modelUuid; + public final String vendorUuid; + public final int keyphraseId; + public final int type; + public final byte[] data; + public final int recognitionModes; + public final String locale; + public final String hintText; + public final String users; + + public SoundModelRecord(int version, Cursor c) { + modelUuid = c.getString(c.getColumnIndex(SoundModelContract.KEY_MODEL_UUID)); + if (version >= 5) { + vendorUuid = c.getString(c.getColumnIndex(SoundModelContract.KEY_VENDOR_UUID)); + } else { + vendorUuid = null; + } + keyphraseId = c.getInt(c.getColumnIndex(SoundModelContract.KEY_KEYPHRASE_ID)); + type = c.getInt(c.getColumnIndex(SoundModelContract.KEY_TYPE)); + data = c.getBlob(c.getColumnIndex(SoundModelContract.KEY_DATA)); + recognitionModes = c.getInt(c.getColumnIndex(SoundModelContract.KEY_RECOGNITION_MODES)); + locale = c.getString(c.getColumnIndex(SoundModelContract.KEY_LOCALE)); + hintText = c.getString(c.getColumnIndex(SoundModelContract.KEY_HINT_TEXT)); + users = c.getString(c.getColumnIndex(SoundModelContract.KEY_USERS)); + } + + private boolean V6PrimaryKeyMatches(SoundModelRecord record) { + return keyphraseId == record.keyphraseId && stringComparisonHelper(locale, record.locale) + && stringComparisonHelper(users, record.users); + } + + // Returns true if this record is a) the only record with the same V6 primary key, or b) the + // first record in the list of all records that have the same primary key and equal data. + // It will return false if a) there are any records that have the same primary key and + // different data, or b) there is a previous record in the list that has the same primary + // key and data. + // Note that 'this' object must be inside the list. + public boolean ifViolatesV6PrimaryKeyIsFirstOfAnyDuplicates( + List<SoundModelRecord> records) { + // First pass - check to see if all the records that have the same primary key have + // duplicated data. + for (SoundModelRecord record : records) { + if (this == record) { + continue; + } + // If we have different/missing data with the same primary key, then we should drop + // everything. + if (this.V6PrimaryKeyMatches(record) && !Arrays.equals(data, record.data)) { + return false; + } + } + + // We only want to return true for the first duplicated model. + for (SoundModelRecord record : records) { + if (this.V6PrimaryKeyMatches(record)) { + return this == record; + } + } + return true; + } + + public long writeToDatabase(int version, SQLiteDatabase db) { + ContentValues values = new ContentValues(); + values.put(SoundModelContract.KEY_MODEL_UUID, modelUuid); + if (version >= 5) { + values.put(SoundModelContract.KEY_VENDOR_UUID, vendorUuid); + } + values.put(SoundModelContract.KEY_KEYPHRASE_ID, keyphraseId); + values.put(SoundModelContract.KEY_TYPE, type); + values.put(SoundModelContract.KEY_DATA, data); + values.put(SoundModelContract.KEY_RECOGNITION_MODES, recognitionModes); + values.put(SoundModelContract.KEY_LOCALE, locale); + values.put(SoundModelContract.KEY_HINT_TEXT, hintText); + values.put(SoundModelContract.KEY_USERS, users); + + return db.insertWithOnConflict( + SoundModelContract.TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE); + } + + // Helper for checking string equality - including the case when they are null. + static private boolean stringComparisonHelper(String a, String b) { + if (a != null) { + return a.equals(b); + } + return a == b; + } + } } diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index c0061859bf60..8f9c7585ced6 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -420,6 +420,31 @@ public abstract class Connection extends Conferenceable { "android.telecom.extra.DISABLE_ADD_CALL"; /** + * String connection extra key on a {@link Connection} or {@link Conference} which contains the + * original Connection ID associated with the connection. Used in + * {@link RemoteConnectionService} to track the Connection ID which was originally assigned to a + * connection/conference added via + * {@link ConnectionService#addExistingConnection(PhoneAccountHandle, Connection)} and + * {@link ConnectionService#addConference(Conference)} APIs. This is important to pass to + * Telecom for when it deals with RemoteConnections. When the ConnectionManager wraps the + * {@link RemoteConnection} and {@link RemoteConference} and adds it to Telecom, there needs to + * be a way to ensure that we don't add the connection again as a duplicate. + * <p> + * For example, the TelephonyCS calls addExistingConnection for a Connection with ID + * {@code TelephonyCS@1}. The ConnectionManager learns of this via + * {@link ConnectionService#onRemoteExistingConnectionAdded(RemoteConnection)}, and wraps this + * in a new {@link Connection} which it adds to Telecom via + * {@link ConnectionService#addExistingConnection(PhoneAccountHandle, Connection)}. As part of + * this process, the wrapped RemoteConnection gets assigned a new ID (e.g. {@code ConnMan@1}). + * The TelephonyCS will ALSO try to add the existing connection to Telecom, except with the + * ID it originally referred to the connection as. Thus Telecom needs to know that the + * Connection with ID {@code ConnMan@1} is really the same as {@code TelephonyCS@1}. + * @hide + */ + public static final String EXTRA_ORIGINAL_CONNECTION_ID = + "android.telecom.extra.ORIGINAL_CONNECTION_ID"; + + /** * Connection event used to inform Telecom that it should play the on hold tone. This is used * to play a tone when the peer puts the current call on hold. Sent to Telecom via * {@link #sendConnectionEvent(String, Bundle)}. diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 0c75630cab16..dd55ca9f1f19 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -1347,7 +1347,13 @@ public abstract class ConnectionService extends Service { */ private String addExistingConnectionInternal(PhoneAccountHandle handle, Connection connection) { String id; - if (handle == null) { + + if (connection.getExtras() != null && connection.getExtras() + .containsKey(Connection.EXTRA_ORIGINAL_CONNECTION_ID)) { + id = connection.getExtras().getString(Connection.EXTRA_ORIGINAL_CONNECTION_ID); + Log.d(this, "addExistingConnectionInternal - conn %s reusing original id %s", + connection.getTelecomCallId(), id); + } else if (handle == null) { // If no phone account handle was provided, we cannot be sure the call ID is unique, // so just use a random UUID. id = UUID.randomUUID().toString(); @@ -1381,13 +1387,21 @@ public abstract class ConnectionService extends Service { } private String addConferenceInternal(Conference conference) { + String originalId = null; + if (conference.getExtras() != null && conference.getExtras() + .containsKey(Connection.EXTRA_ORIGINAL_CONNECTION_ID)) { + originalId = conference.getExtras().getString(Connection.EXTRA_ORIGINAL_CONNECTION_ID); + Log.d(this, "addConferenceInternal: conf %s reusing original id %s", + conference.getTelecomCallId(), + originalId); + } if (mIdByConference.containsKey(conference)) { Log.w(this, "Re-adding an existing conference: %s.", conference); } else if (conference != null) { // Conferences do not (yet) have a PhoneAccountHandle associated with them, so we // cannot determine a ConnectionService class name to associate with the ID, so use // a unique UUID (for now). - String id = UUID.randomUUID().toString(); + String id = originalId == null ? UUID.randomUUID().toString() : originalId; mConferenceById.put(id, conference); mIdByConference.put(conference, id); conference.addListener(mConferenceListener); diff --git a/telecomm/java/android/telecom/RemoteConference.java b/telecomm/java/android/telecom/RemoteConference.java index 943da6d1a52e..0ef9ec1804c5 100644 --- a/telecomm/java/android/telecom/RemoteConference.java +++ b/telecomm/java/android/telecom/RemoteConference.java @@ -311,6 +311,9 @@ public final class RemoteConference { /** @hide */ void putExtras(final Bundle extras) { + if (extras == null) { + return; + } if (mExtras == null) { mExtras = new Bundle(); } diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java index f0301155a322..37fa374bdafd 100644 --- a/telecomm/java/android/telecom/RemoteConnection.java +++ b/telecomm/java/android/telecom/RemoteConnection.java @@ -651,6 +651,14 @@ public final class RemoteConnection { mCallerDisplayName = connection.getCallerDisplayName(); mCallerDisplayNamePresentation = connection.getCallerDisplayNamePresentation(); mConference = null; + putExtras(connection.getExtras()); + + // Stash the original connection ID as it exists in the source ConnectionService. + // Telecom will use this to avoid adding duplicates later. + // See comments on Connection.EXTRA_ORIGINAL_CONNECTION_ID for more information. + Bundle newExtras = new Bundle(); + newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId); + putExtras(newExtras); } /** @@ -1348,6 +1356,9 @@ public final class RemoteConnection { /** @hide */ void putExtras(final Bundle extras) { + if (extras == null) { + return; + } if (mExtras == null) { mExtras = new Bundle(); } diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java index c4739ff13a19..1577a0f925f3 100644 --- a/telecomm/java/android/telecom/RemoteConnectionService.java +++ b/telecomm/java/android/telecom/RemoteConnectionService.java @@ -214,18 +214,27 @@ final class RemoteConnectionService { conference.addConnection(c); } } - if (conference.getConnections().size() == 0) { // A conference was created, but none of its connections are ones that have been // created by, and therefore being tracked by, this remote connection service. It // is of no interest to us. + Log.d(this, "addConferenceCall - skipping"); return; } conference.setState(parcel.getState()); conference.setConnectionCapabilities(parcel.getConnectionCapabilities()); conference.setConnectionProperties(parcel.getConnectionProperties()); + conference.putExtras(parcel.getExtras()); mConferenceById.put(callId, conference); + + // Stash the original connection ID as it exists in the source ConnectionService. + // Telecom will use this to avoid adding duplicates later. + // See comments on Connection.EXTRA_ORIGINAL_CONNECTION_ID for more information. + Bundle newExtras = new Bundle(); + newExtras.putString(Connection.EXTRA_ORIGINAL_CONNECTION_ID, callId); + conference.putExtras(newExtras); + conference.registerCallback(new RemoteConference.Callback() { @Override public void onDestroyed(RemoteConference c) { @@ -331,12 +340,18 @@ final class RemoteConnectionService { } @Override - public void addExistingConnection(String callId, ParcelableConnection connection) { - // TODO: add contents of this method - RemoteConnection remoteConnction = new RemoteConnection(callId, + public void addExistingConnection(final String callId, ParcelableConnection connection) { + RemoteConnection remoteConnection = new RemoteConnection(callId, mOutgoingConnectionServiceRpc, connection); - - mOurConnectionServiceImpl.addRemoteExistingConnection(remoteConnction); + mConnectionById.put(callId, remoteConnection); + remoteConnection.registerCallback(new RemoteConnection.Callback() { + @Override + public void onDestroyed(RemoteConnection connection) { + mConnectionById.remove(callId); + maybeDisconnectAdapter(); + } + }); + mOurConnectionServiceImpl.addRemoteExistingConnection(remoteConnection); } @Override diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index eae82c943ceb..08477884fea9 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -698,6 +698,16 @@ public class CarrierConfigManager { public static final String KEY_CARRIER_ADDITIONAL_CBS_CHANNELS_STRINGS = "carrier_additional_cbs_channels_strings"; + /** + * Indicates whether STK LAUNCH_BROWSER command is disabled. + * If {@code true}, then the browser will not be launched + * on UI for the LAUNCH_BROWSER STK command. + * @hide + */ + public static final String KEY_STK_DISABLE_LAUNCH_BROWSER_BOOL = + "stk_disable_launch_browser_bool"; + + // These variables are used by the MMS service and exposed through another API, {@link // SmsManager}. The variable names and string values are copied from there. public static final String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled"; @@ -1153,6 +1163,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_NOTIFY_VT_HANDOVER_TO_WIFI_FAILURE_BOOL, false); sDefaults.putStringArray(FILTERED_CNAP_NAMES_STRING_ARRAY, null); sDefaults.putBoolean(KEY_EDITABLE_WFC_ROAMING_MODE_BOOL, false); + sDefaults.putBoolean(KEY_STK_DISABLE_LAUNCH_BROWSER_BOOL, false); } /** |