diff options
75 files changed, 2819 insertions, 636 deletions
diff --git a/Android.mk b/Android.mk index b21f234348e8..197416e6b99e 100644 --- a/Android.mk +++ b/Android.mk @@ -859,6 +859,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/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 54ead22db51f..4f0cf74f6428 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -2037,7 +2037,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; @@ -2059,7 +2059,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(); @@ -2087,7 +2087,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/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/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 25806fa77674..f65a50f02df3 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -904,7 +904,8 @@ public class NetworkStats implements Parcelable { if (pool.isEmpty()) { return true; } - Entry moved = addTrafficToApplications(tunIface, underlyingIface, tunIfaceTotal, pool); + Entry moved = + addTrafficToApplications(tunUid, tunIface, underlyingIface, tunIfaceTotal, pool); deductTrafficFromVpnApp(tunUid, underlyingIface, moved); if (!moved.isEmpty()) { @@ -919,9 +920,9 @@ public class NetworkStats implements Parcelable { * Initializes the data used by the migrateTun() method. * * This is the first pass iteration which does the following work: - * (1) Adds up all the traffic through tun0. - * (2) Adds up all the traffic through the tunUid's underlyingIface + * (1) Adds up all the traffic through the tunUid's underlyingIface * (both foreground and background). + * (2) Adds up all the traffic through tun0 excluding traffic from the vpn app itself. */ private void tunAdjustmentInit(int tunUid, String tunIface, String underlyingIface, Entry tunIfaceTotal, Entry underlyingIfaceTotal) { @@ -941,8 +942,9 @@ public class NetworkStats implements Parcelable { underlyingIfaceTotal.add(recycle); } - if (recycle.tag == TAG_NONE && Objects.equals(tunIface, recycle.iface)) { - // Add up all tunIface traffic. + if (recycle.uid != tunUid && recycle.tag == TAG_NONE + && Objects.equals(tunIface, recycle.iface)) { + // Add up all tunIface traffic excluding traffic from the vpn app itself. tunIfaceTotal.add(recycle); } } @@ -958,13 +960,15 @@ public class NetworkStats implements Parcelable { return pool; } - private Entry addTrafficToApplications(String tunIface, String underlyingIface, + private Entry addTrafficToApplications(int tunUid, String tunIface, String underlyingIface, Entry tunIfaceTotal, Entry pool) { Entry moved = new Entry(); Entry tmpEntry = new Entry(); tmpEntry.iface = underlyingIface; for (int i = 0; i < size; i++) { - if (Objects.equals(iface[i], tunIface)) { + // the vpn app is excluded from the redistribution but all moved traffic will be + // deducted from the vpn app (see deductTrafficFromVpnApp below). + if (Objects.equals(iface[i], tunIface) && uid[i] != tunUid) { if (tunIfaceTotal.rxBytes > 0) { tmpEntry.rxBytes = pool.rxBytes * rxBytes[i] / tunIfaceTotal.rxBytes; } else { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 1fdb0cd370f4..81d0cf29ba9e 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6863,6 +6863,12 @@ public final class Settings { public static final String DOCK_SOUNDS_ENABLED = "dock_sounds_enabled"; /** + * Whether to play a sound for dock events, only when an accessibility service is on. + * @hide + */ + public static final String DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY = "dock_sounds_enabled_when_accessbility"; + + /** * URI for the "device locked" (keyguard shown) sound. * @hide */ @@ -7992,11 +7998,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 428159a75e87..98bf28be923f 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -175,7 +175,7 @@ static void verifySystemIdmaps() } // Generic idmap parameters - const char* argv[7]; + const char* argv[8]; int argc = 0; struct stat st; @@ -186,25 +186,24 @@ static void verifySystemIdmaps() argv[argc++] = AssetManager::TARGET_APK_PATH; 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. + // Directories to scan for overlays: if OVERLAY_THEME_DIR_PROPERTY is defined, + // use OVERLAY_DIR/<value of OVERLAY_THEME_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; + int len = __system_property_get(AssetManager::OVERLAY_THEME_DIR_PROPERTY, subdir); 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) if (argc > 5) { execv(AssetManager::IDMAP_BIN, (char* const*)argv); - ALOGE("failed to execl for idmap: %s", strerror(errno)); + ALOGE("failed to execv for idmap: %s", strerror(errno)); exit(1); // should never get here } else { exit(0); diff --git a/core/res/res/drawable-watch/scrollbar_vertical_thumb.xml b/core/res/res/drawable-watch/scrollbar_vertical_thumb.xml new file mode 100644 index 000000000000..51aced25e619 --- /dev/null +++ b/core/res/res/drawable-watch/scrollbar_vertical_thumb.xml @@ -0,0 +1,23 @@ +<?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. +--> + +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:tint="?attr/colorControlNormal" + android:shape="rectangle"> + <solid android:color="#39757575" /> + <size android:height="10dp" /> + <corners android:radius="2dp" /> +</shape> diff --git a/core/res/res/drawable-watch/scrollbar_vertical_track.xml b/core/res/res/drawable-watch/scrollbar_vertical_track.xml new file mode 100644 index 000000000000..5a04b1ca0b2c --- /dev/null +++ b/core/res/res/drawable-watch/scrollbar_vertical_track.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. +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:tint="?attr/colorControlNormal" + android:shape="rectangle"> + <solid android:color="#39ffffff" /> + <size android:width="4dp" /> +</shape> 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..aefe28f7f359 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 @@ -14,24 +14,31 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<FrameLayout +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="top|center_horizontal" - android:minHeight="@dimen/alert_dialog_title_height"> - <ImageView android:id="@+id/icon" - android:maxHeight="24dp" - android:maxWidth="24dp" - android:layout_marginTop="12dp" - android:layout_gravity="center_horizontal" - android:layout_width="wrap_content" + android:orientation="vertical" + android:gravity="top|center_horizontal"> + <FrameLayout + android:adjustViewBounds="true" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:src="@null" /> + android:minHeight="@dimen/screen_percentage_15"> + <ImageView android:id="@+id/icon" + android:adjustViewBounds="true" + android:maxHeight="24dp" + android:maxWidth="24dp" + android:layout_marginTop="@dimen/screen_percentage_10" + android:layout_marginBottom="8dp" + android:layout_gravity="center_horizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@null" /> + </FrameLayout> <TextView android:id="@+id/alertTitle" style="?android:attr/windowTitleStyle" - android:layout_marginTop="36dp" android:layout_marginBottom="8dp" android:layout_width="match_parent" android:layout_height="wrap_content" /> -</FrameLayout> +</LinearLayout> diff --git a/core/res/res/values-watch/colors_device_defaults.xml b/core/res/res/values-watch/colors_device_defaults.xml index 9150cc409e13..15786b4a23f8 100644 --- a/core/res/res/values-watch/colors_device_defaults.xml +++ b/core/res/res/values-watch/colors_device_defaults.xml @@ -18,4 +18,7 @@ overlaying new theme colors. --> <resources> <color name="button_normal_device_default_dark">@color/btn_default_material_dark</color> + <!-- Use the same value as for accent_device_default_dark but start with #99, + i.e. 60% opacity --> + <color name="accent_device_default_dark_60_percent_opacity">#995E97f6</color> </resources> diff --git a/core/res/res/values-watch/config_material.xml b/core/res/res/values-watch/config_material.xml index 104d122e01d3..529f18b78e4d 100644 --- a/core/res/res/values-watch/config_material.xml +++ b/core/res/res/values-watch/config_material.xml @@ -29,4 +29,8 @@ <!-- Always overscan by default to ensure onApplyWindowInsets will always be called. --> <bool name="config_windowOverscanByDefault">true</bool> + + <!-- Style the scrollbars accoridngly. --> + <drawable name="config_scrollbarThumbVertical">@drawable/scrollbar_vertical_thumb</drawable> + <drawable name="config_scrollbarTrackVertical">@drawable/scrollbar_vertical_track</drawable> </resources> 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/config.xml b/core/res/res/values/config.xml index a9e9ccdd4a0c..59ebe1cba8c6 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1178,9 +1178,13 @@ <integer-array name="config_dynamicHysteresisLuxLevels"> </integer-array> - <!-- This flag requires config_dozeSensorLuxLevels to have one or more entries and only affects - the screen brightness while dozing. The screen brightness of a device is based off of a - ring buffer of the last n seconds of ambient light sensor sample readings. + <!-- This flag requires config_dozeBrightnessBacklightValues to have two or more entries; it is + recommended that config_screenBrightnessDoze be greater than or equal to all these entries + since this value is used as the doze screen brightness until a new sensor sample is + acquired. This flag only affects the screen brightness while dozing. + + The screen brightness of a device is based off of a ring buffer of the last n seconds of + ambient light sensor sample readings. If this flag is true, then this buffer is cleared and the screen brightness is based off of ambient light sensor readings that are obtained while the device is dozing. This mode may @@ -1742,6 +1746,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/config_material.xml b/core/res/res/values/config_material.xml index 29494db40557..840a551f914f 100644 --- a/core/res/res/values/config_material.xml +++ b/core/res/res/values/config_material.xml @@ -37,4 +37,8 @@ <!-- The amount to offset when scrolling to a selection in an AlertDialog --> <dimen name="config_alertDialogSelectionScrollOffset">0dp</dimen> + + <!-- Style the scrollbars accoridngly. --> + <drawable name="config_scrollbarThumbVertical">@drawable/scrollbar_handle_material</drawable> + <drawable name="config_scrollbarTrackVertical">@null</drawable> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 9f4ebd9dd098..2d305d2d6af7 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2679,6 +2679,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_material.xml b/core/res/res/values/themes_material.xml index 0eb4c8d86928..ff8693bbbdad 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -212,9 +212,9 @@ please see themes_device_defaults.xml. <item name="scrollbarDefaultDelayBeforeFade">400</item> <item name="scrollbarSize">10dp</item> <item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item> - <item name="scrollbarThumbVertical">@drawable/scrollbar_handle_material</item> + <item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item> <item name="scrollbarTrackHorizontal">@null</item> - <item name="scrollbarTrackVertical">@null</item> + <item name="scrollbarTrackVertical">@drawable/config_scrollbarTrackVertical</item> <!-- Text selection handle attributes --> <item name="textSelectHandleLeft">@drawable/text_select_handle_left_material</item> @@ -573,9 +573,9 @@ please see themes_device_defaults.xml. <item name="scrollbarDefaultDelayBeforeFade">400</item> <item name="scrollbarSize">10dp</item> <item name="scrollbarThumbHorizontal">@drawable/scrollbar_handle_material</item> - <item name="scrollbarThumbVertical">@drawable/scrollbar_handle_material</item> + <item name="scrollbarThumbVertical">@drawable/config_scrollbarThumbVertical</item> <item name="scrollbarTrackHorizontal">@null</item> - <item name="scrollbarTrackVertical">@null</item> + <item name="scrollbarTrackVertical">@drawable/config_scrollbarTrackVertical</item> <!-- Text selection handle attributes --> <item name="textSelectHandleLeft">@drawable/text_select_handle_left_material</item> diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java index 9074f8a97132..d48a67a4c72f 100644 --- a/core/tests/coretests/src/android/net/NetworkStatsTest.java +++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java @@ -454,7 +454,7 @@ public class NetworkStatsTest extends TestCase { .addValues(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, 0L, 0L, 0L, 0L, 0L); assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); - assertEquals(21, delta.size()); + assertEquals(20, delta.size()); // tunIface and TEST_IFACE entries are not changed. assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, @@ -478,38 +478,89 @@ public class NetworkStatsTest extends TestCase { // Existing underlying Iface entries are updated assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 44783L, 54L, 13829L, 60L, 0L); + 44783L, 54L, 14178L, 62L, 0L); assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, 0L, 0L); // VPN underlying Iface entries are updated assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 28304L, 27L, 1719L, 12L, 0L); + 28304L, 27L, 1L, 2L, 0L); assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L, 0L, 0L, 0L); // New entries are added for new application's underlying Iface traffic assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_NO, - 72667L, 197L, 41872L, 219L, 0L); + 72667L, 197L, 43123L, 227L, 0L); assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_NO, - 9297L, 17L, 3936, 19L, 0L); + 9297L, 17L, 4054, 19L, 0L); assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, ROAMING_NO, - 21691L, 41L, 13179L, 46L, 0L); + 21691L, 41L, 13572L, 48L, 0L); assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, ROAMING_NO, - 1281L, 2L, 634L, 1L, 0L); + 1281L, 2L, 653L, 1L, 0L); // New entries are added for debug purpose assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 39605L, 46L, 11690, 49, 0); + 39605L, 46L, 12039, 51, 0); assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 81964, 214, 45808, 238, 0); - assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, - 4983, 10, 1717, 10, 0); + 81964, 214, 47177, 246, 0); assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, ROAMING_ALL, - 126552, 270, 59215, 297, 0); + 121569, 260, 59216, 297, 0); } + // Tests a case where all of the data received by the tun0 interface is echo back into the tun0 + // interface by the vpn app before it's sent out of the underlying interface. The VPN app should + // not be charged for the echoed data but it should still be charged for any extra data it sends + // via the underlying interface. + public void testMigrateTun_VpnAsLoopback() { + final int tunUid = 10030; + final String tunIface = "tun0"; + final String underlyingIface = "wlan0"; + NetworkStats delta = new NetworkStats(TEST_START, 9) + // 2 different apps sent/receive data via tun0. + .addValues(tunIface, 10100, SET_DEFAULT, TAG_NONE, 50000L, 25L, 100000L, 50L, 0L) + .addValues(tunIface, 20100, SET_DEFAULT, TAG_NONE, 500L, 2L, 200L, 5L, 0L) + // VPN package resends data through the tunnel (with exaggerated overhead) + .addValues(tunIface, tunUid, SET_DEFAULT, TAG_NONE, 240000, 100L, 120000L, 60L, 0L) + // 1 app already has some traffic on the underlying interface, the other doesn't yet + .addValues(underlyingIface, 10100, SET_DEFAULT, TAG_NONE, 1000L, 10L, 2000L, 20L, 0L) + // Traffic through the underlying interface via the vpn app. + // This test should redistribute this data correctly. + .addValues(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, + 75500L, 37L, 130000L, 70L, 0L); + + assertTrue(delta.migrateTun(tunUid, tunIface, underlyingIface)); + assertEquals(9, delta.size()); + + // tunIface entries should not be changed. + assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 50000L, 25L, 100000L, 50L, 0L); + assertValues(delta, 1, tunIface, 20100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 500L, 2L, 200L, 5L, 0L); + assertValues(delta, 2, tunIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 240000L, 100L, 120000L, 60L, 0L); + + // Existing underlying Iface entries are updated + assertValues(delta, 3, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 51000L, 35L, 102000L, 70L, 0L); + + // VPN underlying Iface entries are updated + assertValues(delta, 4, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 25000L, 10L, 29800L, 15L, 0L); + + // New entries are added for new application's underlying Iface traffic + assertContains(delta, underlyingIface, 20100, SET_DEFAULT, TAG_NONE, ROAMING_NO, + 500L, 2L, 200L, 5L, 0L); + + // New entries are added for debug purpose + assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, + 50000L, 25L, 100000L, 50L, 0L); + assertContains(delta, underlyingIface, 20100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO, + 500, 2L, 200L, 5L, 0L); + assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, ROAMING_ALL, + 50500L, 27L, 100200L, 55, 0); + } + private static void assertContains(NetworkStats stats, String iface, int uid, int set, int tag, int roaming, long rxBytes, long rxPackets, long txBytes, long txPackets, long operations) { 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/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..4039d9bd2140 100644 --- a/include/androidfw/AssetManager.h +++ b/include/androidfw/AssetManager.h @@ -73,11 +73,11 @@ public: static const char* IDMAP_BIN; 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 + * If OVERLAY_THEME_DIR_PROPERTY is set, search for runtime resource overlay + * APKs in OVERLAY_DIR/<value of OVERLAY_THEME_DIR_PROPERTY> in addition to * OVERLAY_DIR. */ - static const char* OVERLAY_SKU_DIR_PROPERTY; + static const char* OVERLAY_THEME_DIR_PROPERTY; static const char* TARGET_PACKAGE_NAME; static const char* TARGET_APK_PATH; static const char* IDMAP_DIR; diff --git a/libs/androidfw/Asset.cpp b/libs/androidfw/Asset.cpp index 2cfa6666e9ab..8e8c6a2e25a2 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/AssetManager.cpp b/libs/androidfw/AssetManager.cpp index 81e91a80783b..80968e51d48c 100644 --- a/libs/androidfw/AssetManager.cpp +++ b/libs/androidfw/AssetManager.cpp @@ -79,7 +79,7 @@ static volatile int32_t gCount = 0; const char* AssetManager::RESOURCES_FILENAME = "resources.arsc"; const char* AssetManager::IDMAP_BIN = "/system/bin/idmap"; const char* AssetManager::OVERLAY_DIR = "/vendor/overlay"; -const char* AssetManager::OVERLAY_SKU_DIR_PROPERTY = "ro.boot.vendor.overlay.sku"; +const char* AssetManager::OVERLAY_THEME_DIR_PROPERTY = "ro.boot.vendor.overlay.theme"; const char* AssetManager::TARGET_PACKAGE_NAME = "android"; const char* AssetManager::TARGET_APK_PATH = "/system/framework/framework-res.apk"; const char* AssetManager::IDMAP_DIR = "/data/resource-cache"; 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/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/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index b58c87a5094d..bb8eb2cd0797 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -115,6 +115,7 @@ public class CaptivePortalLoginActivity extends Activity { myWebView.clearCache(true); WebSettings webSettings = myWebView.getSettings(); webSettings.setJavaScriptEnabled(true); + webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); mWebViewClient = new MyWebViewClient(); myWebView.setWebViewClient(mWebViewClient); myWebView.setWebChromeClient(new MyWebChromeClient()); 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 3a16a75f26db..6bc1d129b35d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -373,7 +373,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() { @@ -813,7 +817,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/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index 08bf3a7f9f95..a536874b750b 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -69,6 +69,7 @@ <integer name="def_power_sounds_enabled">1</integer> <string name="def_low_battery_sound" translatable="false">/system/media/audio/ui/LowBattery.ogg</string> <integer name="def_dock_sounds_enabled">0</integer> + <integer name="def_dock_sounds_enabled_when_accessibility">0</integer> <string name="def_desk_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> <string name="def_desk_undock_sound" translatable="false">/system/media/audio/ui/Undock.ogg</string> <string name="def_car_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index c1a1f844f6d9..d55bb4f44aa5 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -2662,6 +2662,8 @@ class DatabaseHelper extends SQLiteOpenHelper { R.string.def_low_battery_sound); loadIntegerSetting(stmt, Settings.Global.DOCK_SOUNDS_ENABLED, R.integer.def_dock_sounds_enabled); + loadIntegerSetting(stmt, Settings.Global.DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY, + R.integer.def_dock_sounds_enabled_when_accessibility); loadStringSetting(stmt, Settings.Global.DESK_DOCK_SOUND, R.string.def_desk_dock_sound); loadStringSetting(stmt, Settings.Global.DESK_UNDOCK_SOUND, 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/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java index 4ac629dc1da5..ccb28e95802e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java @@ -188,7 +188,8 @@ public class QSFooter implements OnClickListener, DialogInterface.OnClickListene profileOwner, profileVpn, primaryVpn); } else { if (isBranded) { - return mContext.getString(R.string.branded_monitoring_description_app_personal); + return mContext.getString(R.string.branded_monitoring_description_app_personal, + primaryVpn); } else { return mContext.getString(R.string.monitoring_description_app_personal, primaryVpn); 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 f6447f6b9527..498fae05f9ae 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/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 037cef554e9e..52be811fad17 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 @@ -267,6 +267,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; } @@ -293,8 +294,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; } /** @@ -310,6 +313,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); @@ -1372,7 +1376,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 @@ -1684,6 +1688,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 30edd9fe8bf4..e8001c593b22 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -2263,11 +2263,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) { @@ -2288,6 +2296,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/DockObserver.java b/services/core/java/com/android/server/DockObserver.java index 07aa565642c6..122074ba4dac 100644 --- a/services/core/java/com/android/server/DockObserver.java +++ b/services/core/java/com/android/server/DockObserver.java @@ -167,10 +167,17 @@ final class DockObserver extends SystemService { intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING); intent.putExtra(Intent.EXTRA_DOCK_STATE, mReportedDockState); + boolean dockSoundsEnabled = Settings.Global.getInt(cr, + Settings.Global.DOCK_SOUNDS_ENABLED, 1) == 1; + boolean dockSoundsEnabledWhenAccessibility = Settings.Global.getInt(cr, + Settings.Global.DOCK_SOUNDS_ENABLED_WHEN_ACCESSIBILITY, 1) == 1; + boolean accessibilityEnabled = Settings.Secure.getInt(cr, + Settings.Secure.ACCESSIBILITY_ENABLED, 0) == 1; + // Play a sound to provide feedback to confirm dock connection. // Particularly useful for flaky contact pins... - if (Settings.Global.getInt(cr, - Settings.Global.DOCK_SOUNDS_ENABLED, 1) == 1) { + if ((dockSoundsEnabled) || + (accessibilityEnabled && dockSoundsEnabledWhenAccessibility)) { String whichSound = null; if (mReportedDockState == Intent.EXTRA_DOCK_STATE_UNDOCKED) { if ((previousDockState == Intent.EXTRA_DOCK_STATE_DESK) || diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 3aaddd80cfe6..998e2c646184 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -4464,7 +4464,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/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index d2e29cd62346..1738797420e6 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -153,6 +153,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // True if should use light sensor to automatically determine doze screen brightness. private final boolean mAllowAutoBrightnessWhileDozingConfig; + // True if using only new sensor samples to automatically determine doze screen brightness. + private boolean mUseNewSensorSamplesForDoze; + // True if we should fade the screen while turning it off, false if we should play // a stylish color fade animation instead. private boolean mColorFadeFadesConfig; @@ -345,10 +348,10 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call com.android.internal.R.array.config_dozeSensorLuxLevels); int[] dozeBrightnessBacklightValues = resources.getIntArray( com.android.internal.R.array.config_dozeBrightnessBacklightValues); - boolean useNewSensorSamplesForDoze = resources.getBoolean( + mUseNewSensorSamplesForDoze = resources.getBoolean( com.android.internal.R.bool.config_useNewSensorSamplesForDoze); LuxLevels luxLevels = new LuxLevels(brightHysteresisLevels, darkHysteresisLevels, - luxHysteresisLevels, useNewSensorSamplesForDoze, dozeSensorLuxLevels, + luxHysteresisLevels, mUseNewSensorSamplesForDoze, dozeSensorLuxLevels, dozeBrightnessBacklightValues); Spline screenAutoBrightnessSpline = createAutoBrightnessSpline(lux, screenBrightness); @@ -671,10 +674,13 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mAppliedAutoBrightness = false; } - // Use default brightness when dozing unless overridden. - if (brightness < 0 && (state == Display.STATE_DOZE - || state == Display.STATE_DOZE_SUSPEND)) { - brightness = mScreenBrightnessDozeConfig; + // Use default brightness when dozing unless overridden or if collecting sensor samples. + if (state == Display.STATE_DOZE || state == Display.STATE_DOZE_SUSPEND) { + if (brightness < 0) { + brightness = mScreenBrightnessDozeConfig; + } else if (mUseNewSensorSamplesForDoze) { + brightness = Math.min(brightness, mScreenBrightnessDozeConfig); + } } // Apply manual brightness. 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 56a01737eac2..cd8aa623f17d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -464,11 +464,11 @@ 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_THEME_PROPERTY is set, search for runtime resource overlay APKs also in + * VENDOR_OVERLAY_DIR/<value of VENDOR_OVERLAY_THEME_PROPERTY> in addition to * VENDOR_OVERLAY_DIR. */ - private static final String VENDOR_OVERLAY_SKU_PROPERTY = "ro.boot.vendor.overlay.sku"; + private static final String VENDOR_OVERLAY_THEME_PROPERTY = "ro.boot.vendor.overlay.theme"; private static int DEFAULT_EPHEMERAL_HASH_PREFIX_MASK = 0xFFFFF000; private static int DEFAULT_EPHEMERAL_HASH_PREFIX_COUNT = 5; @@ -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(vendorOverlayDir, mDefParseFlags + String overlayThemeDir = SystemProperties.get(VENDOR_OVERLAY_THEME_PROPERTY); + if (!overlayThemeDir.isEmpty()) { + scanDirTracedLI(new File(VENDOR_OVERLAY_DIR, overlayThemeDir), mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM + | PackageParser.PARSE_IS_SYSTEM_DIR + | PackageParser.PARSE_TRUSTED_OVERLAY, scanFlags | SCAN_TRUSTED_OVERLAY, 0); + } + 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/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/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/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 c9b5454f837f..016490cb50f7 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -1695,7 +1695,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(); @@ -1729,13 +1735,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 4bff688dc5ca..502b7c01b0c0 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 11842a0d02e2..0e4f53e4881a 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); } /** @@ -1350,6 +1358,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 7321a274021c..0a8470af7a7d 100644 --- a/telecomm/java/android/telecom/RemoteConnectionService.java +++ b/telecomm/java/android/telecom/RemoteConnectionService.java @@ -219,18 +219,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) { @@ -342,11 +351,17 @@ final class RemoteConnectionService { @Override public void addExistingConnection(String callId, ParcelableConnection connection, Session.Info sessionInfo) { - // TODO: add contents of this method - RemoteConnection remoteConnction = new RemoteConnection(callId, + 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 d611ed974776..c19febfec99c 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -734,6 +734,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"; @@ -1203,6 +1213,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); } /** |