diff options
19 files changed, 490 insertions, 214 deletions
diff --git a/api/current.txt b/api/current.txt index 41acac5e1895..15c4a9bf5bb1 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28383,7 +28383,6 @@ package android.security { } public final deprecated class KeyStoreParameter implements java.security.KeyStore.ProtectionParameter { - method public android.content.Context getContext(); method public boolean isEncryptionRequired(); } diff --git a/api/system-current.txt b/api/system-current.txt index 0f6bd2a80dfd..e7032c307535 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -30409,7 +30409,6 @@ package android.security { } public final deprecated class KeyStoreParameter implements java.security.KeyStore.ProtectionParameter { - method public android.content.Context getContext(); method public boolean isEncryptionRequired(); } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 43678ccafc23..62a16179b5d0 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -1560,6 +1560,42 @@ public class Intent implements Parcelable, Cloneable { public static final String EXTRA_PACKAGE_NAME = "android.intent.extra.PACKAGE_NAME"; /** + * Broadcast action that requests current permission granted information. It will respond + * to the request by sending a broadcast with action defined by + * {@link #EXTRA_GET_PERMISSIONS_RESPONSE_INTENT}. The response will contain + * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT} with contents described below or a null upon + * failure. + * + * <p>If {@link #EXTRA_PACKAGE_NAME} is included then the number of permissions granted and the + * number of permissions requested by that package will be calculated and included as the first + * and second elements respectively of an int[] in the response as + * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. + * + * <p>If {@link #EXTRA_PACKAGE_NAME} is not included then the number of apps granted any runtime + * permissions and the total number of apps requesting runtime permissions will be the first + * and second elements respectively of an int[] in the response as + * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. + * + * @hide + */ + public static final String ACTION_GET_PERMISSIONS_COUNT + = "android.intent.action.GET_PERMISSIONS_COUNT"; + + /** + * Extra included in response to {@link #ACTION_GET_PERMISSIONS_COUNT}. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_COUNT_RESULT + = "android.intent.extra.GET_PERMISSIONS_COUNT_RESULT"; + + /** + * Required extra to be sent with {@link #ACTION_GET_PERMISSIONS_COUNT} broadcast. + * @hide + */ + public static final String EXTRA_GET_PERMISSIONS_RESPONSE_INTENT + = "android.intent.extra.GET_PERMISSIONS_RESONSE_INTENT"; + + /** * Activity action: Launch UI to manage which apps have a given permission. * <p> * Input: {@link #EXTRA_PERMISSION_NAME} specifies the permission access diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index acc27c3944aa..596c0e4c2e23 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -2047,8 +2047,9 @@ public class PackageParser { String tagName = parser.getName(); if (tagName.equals("key-set")) { if (currentKeySet != null) { - Slog.w(TAG, "Improperly nested 'key-set' tag at " - + parser.getPositionDescription()); + outError[0] = "Improperly nested 'key-set' tag at " + + parser.getPositionDescription(); + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } final TypedArray sa = res.obtainAttributes(attrs, @@ -2061,8 +2062,9 @@ public class PackageParser { sa.recycle(); } else if (tagName.equals("public-key")) { if (currentKeySet == null) { - Slog.w(TAG, "Improperly nested 'public-key' tag at " - + parser.getPositionDescription()); + outError[0] = "Improperly nested 'key-set' tag at " + + parser.getPositionDescription(); + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } final TypedArray sa = res.obtainAttributes(attrs, @@ -2072,8 +2074,9 @@ public class PackageParser { final String encodedKey = sa.getNonResourceString( com.android.internal.R.styleable.AndroidManifestPublicKey_value); if (encodedKey == null && publicKeys.get(publicKeyName) == null) { - Slog.w(TAG, "'public-key' " + publicKeyName + " must define a public-key value" - + " on first use at " + parser.getPositionDescription()); + outError[0] = "'public-key' " + publicKeyName + " must define a public-key value" + + " on first use at " + parser.getPositionDescription(); + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; sa.recycle(); return false; } else if (encodedKey != null) { @@ -2093,9 +2096,10 @@ public class PackageParser { /* public-key first definition, or matches old definition */ publicKeys.put(publicKeyName, currentKey); } else { - Slog.w(TAG, "Value of 'public-key' " + publicKeyName + outError[0] = "Value of 'public-key' " + publicKeyName + " conflicts with previously defined value at " - + parser.getPositionDescription()); + + parser.getPositionDescription(); + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; sa.recycle(); return false; } @@ -2112,9 +2116,10 @@ public class PackageParser { sa.recycle(); XmlUtils.skipCurrentTag(parser); } else if (RIGID_PARSER) { - Slog.w(TAG, "Bad element under <key-sets>: " + parser.getName() + outError[0] = "Bad element under <key-sets>: " + parser.getName() + " at " + mArchiveSourcePath + " " - + parser.getPositionDescription()); + + parser.getPositionDescription(); + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } else { Slog.w(TAG, "Unknown element under <key-sets>: " + parser.getName() @@ -2126,8 +2131,9 @@ public class PackageParser { } Set<String> publicKeyNames = publicKeys.keySet(); if (publicKeyNames.removeAll(definedKeySets.keySet())) { - Slog.w(TAG, "Package" + owner.packageName + " AndroidManifext.xml " - + "'key-set' and 'public-key' names must be distinct."); + outError[0] = "Package" + owner.packageName + " AndroidManifext.xml " + + "'key-set' and 'public-key' names must be distinct."; + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } owner.mKeySetMapping = new ArrayMap<String, ArraySet<PublicKey>>(); @@ -2152,8 +2158,9 @@ public class PackageParser { if (owner.mKeySetMapping.keySet().containsAll(upgradeKeySets)) { owner.mUpgradeKeySets = upgradeKeySets; } else { - Slog.w(TAG, "Package" + owner.packageName + " AndroidManifext.xml " - + "does not define all 'upgrade-key-set's ."); + outError[0] ="Package" + owner.packageName + " AndroidManifext.xml " + + "does not define all 'upgrade-key-set's ."; + mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; return false; } return true; diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index e175e9a51709..3a3c47d860a1 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -611,11 +611,11 @@ public class ConnectivityManager { /** * Retrieves the current preferred network type. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an integer representing the preferred network type * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * @deprecated Functionality has been removed as it no longer makes sense, * with many more than two networks - we'd need an array to express * preference. Instead we use dynamic network properties of @@ -631,12 +631,11 @@ public class ConnectivityManager { * You should always check {@link NetworkInfo#isConnected()} before initiating * network traffic. This may return {@code null} when there is no default * network. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return a {@link NetworkInfo} object for the current default network * or {@code null} if no default network is currently active - * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public NetworkInfo getActiveNetworkInfo() { try { @@ -652,12 +651,11 @@ public class ConnectivityManager { * network disconnects, the returned {@code Network} object will no longer * be usable. This will return {@code null} when there is no default * network. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return a {@link Network} object for the current default network or * {@code null} if no default network is currently active - * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public Network getActiveNetwork() { try { @@ -671,13 +669,13 @@ public class ConnectivityManager { * Returns details about the currently active default data network * for a given uid. This is for internal use only to avoid spying * other apps. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL} * * @return a {@link NetworkInfo} object for the current default network * for the given uid or {@code null} if no default network is * available for the specified uid. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL} * {@hide} */ public NetworkInfo getActiveNetworkInfoForUid(int uid) { @@ -691,6 +689,8 @@ public class ConnectivityManager { /** * Returns connection status information about a particular * network type. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param networkType integer specifying which networkType in * which you're interested. @@ -698,9 +698,6 @@ public class ConnectivityManager { * network type or {@code null} if the type is not * supported by the device. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. - * * @deprecated This method does not support multiple connected networks * of the same type. Use {@link #getAllNetworks} and * {@link #getNetworkInfo(android.net.Network)} instead. @@ -716,15 +713,14 @@ public class ConnectivityManager { /** * Returns connection status information about a particular * Network. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param network {@link Network} specifying which network * in which you're interested. * @return a {@link NetworkInfo} object for the requested * network or {@code null} if the {@code Network} * is not valid. - * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public NetworkInfo getNetworkInfo(Network network) { try { @@ -737,13 +733,12 @@ public class ConnectivityManager { /** * Returns connection status information about all network * types supported by the device. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an array of {@link NetworkInfo} objects. Check each * {@link NetworkInfo#getType} for which type each applies. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. - * * @deprecated This method does not support multiple connected networks * of the same type. Use {@link #getAllNetworks} and * {@link #getNetworkInfo(android.net.Network)} instead. @@ -779,11 +774,10 @@ public class ConnectivityManager { /** * Returns an array of all {@link Network} currently tracked by the * framework. - * - * @return an array of {@link Network} objects. - * * <p>This method requires the caller to hold the permission * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * + * @return an array of {@link Network} objects. */ public Network[] getAllNetworks() { try { @@ -812,13 +806,12 @@ public class ConnectivityManager { * You should always check {@link NetworkInfo#isConnected()} before initiating * network traffic. This may return {@code null} when there is no default * network. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return a {@link NetworkInfo} object for the current default network * or {@code null} if no default network is currently active * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. - * * {@hide} */ public NetworkInfo getProvisioningOrActiveNetworkInfo() { @@ -831,13 +824,13 @@ public class ConnectivityManager { /** * Returns the IP information for the current default network. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return a {@link LinkProperties} object describing the IP info * for the current default network, or {@code null} if there * is no current default network. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public LinkProperties getActiveLinkProperties() { @@ -850,14 +843,14 @@ public class ConnectivityManager { /** * Returns the IP information for a given network type. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param networkType the network type of interest. * @return a {@link LinkProperties} object describing the IP info * for the given networkType, or {@code null} if there is * no current default network. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} * @deprecated This method does not support multiple connected networks * of the same type. Use {@link #getAllNetworks}, @@ -875,10 +868,12 @@ public class ConnectivityManager { /** * Get the {@link LinkProperties} for the given {@link Network}. This * will return {@code null} if the network is unknown. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param network The {@link Network} object identifying the network in question. * @return The {@link LinkProperties} for the network, or {@code null}. - **/ + */ public LinkProperties getLinkProperties(Network network) { try { return mService.getLinkProperties(network); @@ -890,6 +885,8 @@ public class ConnectivityManager { /** * Get the {@link android.net.NetworkCapabilities} for the given {@link Network}. This * will return {@code null} if the network is unknown. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param network The {@link Network} object identifying the network in question. * @return The {@link android.net.NetworkCapabilities} for the network, or {@code null}. @@ -1493,11 +1490,11 @@ public class ConnectivityManager { /** * Get the set of tetherable, available interfaces. This list is limited by * device configuration and current interface existence. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an array of 0 or more Strings of tetherable interface names. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableIfaces() { @@ -1510,11 +1507,11 @@ public class ConnectivityManager { /** * Get the set of tethered interfaces. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an array of 0 or more String of currently tethered interface names. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetheredIfaces() { @@ -1532,12 +1529,12 @@ public class ConnectivityManager { * may cause them to reset to the available state. * {@link ConnectivityManager#getLastTetherError} can be used to get more * information on the cause of the errors. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an array of 0 or more String indicating the interface names * which failed to tether. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetheringErroredIfaces() { @@ -1570,12 +1567,12 @@ public class ConnectivityManager { * allowed between the tethered devices and this device, though upstream net * access will of course fail until an upstream network interface becomes * active. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * * @param iface the interface name to tether. * @return error a {@code TETHER_ERROR} value indicating success or failure type * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int tether(String iface) { @@ -1588,12 +1585,12 @@ public class ConnectivityManager { /** * Stop tethering the named interface. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * * @param iface the interface name to untether. * @return error a {@code TETHER_ERROR} value indicating success or failure type * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int untether(String iface) { @@ -1608,11 +1605,11 @@ public class ConnectivityManager { * Check if the device allows for tethering. It may be disabled via * {@code ro.tether.denied} system property, Settings.TETHER_SUPPORTED or * due to device configuration. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return a boolean - {@code true} indicating Tethering is supported. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public boolean isTetheringSupported() { @@ -1627,12 +1624,12 @@ public class ConnectivityManager { * Get the list of regular expressions that define any tetherable * USB network interfaces. If USB tethering is not supported by the * device, this list should be empty. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an array of 0 or more regular expression Strings defining * what interfaces are considered tetherable usb interfaces. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableUsbRegexs() { @@ -1647,12 +1644,12 @@ public class ConnectivityManager { * Get the list of regular expressions that define any tetherable * Wifi network interfaces. If Wifi tethering is not supported by the * device, this list should be empty. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an array of 0 or more regular expression Strings defining * what interfaces are considered tetherable wifi interfaces. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableWifiRegexs() { @@ -1667,12 +1664,12 @@ public class ConnectivityManager { * Get the list of regular expressions that define any tetherable * Bluetooth network interfaces. If Bluetooth tethering is not supported by the * device, this list should be empty. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return an array of 0 or more regular expression Strings defining * what interfaces are considered tetherable bluetooth interfaces. * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableBluetoothRegexs() { @@ -1689,12 +1686,12 @@ public class ConnectivityManager { * attempt to switch to Rndis and subsequently tether the resulting * interface on {@code true} or turn off tethering and switch off * Rndis on {@code false}. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * * @param enable a boolean - {@code true} to enable tethering * @return error a {@code TETHER_ERROR} value indicating success or failure type * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int setUsbTethering(boolean enable) { @@ -1731,13 +1728,13 @@ public class ConnectivityManager { /** * Get a more detailed error code after a Tethering or Untethering * request asynchronously failed. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param iface The name of the interface of interest * @return error The error code of the last error tethering or untethering the named * interface * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public int getLastTetherError(String iface) { @@ -1751,12 +1748,11 @@ public class ConnectivityManager { /** * Report network connectivity status. This is currently used only * to alter status bar UI. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#STATUS_BAR}. * * @param networkType The type of network you want to report on * @param percentage The quality of the connection 0 is bad, 100 is good - * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#STATUS_BAR}. * {@hide} */ public void reportInetCondition(int networkType, int percentage) { @@ -1886,12 +1882,11 @@ public class ConnectivityManager { * for typical HTTP proxies - they are general network dependent. However if you're * doing something unusual like general internal filtering this may be useful. On * a private network where the proxy is not accessible, you may break HTTP using this. - * - * @param p The a {@link ProxyInfo} object defining the new global - * HTTP proxy. A {@code null} value will clear the global HTTP proxy. - * * <p>This method requires the caller to hold the permission * android.Manifest.permission#CONNECTIVITY_INTERNAL. + * + * @param p A {@link ProxyInfo} object defining the new global + * HTTP proxy. A {@code null} value will clear the global HTTP proxy. * @hide */ public void setGlobalProxy(ProxyInfo p) { @@ -1958,12 +1953,12 @@ public class ConnectivityManager { * hardware supports it. For example a GSM phone without a SIM * should still return {@code true} for mobile data, but a wifi only * tablet would return {@code false}. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param networkType The network type we'd like to check * @return {@code true} if supported, else {@code false} * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * @hide */ public boolean isNetworkSupported(int networkType) { @@ -1980,12 +1975,11 @@ public class ConnectivityManager { * battery/performance issues. You should check this before doing large * data transfers, and warn the user or delay the operation until another * network is available. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @return {@code true} if large transfers should be avoided, otherwise * {@code false}. - * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public boolean isActiveNetworkMetered() { try { @@ -2015,13 +2009,12 @@ public class ConnectivityManager { /** * Signal that the captive portal check on the indicated network * is complete and whether its a captive portal or not. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * * @param info the {@link NetworkInfo} object for the networkType * in question. * @param isCaptivePortal true/false. - * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * {@hide} */ public void captivePortalCheckCompleted(NetworkInfo info, boolean isCaptivePortal) { @@ -2093,11 +2086,11 @@ public class ConnectivityManager { /** * Set the value for enabling/disabling airplane mode + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * * @param enable whether to enable airplane mode or not * - * <p>This method requires the caller to hold the permission - * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * @hide */ public void setAirplaneMode(boolean enable) { @@ -2438,6 +2431,8 @@ public class ConnectivityManager { * Status of the request can be followed by listening to the various * callbacks described in {@link NetworkCallback}. The {@link Network} * can be used to direct traffic to the network. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * * @param request {@link NetworkRequest} describing this request. * @param networkCallback The {@link NetworkCallback} to be utilized for this @@ -2457,6 +2452,8 @@ public class ConnectivityManager { * network is not found within the given time (in milliseconds) the * {@link NetworkCallback#unavailable} callback is called. The request must * still be released normally by calling {@link releaseNetworkRequest}. + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * @param request {@link NetworkRequest} describing this request. * @param networkCallback The callbacks to be utilized for this request. Note * the callbacks must not be shared - they uniquely specify @@ -2522,7 +2519,8 @@ public class ConnectivityManager { * <p> * The request may be released normally by calling * {@link #releaseNetworkRequest(android.app.PendingIntent)}. - * + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * @param request {@link NetworkRequest} describing this request. * @param operation Action to perform when the network is available (corresponds * to the {@link NetworkCallback#onAvailable} call. Typically @@ -2563,6 +2561,8 @@ public class ConnectivityManager { * Registers to receive notifications about all networks which satisfy the given * {@link NetworkRequest}. The callbacks will continue to be called until * either the application exits or {@link #unregisterNetworkCallback} is called + * <p>This method requires the caller to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * * @param request {@link NetworkRequest} describing this request. * @param networkCallback The {@link NetworkCallback} that the system will call as suitable diff --git a/core/java/android/preference/RingtonePreference.java b/core/java/android/preference/RingtonePreference.java index 488a0c49108a..a76bb0953cc1 100644 --- a/core/java/android/preference/RingtonePreference.java +++ b/core/java/android/preference/RingtonePreference.java @@ -19,6 +19,7 @@ package android.preference; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; +import android.media.AudioAttributes; import android.media.RingtoneManager; import android.net.Uri; import android.provider.Settings.System; @@ -169,6 +170,8 @@ public class RingtonePreference extends Preference implements ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, mShowSilent); ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, mRingtoneType); ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, getTitle()); + ringtonePickerIntent.putExtra(RingtoneManager.EXTRA_RINGTONE_AUDIO_ATTRIBUTES_FLAGS, + AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY); } /** diff --git a/core/java/android/service/chooser/ChooserTargetService.java b/core/java/android/service/chooser/ChooserTargetService.java index 0d1834a50b44..a3bfeced361c 100644 --- a/core/java/android/service/chooser/ChooserTargetService.java +++ b/core/java/android/service/chooser/ChooserTargetService.java @@ -44,7 +44,7 @@ import java.util.List; * the {@link android.Manifest.permission#BIND_CHOOSER_TARGET_SERVICE} permission * and include an intent filter with the {@link #SERVICE_INTERFACE} action. For example:</p> * <pre> - * <service android:name=".ChooserTargetService" + * <service android:name=".MyChooserTargetService" * android:label="@string/service_name" * android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"> * <intent-filter> @@ -69,7 +69,7 @@ import java.util.List; * <action android:name="android.intent.action.SEND" /> * </intent-filter> * <meta-data android:name="android.service.chooser.chooser_target_service" - * android:value=".ChooserTargetService" /> + * android:value=".MyChooserTargetService" /> * </activity> * </pre> */ diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 41f906aeae16..e59560fa1769 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -66,6 +66,7 @@ import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; import android.view.accessibility.AccessibilityManager.HighTextContrastChangeListener; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.view.accessibility.AccessibilityNodeProvider; import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; @@ -6354,16 +6355,18 @@ public final class ViewRootImpl implements ViewParent, * {@link AccessibilityEvent#TYPE_WINDOW_CONTENT_CHANGED} */ private void handleWindowContentChangedEvent(AccessibilityEvent event) { - // No virtual view focused, nothing to do here. - if (mAccessibilityFocusedHost == null || mAccessibilityFocusedVirtualView == null) { + final View focusedHost = mAccessibilityFocusedHost; + if (focusedHost == null || mAccessibilityFocusedVirtualView == null) { + // No virtual view focused, nothing to do here. return; } - // If we have a node but no provider, abort. - final AccessibilityNodeProvider provider = - mAccessibilityFocusedHost.getAccessibilityNodeProvider(); + final AccessibilityNodeProvider provider = focusedHost.getAccessibilityNodeProvider(); if (provider == null) { - // TODO: Should we clear the focused virtual view? + // Error state: virtual view with no provider. Clear focus. + mAccessibilityFocusedHost = null; + mAccessibilityFocusedVirtualView = null; + focusedHost.clearAccessibilityFocusNoCallbacks(); return; } @@ -6410,10 +6413,23 @@ public final class ViewRootImpl implements ViewParent, final Rect oldBounds = mTempRect; mAccessibilityFocusedVirtualView.getBoundsInScreen(oldBounds); mAccessibilityFocusedVirtualView = provider.createAccessibilityNodeInfo(focusedChildId); - final Rect newBounds = mAccessibilityFocusedVirtualView.getBoundsInScreen(); - if (!oldBounds.equals(newBounds)) { - oldBounds.union(newBounds); + if (mAccessibilityFocusedVirtualView == null) { + // Error state: The node no longer exists. Clear focus. + mAccessibilityFocusedHost = null; + focusedHost.clearAccessibilityFocusNoCallbacks(); + + // This will probably fail, but try to keep the provider's internal + // state consistent by clearing focus. + provider.performAction(focusedChildId, + AccessibilityAction.ACTION_CLEAR_ACCESSIBILITY_FOCUS.getId(), null); invalidateRectOnScreen(oldBounds); + } else { + // The node was refreshed, invalidate bounds if necessary. + final Rect newBounds = mAccessibilityFocusedVirtualView.getBoundsInScreen(); + if (!oldBounds.equals(newBounds)) { + oldBounds.union(newBounds); + invalidateRectOnScreen(oldBounds); + } } } diff --git a/docs/html/tools/support-library/features.jd b/docs/html/tools/support-library/features.jd index 573baad98d83..926578aec95a 100644 --- a/docs/html/tools/support-library/features.jd +++ b/docs/html/tools/support-library/features.jd @@ -22,6 +22,8 @@ page.title=Support Library Features <li><a href="#v8">v8 Support Library</a></li> <li><a href="#v13">v13 Support Library</a></li> <li><a href="#v17-leanback">v17 Leanback Library</a></li> + <li><a href="#annotations">Annotations Support Library</a></li> + <li><a href="#design">Design Support Library</a></li> </ol> <h2>See also</h2> @@ -131,11 +133,11 @@ page.title=Support Library Features API reference. </p> -<p>This library is located in the {@code <sdk>/extras/android/support/v4/} directory after - you download the Android Support Libraries. The library does not contain user interface - resources. To include it in your application project, follow the instructions for - <a href="{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without - resources</a>.</p> +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/v4/} directory. The library does not contain user +interface resources. To include it in your application project, follow the instructions for +<a href="{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without +resources</a>.</p> <p class="caution"><strong>Caution:</strong> Using dynamic dependencies, especially for higher version numbers, can cause unexpected version updates and regression incompatibilities.</p> @@ -158,10 +160,11 @@ com.android.support:support-v4:21.0.0 </p> <p> - This library is located in the {@code <sdk>/extras/android/support/multidex/} directory - after you download the Android Support Libraries. The library does not contain user interface - resources. To include it in your application project, follow the instructions for <a href= - "{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without + After you download the Android Support Libraries, this library is located in the + {@code <sdk>/extras/android/support/multidex/} directory. The library does not contain + user interface resources. To include it in your application project, follow the instructions + for + <a href= "{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without resources</a>. </p> @@ -218,11 +221,11 @@ com.android.support:multidex:1.0.0 </li> </ul> -<p>This library is located in the {@code <sdk>/extras/android/support/v7/appcompat/} - directory after you download the Android Support Libraries. The library contains user - interface resources. To include it in your application project, follow the instructions for - <a href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries with - resources</a>.</p> +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/v7/appcompat/} directory. The library contains user +interface resources. To include it in your application project, follow the instructions for +<a href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries with +resources</a>.</p> <p>The Gradle build script dependency identifier for this library is as follows:</p> @@ -239,9 +242,8 @@ widget, which lets you show information inside cards that have a consistent look on any app. These cards are useful for material design implementations, and are used extensively in layouts for TV apps.</p> -<p>This library is located in the -{@code <sdk>/extras/android/support/v7/cardview/} directory after you -download the Android Support Libraries. The library contains user interface +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/v7/cardview/} directory. The library contains user interface resources. To include it in your application project, follow the instructions for <a href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries with resources</a>.</p> @@ -256,13 +258,14 @@ com.android.support:cardview-v7:21.0.0 <h3 id="v7-gridlayout">v7 gridlayout library</h3> -<p>This library adds support for the {@link android.support.v7.widget.GridLayout} class, which - allows you to arrange user interface elements using a grid of rectangular cells. - For detailed information about the v7 gridlayout library APIs, see the - {@link android.support.v7.widget android.support.v7.widget} package in the API reference.</p> +<p>After you download the Android Support Libraries, this library adds support for the +{@link android.support.v7.widget.GridLayout} class, which +allows you to arrange user interface elements using a grid of rectangular cells. +For detailed information about the v7 gridlayout library APIs, see the +{@link android.support.v7.widget android.support.v7.widget} package in the API reference.</p> <p>This library is located in the {@code <sdk>/extras/android/support/v7/gridlayout/} - directory after you download the Android Support Libraries. The library contains user + directory . The library contains user interface resources. To include it in your application project, follow the instructions for <a href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries with resources</a>.</p> @@ -323,12 +326,11 @@ prominent colors from an image. For example, a music app could use a from an album cover, and use those colors to build a color-coordinated song title card.</p> -<p>This library is located in the -{@code <sdk>/extras/android/support/v7/palette/} directory after - you download the Android Support Libraries. The library does not contain user interface - resources. To include it in your application project, follow the instructions for - <a href="{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without - resources</a>.</p> +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/v7/palette/} directory. The library does not contain +user interface resources. To include it in your application project, follow the instructions for +<a href="{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without +resources</a>.</p> <p>The Gradle build script dependency identifier for this library is as follows:</p> @@ -346,10 +348,9 @@ class. This class provides support for the widget</a>, a view for efficiently displaying large data sets by providing a limited window of data items.</p> -<p>This library is located in the -{@code <sdk>/extras/android/support/v7/recyclerview/} directory after you -download the Android Support Libraries. The library contains user interface -resources. To include it in your application project, follow the instructions +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/v7/recyclerview/} directory. The library contains +user interface resources. To include it in your application project, follow the instructions for <a href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries with resources</a>.</p> @@ -363,6 +364,12 @@ com.android.support:recyclerview-v7:21.0.0 <h2 id="v8">v8 Support Library</h2> +<p>This library is designed to be used with Android 2.2 (API level 8) and higher. + This library provides specific feature sets and can be included in your application + independently from other libraries.</p> + +<h3 id="v8-renderscript">v8 renderscript library</h3> + <p>This library is designed to be used with Android (API level 8) and higher. It adds support for the <a href="{@docRoot}guide/topics/renderscript/compute.html">RenderScript</a> computation framework. These APIs are included in the {@link android.support.v8.renderscript} package. You @@ -374,9 +381,20 @@ com.android.support:recyclerview-v7:21.0.0 <p class="note"> <strong>Note:</strong> Use of RenderScript with the support library is supported with Android - Studio and Gradle-based builds, as well as the Eclipse plugin and Ant build tools. + Studio and Gradle-based builds, as well as the Eclipse plugin and Ant build tools. The + renderscript library is located in the <code>build-tools/$VERSION/renderscript/</code> folder. </p> +<p>The following example shows the Gradle build script properties for this library:</p> + +<pre> +defaultConfig { + renderscriptTargetApi 18 + renderscriptSupportModeEnabled true +} +</pre> + + <h2 id="v13">v13 Support Library</h2> @@ -389,11 +407,11 @@ com.android.support:recyclerview-v7:21.0.0 android.support.v13} package in the API reference. </p> -<p>This library is located in the {@code <sdk>/extras/android/support/v13/} directory after - you download the Android Support Libraries. The library does not contain user interface - resources. To include it in your application project, follow the instructions for - <a href="{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without - resources</a>.</p> +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/v13/} directory. The library does not contain user +interface resources. To include it in your application project, follow the instructions for +<a href="{@docRoot}tools/support-library/setup.html#libs-without-res">Adding libraries without +resources</a>.</p> <p>The Gradle build script dependency identifier for this library is as follows:</p> @@ -429,9 +447,8 @@ com.android.support:support-v13:18.0.0 into a {@link android.support.v17.leanback.app.RowsFragment}.</li> </ul> -<p>This library is located in the -{@code <sdk>/extras/android/support/v17/leanback} directory after -you download the Android Support Libraries. For more information +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/v17/leanback} directory. For more information on how to set up your project, follow the instructions in <a href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries with resources</a>. </p> @@ -444,3 +461,48 @@ com.android.support:leanback-v17:21.0.0 +<h2 id="annotations">Annotations Support Library</h2> + +<p>The <a href="{@docRoot}reference/android/support/annotation/package-summary.html">Annotation</a> +package provides APIs to support adding annotation metadata to your apps. </p> + +<p></p> + +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/annotations} directory. For more information +on how to set up your project, follow the instructions in <a +href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries +with resources</a>. </p> + +<p>The Gradle build script dependency identifier for this library is as follows:</p> + +<pre> +com.android.support:support-annotations:22.0.0 +</pre> + + + +<h2 id="design">Design Support Library</h2> + +<p>The +<a href="{@docRoot}reference/android/support/design/package-summary.html">Design</a> package +provides APIs to support adding material design components and patterns to your apps. </p> + +<p>The Design Support library adds support for various material design components and patterns for +app developers to build upon, such as navigation drawers, floating action buttons (<i>FAB</i>), +snackbars, and <a href="{@docRoot}design/building-blocks/tabs.html">tabs</a>. </p> + + +<p>After you download the Android Support Libraries, this library is located in the +{@code <sdk>/extras/android/support/design} directory. For more information +on how to set up your project, follow the instructions in <a +href="{@docRoot}tools/support-library/setup.html#libs-with-res">Adding libraries +with resources</a>. </p> + +<p>The Gradle build script dependency identifier for this library is as follows:</p> + +<pre> +com.android.support:support-design:22.0.0 +</pre> + + diff --git a/docs/html/tools/support-library/index.jd b/docs/html/tools/support-library/index.jd index 98c9ad54b570..1dad6b808597 100644 --- a/docs/html/tools/support-library/index.jd +++ b/docs/html/tools/support-library/index.jd @@ -59,13 +59,187 @@ page.title=Support Library <p>This section provides details about the Support Library package releases.</p> -<div class="toggle-content opened"> +<div class="toggle-content open"> <p id="rev21"><a href="#" onclick="return toggleContent(this)"> - <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" alt="" + <img src="{@docRoot}assets/images/triangle-open.png" class="toggle-content-img" alt="" +/>Android Support Library, revision 22.2.0</a> <em>(May 2015)</em> + </p> + <div class="toggle-content-toggleme"> + <dl> + <dt>Added <a href="features.html#design">Design Support library:</a></dt> + <dd> + <ul> + <li>Added {@link android.support.design.widget.TextInputLayout} for showing + {@link android.widget.EditText} hint and error text as floating labels. + </li> + <li>Added {@link android.support.design.widget.FloatingActionButton} for implementing a + primary action on your interface as a + floating action button, supporting either default or mini sizes. + </li> + <li>Added {@link android.support.design.widget.Snackbar} for providing lightweight + feedback with an optional action in an animated snackbar. + </li> + <li>Added {@link android.support.design.widget.TabLayout} for implementing fixed and + scrollable + <a href="{@docRoot}design/building-blocks/tabs.html">tabs</a> as well as easy + integration with + {@link android.support.v4.view.ViewPager}. + </li> + <li>Added {@link android.support.design.widget.NavigationView} for implementing + <a href="{@docRoot}design/patterns/navigation-drawer.html">navigation drawer</a> + contents, including the ability to inflate menu items via a + <a href="{@docRoot}guide/topics/resources/menu-resource.html">Menu Resource</a>. + </li> + <li>Added {@link android.support.design.widget.CoordinatorLayout}, a general purpose + layout, used for building dependencies between + sibling views and allowing easy scrolling reactions between components via + {@link android.support.design.widget.CoordinatorLayout.Behavior}. Many of the Design + Library components rely on being a child of a + {@link android.support.design.widget.CoordinatorLayout}. + </li> + <li>Added {@link android.support.design.widget.AppBarLayout}, a container for a + {@link android.widget.Toolbar} + and other views (such as {@link android.support.design.widget.TabLayout}) for + reacting to scrolling events by scrolling off the screen, becoming visible in reaction + to a downward scroll, or collapsing/uncollapsing before scrolling off/onto the screen. + </li> + <li>Added {@link android.support.design.widget.CollapsingToolbarLayout} for controlling + how a {@link android.widget.Toolbar} collapses. A toolbar may collapse by: + pinning components to the top of the screen while it collapses, introducing + parallax scrolling of components such as an {@link android.widget.ImageView}, + or adding a content scrim color when the view is partially collapsed. + </li> + </ul> + </dt> + + + + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> + <dd> + <ul> + + <li>Added the +{@link android.support.v4.view.accessibility.AccessibilityEventCompat#getContentChangeTypes getContentChangeTypes()} + and +{@link android.support.v4.view.accessibility.AccessibilityEventCompat#setContentChangeTypes setContentChangeTypes()} + methods and related change type + fields to the + {@link android.support.v4.view.accessibility.AccessibilityEventCompat} + class for accessibility event handling. + </li> + <li>Added the +{@link android.support.v4.media.session.PlaybackStateCompat#getActiveQueueItemId getActiveQueueItemId()}, +{@link android.support.v4.media.session.PlaybackStateCompat#getCustomActions getCustomActions()}, + and + {@link android.support.v4.media.session.PlaybackStateCompat#getExtras getExtras()} + methods with related state fields to the + {@link android.support.v4.media.session.PlaybackStateCompat} class for + getting custom actions from the queue. + </li> + <li>Added the +{@link android.support.v4.media.session.PlaybackStateCompat.Builder#addCustomAction addCustomAction()}, +{@link android.support.v4.media.session.PlaybackStateCompat.Builder#addCustomAction addCustomAction()}, +{@link android.support.v4.media.session.PlaybackStateCompat.Builder#setActiveQueueItemId setActiveQueueItemId()}, + and + {@link android.support.v4.media.session.PlaybackStateCompat.Builder#setExtras setExtras()} + methods to the + {@link android.support.v4.media.session.PlaybackStateCompat.Builder} class for adding + adding custom actions to a playback state. + </li> + <li>Added the +{@link android.support.v4.media.session.PlaybackStateCompat.CustomAction#fromCustomAction fromCustomAction()} and +{@link android.support.v4.media.session.PlaybackStateCompat.CustomAction#getCustomAction getCustomAction()} methods + to the + {@link android.support.v4.media.session.PlaybackStateCompat.CustomAction} class + for getting custom actions from the queue. + </li> + <li>Added the {@link android.support.v4.view.ViewCompat#isAttachedToWindow isAttachedToWindow()}, + {@link android.support.v4.view.ViewCompat#offsetLeftAndRight offsetLeftAndRight()}, and + {@link android.support.v4.view.ViewCompat#offsetTopAndBottom offsetTopAndBottom()} + methods to the {@link android.support.v4.view.ViewCompat} class for working with views. + </li> + <li>Added the {@link android.support.v4.view.ViewPager#addOnPageChangeListener addOnPageChangeListener()}, + {@link android.support.v4.view.ViewPager#clearOnPageChangeListeners clearOnPageChangeListeners()}, and + {@link android.support.v4.view.ViewPager#removeOnPageChangeListener removeOnPageChangeListener()} + methods to the {@link android.support.v4.view.ViewPager} class for responding to page + changes. + <p>Deprecated the + {@link android.support.v4.view.ViewPager#setOnPageChangeListener setOnPageChangeListener()} method.</p> + </li> + <li>Added the +{@link android.support.v4.view.ViewParentCompat#notifySubtreeAccessibilityStateChanged notifySubtreeAccessibilityStateChanged()} method to + the {@link android.support.v4.view.ViewParentCompat} class for notifying a view parent + that the accessibility state of one of its descendants has changed. + </li> + <li>Added the {@link android.support.v4.view.ViewPropertyAnimatorCompat#translationZ translationZ()}, + {@link android.support.v4.view.ViewPropertyAnimatorCompat#translationZBy translationZBy()}, + {@link android.support.v4.view.ViewPropertyAnimatorCompat#z z()}, and + {@link android.support.v4.view.ViewPropertyAnimatorCompat#zBy zBy()} + methods to the {@link android.support.v4.view.ViewPropertyAnimatorCompat} class for + adding animation. + </li> + </ul> + </dd> + + + +<dt>Changes for <a href="features.html#v7-appcompat">v7 appcompat library</a>:</dt> + <dd> +<ul> + <li>Added the + {@link android.support.v7.app.AppCompatActivity#onWindowStartingSupportActionMode onWindowStartingSupportActionMode()} + method to the + {@link android.support.v7.app.AppCompatActivity}, + {@link android.support.v7.app.AppCompatCallback}, and + {@link android.support.v7.app.AppCompatDialog} classes for handling action modes + started from the current window. + </li> + + <li>Added the +{@link android.support.v7.app.AppCompatDelegate#isHandleNativeActionModesEnabled isHandleNativeActionModesEnabled()} and +{@link android.support.v7.app.AppCompatDelegate#setHandleNativeActionModesEnabled setHandleNativeActionModesEnabled()} + methods to the + {@link android.support.v7.app.AppCompatDelegate} class for handling native action modes. + </li> + </ul> + </dd> + + + </dl> + + </div> +</div> <!-- end of collapsible section --> + + + + + +<div class="toggle-content closed"> + <p id="rev21"><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" alt="" />Android Support Library, revision 22.1.0</a> <em>(April 2015)</em> </p> + + + + <div class="toggle-content-toggleme"> + <dl> + + <div class="toggle-content-toggleme"> <dl> + <dt>Changes for <a href="features.html#annotations">annotations library:</a></dt> + <dd> + <ul> + <li>Added the Annotations library to provide support for enhanced code inspections. + Annotations are added as metadata tags that you attach to variables, parameters, + and return values to inspect method return values, passed parameters, and local + variables and fields. + </li> + </ul> + </dd> + + <dt>Changes for <a href="features.html#v4">v4 support library:</a></dt> <dd> <ul> @@ -132,7 +306,7 @@ page.title=Support Library <li>Updated the {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} class to add methods for errors, content invalidation and labels. </li> - <li>Added the following interpolation classses for animation: + <li>Added the following interpolation classes for animation: {@link android.support.v4.view.animation.FastOutLinearInInterpolator}, {@link android.support.v4.view.animation.FastOutSlowInInterpolator}, {@link android.support.v4.view.animation.LinearOutSlowInInterpolator}, @@ -245,7 +419,7 @@ page.title=Support Library </dd> - <dt>Changes for v8 renderscript library:</dt> + <dt>Changes for <a href="features.html#v8-renderscript">v8 renderscript library</a>:</dt> <dd> <ul> <li>Added the {@link android.support.v8.renderscript.ScriptIntrinsicHistogram} class for @@ -643,7 +817,7 @@ page.title=Support Library </ul> </dd> - <dt>Changes for v8 renderscript library:</dt> + <dt>Changes for <a href="features.html#v8-renderscript">v8 renderscript library</a></dt> <dd> <ul> <li>Added error propagation for the RenderScript thunking layer.</li> diff --git a/keystore/java/android/security/KeyStoreParameter.java b/keystore/java/android/security/KeyStoreParameter.java index 174e03f842da..66c87ed2ec1e 100644 --- a/keystore/java/android/security/KeyStoreParameter.java +++ b/keystore/java/android/security/KeyStoreParameter.java @@ -19,7 +19,6 @@ package android.security; import android.annotation.NonNull; import android.app.KeyguardManager; import android.content.Context; -import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProtection; import java.security.KeyPairGenerator; @@ -49,28 +48,14 @@ import java.security.KeyStore.ProtectionParameter; */ @Deprecated public final class KeyStoreParameter implements ProtectionParameter { - private final Context mContext; private final int mFlags; private KeyStoreParameter( - Context context, int flags) { - if (context == null) { - throw new IllegalArgumentException("context == null"); - } - - mContext = context; mFlags = flags; } /** - * Gets the Android context used for operations with this instance. - */ - public Context getContext() { - return mContext; - } - - /** * @hide */ public int getFlags() { @@ -115,7 +100,6 @@ public final class KeyStoreParameter implements ProtectionParameter { */ @Deprecated public final static class Builder { - private final Context mContext; private int mFlags; /** @@ -128,7 +112,6 @@ public final class KeyStoreParameter implements ProtectionParameter { if (context == null) { throw new NullPointerException("context == null"); } - mContext = context; } /** @@ -163,7 +146,6 @@ public final class KeyStoreParameter implements ProtectionParameter { @NonNull public KeyStoreParameter build() { return new KeyStoreParameter( - mContext, mFlags); } } diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index 223bdf06dca9..d9b40aebe775 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -439,13 +439,6 @@ bool LayerRenderer::copyLayer(RenderState& renderState, Layer* layer, SkBitmap* renderer.translate(0.0f, bitmap->height()); renderer.scale(1.0f, -1.0f); - mat4 texTransform(layer->getTexTransform()); - - mat4 invert; - invert.translate(0.0f, 1.0f); - invert.scale(1.0f, -1.0f, 1.0f); - layer->getTexTransform().multiply(invert); - if ((error = glGetError()) != GL_NO_ERROR) goto error; { @@ -459,7 +452,6 @@ bool LayerRenderer::copyLayer(RenderState& renderState, Layer* layer, SkBitmap* if ((error = glGetError()) != GL_NO_ERROR) goto error; } - layer->getTexTransform().load(texTransform); status = true; } diff --git a/packages/StatementService/src/com/android/statementservice/retriever/Relation.java b/packages/StatementService/src/com/android/statementservice/retriever/Relation.java index 91218c641a9d..124f46d496f9 100644 --- a/packages/StatementService/src/com/android/statementservice/retriever/Relation.java +++ b/packages/StatementService/src/com/android/statementservice/retriever/Relation.java @@ -30,16 +30,12 @@ import java.util.regex.Pattern; * <p> We may add other kinds in the future. * * <p> The detail field is a lowercase alphanumeric string with underscores and periods allowed - * (matching the regex [a-z0-9_.]+), but otherwise unstructured. It is also possible to specify '*' - * (the wildcard character) as the detail if the relation applies to any detail in the specified - * kind. + * (matching the regex [a-z0-9_.]+), but otherwise unstructured. */ public final class Relation { private static final Pattern KIND_PATTERN = Pattern.compile("^[a-z0-9_.]+$"); - private static final Pattern DETAIL_PATTERN = Pattern.compile("^([a-z0-9_.]+|[*])$"); - - private static final String MATCH_ALL_DETAILS = "*"; + private static final Pattern DETAIL_PATTERN = Pattern.compile("^([a-z0-9_.]+)$"); private final String mKind; private final String mDetail; @@ -92,12 +88,10 @@ public final class Relation { } /** - * Returns true if {@code relation} has the same kind and detail. If {@code - * relation.getDetail()} is wildcard (*) then returns true if the kind is the same. + * Returns true if {@code relation} has the same kind and detail. */ public boolean matches(Relation relation) { - return getKind().equals(relation.getKind()) && (getDetail().equals(MATCH_ALL_DETAILS) - || getDetail().equals(relation.getDetail())); + return getKind().equals(relation.getKind()) && getDetail().equals(relation.getDetail()); } /** diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index 9504ea37bb05..9bc5b75632f7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -326,7 +326,7 @@ public class WifiTile extends QSTile<QSTile.SignalState> { item.tag = ap; item.icon = mWifiController.getIcon(ap); item.line1 = ap.getSsid(); - item.line2 = ap.getSummary(); + item.line2 = ap.isActive() ? ap.getSummary() : null; item.overlay = ap.getSecurity() != AccessPoint.SECURITY_NONE ? mContext.getDrawable(R.drawable.qs_ic_wifi_lock) : null; 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 50cdbb697b62..1e4aa61fd1b8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -745,7 +745,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, mHandlerThread.start(); // Other icons - mLocationController = new LocationControllerImpl(mContext); // will post a notification + mLocationController = new LocationControllerImpl(mContext, + mHandlerThread.getLooper()); // will post a notification mBatteryController = new BatteryController(mContext); mBatteryController.addStateChangedCallback(new BatteryStateChangeCallback() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java index d8d70423b4cc..93a8fd8ed343 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationControllerImpl.java @@ -26,6 +26,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.location.LocationManager; import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -56,31 +58,21 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio private ArrayList<LocationSettingsChangeCallback> mSettingsChangeCallbacks = new ArrayList<LocationSettingsChangeCallback>(); + private final H mHandler = new H(); - public LocationControllerImpl(Context context) { + public LocationControllerImpl(Context context, Looper bgLooper) { mContext = context; + // Register to listen for changes in location settings. IntentFilter filter = new IntentFilter(); filter.addAction(LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION); - context.registerReceiverAsUser(this, UserHandle.ALL, filter, null, null); + filter.addAction(LocationManager.MODE_CHANGED_ACTION); + context.registerReceiverAsUser(this, UserHandle.ALL, filter, null, new Handler(bgLooper)); mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mStatusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE); - // Register to listen for changes in location settings. - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(LocationManager.MODE_CHANGED_ACTION); - context.registerReceiverAsUser(new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (LocationManager.MODE_CHANGED_ACTION.equals(action)) { - locationSettingsChanged(); - } - } - }, UserHandle.ALL, intentFilter, null, new Handler()); - // Examine the current location state and initialize the status view. updateActiveLocationRequests(); refreshViews(); @@ -91,7 +83,7 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio */ public void addSettingsChangedCallback(LocationSettingsChangeCallback cb) { mSettingsChangeCallbacks.add(cb); - locationSettingsChanged(cb); + mHandler.sendEmptyMessage(H.MSG_LOCATION_SETTINGS_CHANGED); } public void removeSettingsChangedCallback(LocationSettingsChangeCallback cb) { @@ -181,8 +173,8 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio // Updates the status view based on the current state of location requests. private void refreshViews() { if (mAreActiveLocationRequests) { - mStatusBarManager.setIcon(LOCATION_STATUS_ICON_PLACEHOLDER, LOCATION_STATUS_ICON_ID, 0, - mContext.getString(R.string.accessibility_location_active)); + mStatusBarManager.setIcon(LOCATION_STATUS_ICON_PLACEHOLDER, LOCATION_STATUS_ICON_ID, + 0, mContext.getString(R.string.accessibility_location_active)); } else { mStatusBarManager.removeIcon(LOCATION_STATUS_ICON_PLACEHOLDER); } @@ -197,22 +189,33 @@ public class LocationControllerImpl extends BroadcastReceiver implements Locatio } } - private void locationSettingsChanged() { - boolean isEnabled = isLocationEnabled(); - for (LocationSettingsChangeCallback cb : mSettingsChangeCallbacks) { - cb.onLocationSettingsChanged(isEnabled); - } - } - - private void locationSettingsChanged(LocationSettingsChangeCallback cb) { - cb.onLocationSettingsChanged(isLocationEnabled()); - } - @Override public void onReceive(Context context, Intent intent) { final String action = intent.getAction(); if (LocationManager.HIGH_POWER_REQUEST_CHANGE_ACTION.equals(action)) { updateActiveLocationRequests(); + } else if (LocationManager.MODE_CHANGED_ACTION.equals(action)) { + mHandler.sendEmptyMessage(H.MSG_LOCATION_SETTINGS_CHANGED); + } + } + + private final class H extends Handler { + private static final int MSG_LOCATION_SETTINGS_CHANGED = 1; + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_LOCATION_SETTINGS_CHANGED: + locationSettingsChanged(); + break; + } + } + + private void locationSettingsChanged() { + boolean isEnabled = isLocationEnabled(); + for (LocationSettingsChangeCallback cb : mSettingsChangeCallbacks) { + cb.onLocationSettingsChanged(isEnabled); + } } } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 7ac26556b995..edca4b87842e 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3640,6 +3640,7 @@ public class ConnectivityService extends IConnectivityManager.Stub @Override public void releasePendingNetworkRequest(PendingIntent operation) { + checkNotNull(operation, "PendingIntent cannot be null."); mHandler.sendMessage(mHandler.obtainMessage(EVENT_RELEASE_NETWORK_REQUEST_WITH_INTENT, getCallingUid(), 0, operation)); } diff --git a/services/net/java/android/net/dhcp/DhcpClient.java b/services/net/java/android/net/dhcp/DhcpClient.java index e1d17879748b..316496f15cf6 100644 --- a/services/net/java/android/net/dhcp/DhcpClient.java +++ b/services/net/java/android/net/dhcp/DhcpClient.java @@ -225,17 +225,18 @@ public class DhcpClient extends BaseDhcpStateMachine { * {@code CONNECTIVITY_INTERNAL} permission. * * @param cmdName the name of the command. The intent's action will be - * {@code android.net.dhcp.DhcpClient.<cmdName>} + * {@code android.net.dhcp.DhcpClient.<mIfaceName>.<cmdName>} * @param cmd the command to send to the state machine when the PendingIntent is triggered. * @return the PendingIntent */ private PendingIntent createStateMachineCommandIntent(final String cmdName, final int cmd) { - String action = DhcpClient.class.getName() + "." + cmdName; + String action = DhcpClient.class.getName() + "." + mIfaceName + "." + cmdName; - // TODO: figure out what values to pass to intent.setPackage() and intent.setClass() that - // result in the Intent being received by this class and nowhere else, and use them. Intent intent = new Intent(action, null) .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + // TODO: The intent's package covers the whole of the system server, so it's pretty generic. + // Consider adding some sort of token as well. + intent.setPackage(mContext.getPackageName()); PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, cmd, intent, 0); mContext.registerReceiver( diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 0a5b66863023..6de887ba4ceb 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -248,6 +248,12 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne } void shutdownLocked() { + // If there is an active session, cancel it to allow it to clean up its window and other + // state. + if (mActiveSession != null) { + mActiveSession.cancel(); + mActiveSession = null; + } try { if (mService != null) { mService.shutdown(); |