diff options
Diffstat (limited to 'core')
85 files changed, 880 insertions, 263 deletions
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 1f44e49..3a04c27 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -62,7 +62,7 @@ public class ConnectivityManager { * NetworkInfo for the new network is also passed as an extra. This lets * any receivers of the broadcast know that they should not necessarily * tell the user that no data traffic will be possible. Instead, the - * reciever should expect another broadcast soon, indicating either that + * receiver should expect another broadcast soon, indicating either that * the failover attempt succeeded (and so there is still overall data * connectivity), or that the failover attempt failed, meaning that all * connectivity has been lost. @@ -151,8 +151,8 @@ public class ConnectivityManager { /** * Broadcast action to indicate the change of data activity status * (idle or active) on a network in a recent period. - * The network becomes active when data transimission is started, or - * idle if there is no data transimition for a period of time. + * The network becomes active when data transmission is started, or + * idle if there is no data transmission for a period of time. * {@hide} */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @@ -205,8 +205,12 @@ public class ConnectivityManager { "android.net.conn.INET_CONDITION_ACTION"; /** - * Broadcast Action: A tetherable connection has come or gone - * TODO - finish the doc + * Broadcast Action: A tetherable connection has come or gone. + * Uses {@code ConnectivityManager.EXTRA_AVAILABLE_TETHER}, + * {@code ConnectivityManager.EXTRA_ACTIVE_TETHER} and + * {@code ConnectivityManager.EXTRA_ERRORED_TETHER} to indicate + * the current state of tethering. Each include a list of + * interface names in that state (may be empty). * @hide */ @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) @@ -215,19 +219,23 @@ public class ConnectivityManager { /** * @hide - * gives a String[] + * gives a String[] listing all the interfaces configured for + * tethering and currently available for tethering. */ public static final String EXTRA_AVAILABLE_TETHER = "availableArray"; /** * @hide - * gives a String[] + * gives a String[] listing all the interfaces currently tethered + * (ie, has dhcp support and packets potentially forwarded/NATed) */ public static final String EXTRA_ACTIVE_TETHER = "activeArray"; /** * @hide - * gives a String[] + * gives a String[] listing all the interfaces we tried to tether and + * failed. Use {@link #getLastTetherError} to find the error code + * for any interfaces listed here. */ public static final String EXTRA_ERRORED_TETHER = "erroredArray"; @@ -248,61 +256,63 @@ public class ConnectivityManager { public static final String EXTRA_IS_CAPTIVE_PORTAL = "captivePortal"; /** - * The absence of APN.. + * The absence of a connection type. * @hide */ public static final int TYPE_NONE = -1; /** - * The Default Mobile data connection. When active, all data traffic - * will use this connection by default. + * The Mobile data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route) */ public static final int TYPE_MOBILE = 0; /** - * The Default WIFI data connection. When active, all data traffic - * will use this connection by default. + * The WIFI data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ public static final int TYPE_WIFI = 1; /** - * An MMS-specific Mobile data connection. This connection may be the - * same as {@link #TYPE_MOBILE} but it may be different. This is used - * by applications needing to talk to the carrier's Multimedia Messaging - * Service servers. It may coexist with default data connections. + * An MMS-specific Mobile data connection. This network type may use the + * same network interface as {@link #TYPE_MOBILE} or it may use a different + * one. This is used by applications needing to talk to the carrier's + * Multimedia Messaging Service servers. */ public static final int TYPE_MOBILE_MMS = 2; /** - * A SUPL-specific Mobile data connection. This connection may be the - * same as {@link #TYPE_MOBILE} but it may be different. This is used - * by applications needing to talk to the carrier's Secure User Plane - * Location servers for help locating the device. It may coexist with - * default data connections. + * A SUPL-specific Mobile data connection. This network type may use the + * same network interface as {@link #TYPE_MOBILE} or it may use a different + * one. This is used by applications needing to talk to the carrier's + * Secure User Plane Location servers for help locating the device. */ public static final int TYPE_MOBILE_SUPL = 3; /** - * A DUN-specific Mobile data connection. This connection may be the - * same as {@link #TYPE_MOBILE} but it may be different. This is used - * by applicaitons performing a Dial Up Networking bridge so that - * the carrier is aware of DUN traffic. It may coexist with default data - * connections. + * A DUN-specific Mobile data connection. This network type may use the + * same network interface as {@link #TYPE_MOBILE} or it may use a different + * one. This is sometimes by the system when setting up an upstream connection + * for tethering so that the carrier is aware of DUN traffic. */ public static final int TYPE_MOBILE_DUN = 4; /** - * A High Priority Mobile data connection. This connection is typically - * the same as {@link #TYPE_MOBILE} but the routing setup is different. - * Only requesting processes will have access to the Mobile DNS servers - * and only IP's explicitly requested via {@link #requestRouteToHost} - * will route over this interface if a default route exists. + * A High Priority Mobile data connection. This network type uses the + * same network interface as {@link #TYPE_MOBILE} but the routing setup + * is different. Only requesting processes will have access to the + * Mobile DNS servers and only IP's explicitly requested via {@link #requestRouteToHost} + * will route over this interface if no default route exists. */ public static final int TYPE_MOBILE_HIPRI = 5; /** - * The Default WiMAX data connection. When active, all data traffic - * will use this connection by default. + * The WiMAX data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ public static final int TYPE_WIMAX = 6; /** - * The Default Bluetooth data connection. When active, all data traffic - * will use this connection by default. + * The Bluetooth data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ public static final int TYPE_BLUETOOTH = 7; @@ -312,25 +322,26 @@ public class ConnectivityManager { public static final int TYPE_DUMMY = 8; /** - * The Default Ethernet data connection. When active, all data traffic - * will use this connection by default. + * The Ethernet data connection. When active, all data traffic + * will use this network type's interface by default + * (it has a default route). */ public static final int TYPE_ETHERNET = 9; /** - * Over the air Adminstration. + * Over the air Administration. * {@hide} */ public static final int TYPE_MOBILE_FOTA = 10; /** - * IP Multimedia Subsystem + * IP Multimedia Subsystem. * {@hide} */ public static final int TYPE_MOBILE_IMS = 11; /** - * Carrier Branded Services + * Carrier Branded Services. * {@hide} */ public static final int TYPE_MOBILE_CBS = 12; @@ -354,7 +365,7 @@ public class ConnectivityManager { * * @deprecated Since we support so many more networks now, the single * network default network preference can't really express - * the heirarchy. Instead, the default is defined by the + * the hierarchy. Instead, the default is defined by the * networkAttributes in config.xml. You can determine * the current value by calling {@link #getNetworkPreference()} * from an App. @@ -364,7 +375,11 @@ public class ConnectivityManager { /** * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in - * milliseconds. + * milliseconds. This was introduced because IPv6 routes seem to take a + * moment to settle - trying network activity before the routes are adjusted + * can lead to packets using the wrong interface or having the wrong IP address. + * This delay is a bit crude, but in the future hopefully we will have kernel + * notifications letting us know when it's safe to use the new network. * * @hide */ @@ -372,11 +387,23 @@ public class ConnectivityManager { private final IConnectivityManager mService; + /** + * Tests if a given integer represents a valid network type. + * @param networkType the type to be tested + * @return a boolean. {@code true} if the type is valid, else {@code false} + */ public static boolean isNetworkTypeValid(int networkType) { return networkType >= 0 && networkType <= MAX_NETWORK_TYPE; } - /** {@hide} */ + /** + * Returns a non-localized string representing a given network type. + * ONLY used for debugging output. + * @param type the type needing naming + * @return a String for the given type, or a string version of the type ("87") + * if no name is known. + * {@hide} + */ public static String getNetworkTypeName(int type) { switch (type) { case TYPE_MOBILE: @@ -412,7 +439,13 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Checks if a given type uses the cellular data connection. + * This should be replaced in the future by a network property. + * @param networkType the type to check + * @return a boolean - {@code true} if uses cellular network, else {@code false} + * {@hide} + */ public static boolean isNetworkTypeMobile(int networkType) { switch (networkType) { case TYPE_MOBILE: @@ -429,6 +462,17 @@ public class ConnectivityManager { } } + /** + * Specifies the preferred network type. When the device has more + * than one type available the preferred network type will be used. + * Note that this made sense when we only had 2 network types, + * but with more and more default networks we need an array to list + * their ordering. This will be deprecated soon. + * + * @param preference the network type to prefer over all others. It is + * unspecified what happens to the old preferred network in the + * overall ordering. + */ public void setNetworkPreference(int preference) { try { mService.setNetworkPreference(preference); @@ -436,6 +480,17 @@ public class ConnectivityManager { } } + /** + * Retrieves the current preferred network type. + * Note that this made sense when we only had 2 network types, + * but with more and more default networks we need an array to list + * their ordering. This will be deprecated soon. + * + * @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}. + */ public int getNetworkPreference() { try { return mService.getNetworkPreference(); @@ -445,11 +500,16 @@ public class ConnectivityManager { } /** - * Returns details about the currently active data network. When connected, - * this network is the default route for outgoing connections. You should - * always check {@link NetworkInfo#isConnected()} before initiating network - * traffic. This may return {@code null} when no networks are available. - * <p>This method requires the caller to hold the permission + * Returns details about the currently active default data network. When + * connected, this network is the default route for outgoing connections. + * You should always check {@link NetworkInfo#isConnected()} before initiating + * network traffic. This may return {@code null} when there is no default + * network. + * + * @return a {@link NetworkInfo} object for the current default network + * or {@code null} if no network default network is currently active + * + * <p>This method requires the call to hold the permission * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public NetworkInfo getActiveNetworkInfo() { @@ -460,7 +520,19 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Returns details about the currently active default data network + * for a given uid. This is for internal use only to avoid spying + * other apps. + * + * @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) { try { return mService.getActiveNetworkInfoForUid(uid); @@ -469,6 +541,19 @@ public class ConnectivityManager { } } + /** + * Returns connection status information about a particular + * network type. + * + * @param networkType integer specifying which networkType in + * which you're interested. + * @return a {@link NetworkInfo} object for the requested + * network type or {@code null} if the type is not + * supported by the device. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + */ public NetworkInfo getNetworkInfo(int networkType) { try { return mService.getNetworkInfo(networkType); @@ -477,6 +562,16 @@ public class ConnectivityManager { } } + /** + * Returns connection status information about all network + * types supported by the device. + * + * @return an array of {@link NetworkInfo} objects. Check each + * {@link NetworkInfo#getType} for which type each applies. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + */ public NetworkInfo[] getAllNetworkInfo() { try { return mService.getAllNetworkInfo(); @@ -485,7 +580,17 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Returns the IP information for the current default network. + * + * @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 call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * {@hide} + */ public LinkProperties getActiveLinkProperties() { try { return mService.getActiveLinkProperties(); @@ -494,7 +599,18 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Returns the IP information for a given network type. + * + * @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 call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * {@hide} + */ public LinkProperties getLinkProperties(int networkType) { try { return mService.getLinkProperties(networkType); @@ -503,7 +619,18 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Tells each network type to set its radio power state as directed. + * + * @param turnOn a boolean, {@code true} to turn the radios on, + * {@code false} to turn them off. + * @return a boolean, {@code true} indicating success. All network types + * will be tried, even if some fail. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. + * {@hide} + */ public boolean setRadios(boolean turnOn) { try { return mService.setRadios(turnOn); @@ -512,7 +639,18 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * Tells a given networkType to set its radio power state as directed. + * + * @param networkType the int networkType of interest. + * @param turnOn a boolean, {@code true} to turn the radio on, + * {@code} false to turn it off. + * @return a boolean, {@code true} indicating success. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. + * {@hide} + */ public boolean setRadio(int networkType, boolean turnOn) { try { return mService.setRadio(networkType, turnOn); @@ -647,6 +785,9 @@ public class ConnectivityManager { * network is active. Quota status can change rapidly, so these values * shouldn't be cached. * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. + * * @hide */ public NetworkQuotaInfo getActiveNetworkQuotaInfo() { @@ -661,6 +802,9 @@ public class ConnectivityManager { * Gets the value of the setting for enabling Mobile data. * * @return Whether mobile data is enabled. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * @hide */ public boolean getMobileDataEnabled() { @@ -674,8 +818,8 @@ public class ConnectivityManager { /** * Sets the persisted value for enabling/disabling Mobile data. * - * @param enabled Whether the mobile data connection should be - * used or not. + * @param enabled Whether the user wants the mobile data connection used + * or not. * @hide */ public void setMobileDataEnabled(boolean enabled) { @@ -698,6 +842,13 @@ public class ConnectivityManager { } /** + * Get the set of tetherable, available interfaces. This list is limited by + * device configuration and current interface existence. + * + * @return an array of 0 or more Strings of tetherable interface names. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableIfaces() { @@ -709,6 +860,12 @@ public class ConnectivityManager { } /** + * Get the set of tethered interfaces. + * + * @return an array of 0 or more String of currently tethered interface names. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetheredIfaces() { @@ -720,6 +877,18 @@ public class ConnectivityManager { } /** + * Get the set of interface names which attempted to tether but + * failed. Re-attempting to tether may cause them to reset to the Tethered + * state. Alternatively, causing the interface to be destroyed and recreated + * 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. + * + * @return an array of 0 or more String indicating the interface names + * which failed to tether. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetheringErroredIfaces() { @@ -731,7 +900,19 @@ public class ConnectivityManager { } /** - * @return error A TETHER_ERROR value indicating success or failure type + * Attempt to tether the named interface. This will setup a dhcp server + * on the interface, forward and NAT IP packets and forward DNS requests + * to the best active upstream network interface. Note that if no upstream + * IP network interface is available, dhcp will still run and traffic will be + * allowed between the tethered devices and this device, though upstream net + * access will of course fail until an upstream network interface becomes + * active. + * + * @param iface the interface name to tether. + * @return error a {@code TETHER_ERROR} value indicating success or failure type + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int tether(String iface) { @@ -743,7 +924,13 @@ public class ConnectivityManager { } /** - * @return error A TETHER_ERROR value indicating success or failure type + * Stop tethering the named interface. + * + * @param iface the interface name to untether. + * @return error a {@code TETHER_ERROR} value indicating success or failure type + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int untether(String iface) { @@ -755,6 +942,14 @@ public class ConnectivityManager { } /** + * Check if the device allows for tethering. It may be disabled via + * {@code ro.tether.denied} system property, {@link Settings#TETHER_SUPPORTED} or + * due to device configuration. + * + * @return a boolean - {@code true} indicating Tethering is supported. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public boolean isTetheringSupported() { @@ -766,6 +961,15 @@ 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. + * + * @return an array of 0 or more regular expression Strings defining + * what interfaces are considered tetherable usb interfaces. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableUsbRegexs() { @@ -777,6 +981,15 @@ 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. + * + * @return an array of 0 or more regular expression Strings defining + * what interfaces are considered tetherable wifi interfaces. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableWifiRegexs() { @@ -788,6 +1001,15 @@ 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. + * + * @return an array of 0 or more regular expression Strings defining + * what interfaces are considered tetherable bluetooth interfaces. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public String[] getTetherableBluetoothRegexs() { @@ -799,6 +1021,17 @@ public class ConnectivityManager { } /** + * Attempt to both alter the mode of USB and Tethering of USB. A + * utility method to deal with some of the complexity of USB - will + * 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}. + * + * @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 call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public int setUsbTethering(boolean enable) { @@ -833,9 +1066,15 @@ public class ConnectivityManager { public static final int TETHER_ERROR_IFACE_CFG_ERROR = 10; /** - * @param iface The name of the interface we're interested in + * Get a more detailed error code after a Tethering or Untethering + * request asynchronously failed. + * + * @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 call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public int getLastTetherError(String iface) { @@ -847,9 +1086,16 @@ public class ConnectivityManager { } /** - * Ensure the device stays awake until we connect with the next network - * @param forWhome The name of the network going down for logging purposes + * Try to ensure the device stays awake until we connect with the next network. + * Actually just holds a wakelock for a number of seconds while we try to connect + * to any default networks. This will expire if the timeout passes or if we connect + * to a default after this is called. For internal use only. + * + * @param forWhom the name of the network going down for logging purposes * @return {@code true} on success, {@code false} on failure + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * {@hide} */ public boolean requestNetworkTransitionWakelock(String forWhom) { @@ -862,8 +1108,14 @@ public class ConnectivityManager { } /** + * Report network connectivity status. This is currently used only + * to alter status bar UI. + * * @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 call to hold the permission + * {@link android.Manifest.permission#STATUS_BAR}. * {@hide} */ public void reportInetCondition(int networkType, int percentage) { @@ -874,7 +1126,16 @@ public class ConnectivityManager { } /** - * @param proxyProperties The definition for the new global http proxy + * Set a network-independent global http proxy. This is not normally what you want + * 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 proxyProperties The a {@link ProxyProperites} object defining the new global + * HTTP proxy. A {@code null} value will clear the global HTTP proxy. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CHANGE_NETWORK_STATE}. * {@hide} */ public void setGlobalProxy(ProxyProperties p) { @@ -885,7 +1146,13 @@ public class ConnectivityManager { } /** - * @return proxyProperties for the current global proxy + * Retrieve any network-independent global HTTP proxy. + * + * @return {@link ProxyProperties} for the current global HTTP proxy or {@code null} + * if no global HTTP proxy is set. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public ProxyProperties getGlobalProxy() { @@ -897,7 +1164,14 @@ public class ConnectivityManager { } /** - * @return proxyProperties for the current proxy (global if set, network specific if not) + * Get the HTTP proxy settings for the current default network. Note that + * if a global proxy is set, it will override any per-network setting. + * + * @return the {@link ProxyProperties} for the current HTTP proxy, or {@code null} if no + * HTTP proxy is active. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * {@hide} */ public ProxyProperties getProxy() { @@ -909,8 +1183,15 @@ public class ConnectivityManager { } /** + * Sets a secondary requirement bit for the given networkType. + * This requirement bit is generally under the control of the carrier + * or its agents and is not directly controlled by the user. + * * @param networkType The network who's dependence has changed - * @param met Boolean - true if network use is ok, false if not + * @param met Boolean - true if network use is OK, false if not + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * {@hide} */ public void setDataDependency(int networkType, boolean met) { @@ -924,11 +1205,15 @@ public class ConnectivityManager { * Returns true if the hardware supports the given network type * else it returns false. This doesn't indicate we have coverage * or are authorized onto a network, just whether or not the - * hardware supports it. For example a gsm phone without a sim - * should still return true for mobile data, but a wifi only tablet - * would return false. - * @param networkType The nework type we'd like to check - * @return true if supported, else false + * 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}. + * + * @param networkType The network type we'd like to check + * @return {@code true} if supported, else {@code false} + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. * @hide */ public boolean isNetworkSupported(int networkType) { @@ -941,9 +1226,16 @@ public class ConnectivityManager { /** * Returns if the currently active data network is metered. A network is * classified as metered when the user is sensitive to heavy data usage on - * that connection. You should check this before doing large data transfers, - * and warn the user or delay the operation until another network is - * available. + * that connection due to monetary costs, data limitations or + * 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. + * + * @return {@code true} if large transfers should be avoided, otherwise + * {@code false}. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#ACCESS_NETWORK_STATE}. */ public boolean isActiveNetworkMetered() { try { @@ -953,7 +1245,15 @@ public class ConnectivityManager { } } - /** {@hide} */ + /** + * If the LockdownVpn mechanism is enabled, updates the vpn + * with a reload of its profile. + * + * @return a boolean with {@code} indicating success + * + * <p>This method can only be called by the system UID + * {@hide} + */ public boolean updateLockdownVpn() { try { return mService.updateLockdownVpn(); @@ -963,6 +1263,14 @@ public class ConnectivityManager { } /** + * Signal that the captive portal check on the indicated network + * is complete and we can turn the network on for general use. + * + * @param info the {@link NetworkInfo} object for the networkType + * in question. + * + * <p>This method requires the call to hold the permission + * {@link android.Manifest.permission#CONNECTIVITY_INTERNAL}. * {@hide} */ public void captivePortalCheckComplete(NetworkInfo info) { diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 9dc77b9..71d8fb6 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -153,6 +153,7 @@ public abstract class WallpaperService extends Service { int mCurWindowPrivateFlags = mWindowPrivateFlags; final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); + final Rect mOverscanInsets = new Rect(); final Rect mContentInsets = new Rect(); final Configuration mConfiguration = new Configuration(); @@ -252,7 +253,7 @@ public abstract class WallpaperService extends Service { final BaseIWindow mWindow = new BaseIWindow() { @Override - public void resized(Rect frame, Rect contentInsets, + public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0); @@ -627,7 +628,7 @@ public abstract class WallpaperService extends Service { final int relayoutResult = mSession.relayout( mWindow, mWindow.mSeq, mLayout, mWidth, mHeight, - View.VISIBLE, 0, mWinFrame, mContentInsets, + View.VISIBLE, 0, mWinFrame, mOverscanInsets, mContentInsets, mVisibleInsets, mConfiguration, mSurfaceHolder.mSurface); if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface diff --git a/core/java/android/view/GLES20Canvas.java b/core/java/android/view/GLES20Canvas.java index 7ff8d09..6c48e43 100644 --- a/core/java/android/view/GLES20Canvas.java +++ b/core/java/android/view/GLES20Canvas.java @@ -497,22 +497,22 @@ class GLES20Canvas extends HardwareCanvas { @Override public boolean quickReject(float left, float top, float right, float bottom, EdgeType type) { - return nQuickReject(mRenderer, left, top, right, bottom, type.nativeInt); + return nQuickReject(mRenderer, left, top, right, bottom); } private static native boolean nQuickReject(int renderer, float left, float top, - float right, float bottom, int edge); + float right, float bottom); @Override public boolean quickReject(Path path, EdgeType type) { path.computeBounds(mPathBounds, true); return nQuickReject(mRenderer, mPathBounds.left, mPathBounds.top, - mPathBounds.right, mPathBounds.bottom, type.nativeInt); + mPathBounds.right, mPathBounds.bottom); } @Override public boolean quickReject(RectF rect, EdgeType type) { - return nQuickReject(mRenderer, rect.left, rect.top, rect.right, rect.bottom, type.nativeInt); + return nQuickReject(mRenderer, rect.left, rect.top, rect.right, rect.bottom); } /////////////////////////////////////////////////////////////////////////// diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 15bd46c..8ec07ef 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -45,7 +45,7 @@ oneway interface IWindow { */ void executeCommand(String command, String parameters, in ParcelFileDescriptor descriptor); - void resized(in Rect frame, in Rect contentInsets, + void resized(in Rect frame, in Rect overscanInsets, in Rect contentInsets, in Rect visibleInsets, boolean reportDraw, in Configuration newConfig); void moved(int newX, int newY); void dispatchAppVisibility(boolean visible); diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index ff9dcce..0a8e609 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -63,6 +63,9 @@ interface IWindowSession { * {@link WindowManagerGlobal#RELAYOUT_DEFER_SURFACE_DESTROY}. * @param outFrame Rect in which is placed the new position/size on * screen. + * @param outOverscanInsets Rect in which is placed the offsets from + * <var>outFrame</var> in which the content of the window are inside + * of the display's overlay region. * @param outContentInsets Rect in which is placed the offsets from * <var>outFrame</var> in which the content of the window should be * placed. This can be used to modify the window layout to ensure its @@ -84,7 +87,7 @@ interface IWindowSession { */ int relayout(IWindow window, int seq, in WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, - int flags, out Rect outFrame, + int flags, out Rect outFrame, out Rect outOverscanInsets, out Rect outContentInsets, out Rect outVisibleInsets, out Configuration outConfig, out Surface outSurface); diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index de64e14..03a9b09 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -75,7 +75,6 @@ public class Surface implements Parcelable { private int mGenerationId; // incremented each time mNativeSurface changes private final Canvas mCanvas = new CompatibleCanvas(); - private int mCanvasSaveCount; // Canvas save count at time of lockCanvas() // The Translator for density compatibility mode. This is used for scaling // the canvas to perform the appropriate density transformation. diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 9008521..5d0f523 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -103,6 +103,7 @@ public class SurfaceView extends View { MyWindow mWindow; final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); + final Rect mOverscanInsets = new Rect(); final Rect mContentInsets = new Rect(); final Configuration mConfiguration = new Configuration(); @@ -507,7 +508,7 @@ public class SurfaceView extends View { mWindow, mWindow.mSeq, mLayout, mWidth, mHeight, visible ? VISIBLE : GONE, WindowManagerGlobal.RELAYOUT_DEFER_SURFACE_DESTROY, - mWinFrame, mContentInsets, + mWinFrame, mOverscanInsets, mContentInsets, mVisibleInsets, mConfiguration, mNewSurface); if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) { mReportDrawNeeded = true; @@ -642,7 +643,7 @@ public class SurfaceView extends View { } @Override - public void resized(Rect frame, Rect contentInsets, + public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { SurfaceView surfaceView = mSurfaceView.get(); if (surfaceView != null) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index dcf51e4..ab8f934 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -5679,20 +5679,45 @@ public class View implements Drawable.Callback, KeyEvent.Callback, if ((mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS) { mUserPaddingStart = UNDEFINED_PADDING; mUserPaddingEnd = UNDEFINED_PADDING; - if ((mViewFlags & OPTIONAL_FITS_SYSTEM_WINDOWS) == 0 - || mAttachInfo == null - || (mAttachInfo.mSystemUiVisibility & SYSTEM_UI_LAYOUT_FLAGS) == 0) { - internalSetPadding(insets.left, insets.top, insets.right, insets.bottom); - return true; - } else { - internalSetPadding(0, 0, 0, 0); - return false; + Rect localInsets = sThreadLocal.get(); + if (localInsets == null) { + localInsets = new Rect(); + sThreadLocal.set(localInsets); } + boolean res = computeFitSystemWindows(insets, localInsets); + internalSetPadding(localInsets.left, localInsets.top, + localInsets.right, localInsets.bottom); + return res; } return false; } /** + * @hide Compute the insets that should be consumed by this view and the ones + * that should propagate to those under it. + */ + protected boolean computeFitSystemWindows(Rect inoutInsets, Rect outLocalInsets) { + if ((mViewFlags & OPTIONAL_FITS_SYSTEM_WINDOWS) == 0 + || mAttachInfo == null + || ((mAttachInfo.mSystemUiVisibility & SYSTEM_UI_LAYOUT_FLAGS) == 0 + && !mAttachInfo.mOverscanRequested)) { + outLocalInsets.set(inoutInsets); + inoutInsets.set(0, 0, 0, 0); + return true; + } else { + // The application wants to take care of fitting system window for + // the content... however we still need to take care of any overscan here. + final Rect overscan = mAttachInfo.mOverscanInsets; + outLocalInsets.set(overscan); + inoutInsets.left -= overscan.left; + inoutInsets.top -= overscan.top; + inoutInsets.right -= overscan.right; + inoutInsets.bottom -= overscan.bottom; + return false; + } + } + + /** * Sets whether or not this view should account for system screen decorations * such as the status bar and inset its content; that is, controlling whether * the default implementation of {@link #fitSystemWindows(Rect)} will be @@ -17919,6 +17944,13 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * For windows that are full-screen but using insets to layout inside + * of the screen areas, these are the current insets to appear inside + * the overscan area of the display. + */ + final Rect mOverscanInsets = new Rect(); + + /** + * For windows that are full-screen but using insets to layout inside * of the screen decorations, these are the current insets for the * content of the window. */ @@ -18020,6 +18052,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, boolean mHasSystemUiListeners; /** + * Set if the window has requested to extend into the overscan region + * via WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN. + */ + boolean mOverscanRequested; + + /** * Set if the visibility of any views has changed. */ boolean mViewVisibilityChanged; diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 9b6dafb..b8fae86 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -229,6 +229,7 @@ public final class ViewRootImpl implements ViewParent, boolean mIsDrawing; int mLastSystemUiVisibility; int mClientWindowLayoutFlags; + boolean mLastOverscanRequested; /** @hide */ public static final int EVENT_NOT_HANDLED = 0; @@ -262,6 +263,7 @@ public final class ViewRootImpl implements ViewParent, // These are accessed by multiple threads. final Rect mWinFrame; // frame given by window manager. + final Rect mPendingOverscanInsets = new Rect(); final Rect mPendingVisibleInsets = new Rect(); final Rect mPendingContentInsets = new Rect(); final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets @@ -566,6 +568,7 @@ public final class ViewRootImpl implements ViewParent, if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(mAttachInfo.mContentInsets); } + mPendingOverscanInsets.set(0, 0, 0, 0); mPendingContentInsets.set(mAttachInfo.mContentInsets); mPendingVisibleInsets.set(0, 0, 0, 0); if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow); @@ -1255,6 +1258,9 @@ public final class ViewRootImpl implements ViewParent, mAttachInfo.mInTouchMode = !mAddedTouchMode; ensureTouchModeLocally(mAddedTouchMode); } else { + if (!mPendingOverscanInsets.equals(mAttachInfo.mOverscanInsets)) { + insetsChanged = true; + } if (!mPendingContentInsets.equals(mAttachInfo.mContentInsets)) { insetsChanged = true; } @@ -1320,15 +1326,20 @@ public final class ViewRootImpl implements ViewParent, } } - if (params != null && (host.mPrivateFlags & View.PFLAG_REQUEST_TRANSPARENT_REGIONS) != 0) { - if (!PixelFormat.formatHasAlpha(params.format)) { - params.format = PixelFormat.TRANSLUCENT; + if (params != null) { + if ((host.mPrivateFlags & View.PFLAG_REQUEST_TRANSPARENT_REGIONS) != 0) { + if (!PixelFormat.formatHasAlpha(params.format)) { + params.format = PixelFormat.TRANSLUCENT; + } } + mAttachInfo.mOverscanRequested = (params.flags + & WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN) != 0; } if (mFitSystemWindowsRequested) { mFitSystemWindowsRequested = false; mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets); + mLastOverscanRequested = mAttachInfo.mOverscanRequested; host.fitSystemWindows(mFitSystemWindowsInsets); if (mLayoutRequested) { // Short-circuit catching a new layout request here, so @@ -1383,7 +1394,6 @@ public final class ViewRootImpl implements ViewParent, boolean hwInitialized = false; boolean contentInsetsChanged = false; - boolean visibleInsetsChanged; boolean hadSurface = mSurface.isValid(); try { @@ -1396,6 +1406,7 @@ public final class ViewRootImpl implements ViewParent, relayoutResult = relayoutWindow(params, viewVisibility, insetsPending); if (DEBUG_LAYOUT) Log.v(TAG, "relayout: frame=" + frame.toShortString() + + " overscan=" + mPendingOverscanInsets.toShortString() + " content=" + mPendingContentInsets.toShortString() + " visible=" + mPendingVisibleInsets.toShortString() + " surface=" + mSurface); @@ -1407,9 +1418,11 @@ public final class ViewRootImpl implements ViewParent, mPendingConfiguration.seq = 0; } + final boolean overscanInsetsChanged = !mPendingOverscanInsets.equals( + mAttachInfo.mOverscanInsets); contentInsetsChanged = !mPendingContentInsets.equals( mAttachInfo.mContentInsets); - visibleInsetsChanged = !mPendingVisibleInsets.equals( + final boolean visibleInsetsChanged = !mPendingVisibleInsets.equals( mAttachInfo.mVisibleInsets); if (contentInsetsChanged) { if (mWidth > 0 && mHeight > 0 && lp != null && @@ -1486,9 +1499,18 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_LAYOUT) Log.v(TAG, "Content insets changing to: " + mAttachInfo.mContentInsets); } + if (overscanInsetsChanged) { + mAttachInfo.mOverscanInsets.set(mPendingOverscanInsets); + if (DEBUG_LAYOUT) Log.v(TAG, "Overscan insets changing to: " + + mAttachInfo.mOverscanInsets); + // Need to relayout with content insets. + contentInsetsChanged = true; + } if (contentInsetsChanged || mLastSystemUiVisibility != - mAttachInfo.mSystemUiVisibility || mFitSystemWindowsRequested) { + mAttachInfo.mSystemUiVisibility || mFitSystemWindowsRequested + || mLastOverscanRequested != mAttachInfo.mOverscanRequested) { mLastSystemUiVisibility = mAttachInfo.mSystemUiVisibility; + mLastOverscanRequested = mAttachInfo.mOverscanRequested; mFitSystemWindowsRequested = false; mFitSystemWindowsInsets.set(mAttachInfo.mContentInsets); host.fitSystemWindows(mFitSystemWindowsInsets); @@ -2942,6 +2964,7 @@ public final class ViewRootImpl implements ViewParent, // Recycled in the fall through... SomeArgs args = (SomeArgs) msg.obj; if (mWinFrame.equals(args.arg1) + && mPendingOverscanInsets.equals(args.arg5) && mPendingContentInsets.equals(args.arg2) && mPendingVisibleInsets.equals(args.arg3) && args.arg4 == null) { @@ -2958,6 +2981,7 @@ public final class ViewRootImpl implements ViewParent, } mWinFrame.set((Rect) args.arg1); + mPendingOverscanInsets.set((Rect) args.arg5); mPendingContentInsets.set((Rect) args.arg2); mPendingVisibleInsets.set((Rect) args.arg3); @@ -4031,7 +4055,7 @@ public final class ViewRootImpl implements ViewParent, (int) (mView.getMeasuredWidth() * appScale + 0.5f), (int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility, insetsPending ? WindowManagerGlobal.RELAYOUT_INSETS_PENDING : 0, - mWinFrame, mPendingContentInsets, mPendingVisibleInsets, + mWinFrame, mPendingOverscanInsets, mPendingContentInsets, mPendingVisibleInsets, mPendingConfiguration, mSurface); //Log.d(TAG, "<<<<<< BACK FROM relayout"); if (restore) { @@ -4040,6 +4064,7 @@ public final class ViewRootImpl implements ViewParent, if (mTranslator != null) { mTranslator.translateRectInScreenToAppWinFrame(mWinFrame); + mTranslator.translateRectInScreenToAppWindow(mPendingOverscanInsets); mTranslator.translateRectInScreenToAppWindow(mPendingContentInsets); mTranslator.translateRectInScreenToAppWindow(mPendingVisibleInsets); } @@ -4245,7 +4270,7 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } - public void dispatchResized(Rect frame, Rect contentInsets, + public void dispatchResized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": frame=" + frame.toShortString() + " contentInsets=" + contentInsets.toShortString() @@ -4254,6 +4279,7 @@ public final class ViewRootImpl implements ViewParent, Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT : MSG_RESIZED); if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(frame); + mTranslator.translateRectInScreenToAppWindow(overscanInsets); mTranslator.translateRectInScreenToAppWindow(contentInsets); mTranslator.translateRectInScreenToAppWindow(visibleInsets); } @@ -4263,6 +4289,7 @@ public final class ViewRootImpl implements ViewParent, args.arg2 = sameProcessCall ? new Rect(contentInsets) : contentInsets; args.arg3 = sameProcessCall ? new Rect(visibleInsets) : visibleInsets; args.arg4 = sameProcessCall && newConfig != null ? new Configuration(newConfig) : newConfig; + args.arg5 = sameProcessCall ? new Rect(overscanInsets) : overscanInsets; msg.obj = args; mHandler.sendMessage(msg); } @@ -4997,11 +5024,11 @@ public final class ViewRootImpl implements ViewParent, mWindowSession = viewAncestor.mWindowSession; } - public void resized(Rect frame, Rect contentInsets, + public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchResized(frame, contentInsets, + viewAncestor.dispatchResized(frame, overscanInsets, contentInsets, visibleInsets, reportDraw, newConfig); } } diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index d236561..bf330f3 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -1193,6 +1193,37 @@ public interface WindowManager extends ViewManager { public float buttonBrightness = BRIGHTNESS_OVERRIDE_NONE; /** + * Value for {@link #rotationAnimation} to define the animation used to + * specify that this window will rotate in or out following a rotation. + */ + public static final int ROTATION_ANIMATION_ROTATE = 0; + + /** + * Value for {@link #rotationAnimation} to define the animation used to + * specify that this window will fade in or out following a rotation. + */ + public static final int ROTATION_ANIMATION_CROSSFADE = 1; + + /** + * Value for {@link #rotationAnimation} to define the animation used to + * specify that this window will immediately disappear or appear following + * a rotation. + */ + public static final int ROTATION_ANIMATION_JUMPCUT = 2; + + /** + * Define the animation used on this window for entry or exit following + * a rotation. This only works if the incoming and outgoing topmost + * opaque windows have the #FLAG_FULLSCREEN bit set and are not covered + * by other windows. + * + * @see #ROTATION_ANIMATION_ROTATE + * @see #ROTATION_ANIMATION_CROSSFADE + * @see #ROTATION_ANIMATION_JUMPCUT + */ + public int rotationAnimation = ROTATION_ANIMATION_ROTATE; + + /** * Identifier for this window. This will usually be filled in for * you. */ @@ -1367,6 +1398,7 @@ public interface WindowManager extends ViewManager { out.writeFloat(dimAmount); out.writeFloat(screenBrightness); out.writeFloat(buttonBrightness); + out.writeInt(rotationAnimation); out.writeStrongBinder(token); out.writeString(packageName); TextUtils.writeToParcel(mTitle, out, parcelableFlags); @@ -1408,6 +1440,7 @@ public interface WindowManager extends ViewManager { dimAmount = in.readFloat(); screenBrightness = in.readFloat(); buttonBrightness = in.readFloat(); + rotationAnimation = in.readInt(); token = in.readStrongBinder(); packageName = in.readString(); mTitle = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); @@ -1432,18 +1465,19 @@ public interface WindowManager extends ViewManager { public static final int SOFT_INPUT_MODE_CHANGED = 1<<9; public static final int SCREEN_ORIENTATION_CHANGED = 1<<10; public static final int SCREEN_BRIGHTNESS_CHANGED = 1<<11; + public static final int ROTATION_ANIMATION_CHANGED = 1<<12; /** {@hide} */ - public static final int BUTTON_BRIGHTNESS_CHANGED = 1<<12; + public static final int BUTTON_BRIGHTNESS_CHANGED = 1<<13; /** {@hide} */ - public static final int SYSTEM_UI_VISIBILITY_CHANGED = 1<<13; + public static final int SYSTEM_UI_VISIBILITY_CHANGED = 1<<14; /** {@hide} */ - public static final int SYSTEM_UI_LISTENER_CHANGED = 1<<14; + public static final int SYSTEM_UI_LISTENER_CHANGED = 1<<15; /** {@hide} */ - public static final int INPUT_FEATURES_CHANGED = 1<<15; + public static final int INPUT_FEATURES_CHANGED = 1<<16; /** {@hide} */ - public static final int PRIVATE_FLAGS_CHANGED = 1<<16; + public static final int PRIVATE_FLAGS_CHANGED = 1<<17; /** {@hide} */ - public static final int USER_ACTIVITY_TIMEOUT_CHANGED = 1<<17; + public static final int USER_ACTIVITY_TIMEOUT_CHANGED = 1<<18; /** {@hide} */ public static final int EVERYTHING_CHANGED = 0xffffffff; @@ -1543,6 +1577,10 @@ public interface WindowManager extends ViewManager { buttonBrightness = o.buttonBrightness; changes |= BUTTON_BRIGHTNESS_CHANGED; } + if (rotationAnimation != o.rotationAnimation) { + rotationAnimation = o.rotationAnimation; + changes |= ROTATION_ANIMATION_CHANGED; + } if (screenOrientation != o.screenOrientation) { screenOrientation = o.screenOrientation; @@ -1645,6 +1683,10 @@ public interface WindowManager extends ViewManager { sb.append(" bbrt="); sb.append(buttonBrightness); } + if (rotationAnimation != ROTATION_ANIMATION_ROTATE) { + sb.append(" rotAnim="); + sb.append(rotationAnimation); + } if ((flags & FLAG_COMPATIBLE_WINDOW) != 0) { sb.append(" compatible=true"); } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 192eded..c0044b6 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -154,6 +154,8 @@ public interface WindowManagerPolicy { * @param displayFrame The frame of the overall display in which this * window can appear, used for constraining the overall dimensions * of the window. + * @param overlayFrame The frame within the display that is inside + * of the overlay region. * @param contentFrame The frame within the display in which we would * like active content to appear. This will cause windows behind to * be resized to match the given content frame. @@ -165,7 +167,7 @@ public interface WindowManagerPolicy { * are visible. */ public void computeFrameLw(Rect parentFrame, Rect displayFrame, - Rect contentFrame, Rect visibleFrame); + Rect overlayFrame, Rect contentFrame, Rect visibleFrame); /** * Retrieve the current frame of the window that has been assigned by @@ -193,6 +195,15 @@ public interface WindowManagerPolicy { public Rect getDisplayFrameLw(); /** + * Retrieve the frame of the area inside the overscan region of the + * display that this window was last laid out in. Must be called with the + * window manager lock held. + * + * @return Rect The rectangle holding the display overscan frame. + */ + public Rect getOverscanFrameLw(); + + /** * Retrieve the frame of the content area that this window was last * laid out in. This is the area in which the content of the window * should be placed. It will be smaller than the display frame to @@ -684,6 +695,31 @@ public interface WindowManagerPolicy { public int selectAnimationLw(WindowState win, int transit); /** + * Determine the animation to run for a rotation transition based on the + * top fullscreen windows {@link WindowManager.LayoutParams#rotationAnimation} + * and whether it is currently fullscreen and frontmost. + * + * @param anim The exiting animation resource id is stored in anim[0], the + * entering animation resource id is stored in anim[1]. + */ + public void selectRotationAnimationLw(int anim[]); + + /** + * Validate whether the current top fullscreen has specified the same + * {@link WindowManager.LayoutParams#rotationAnimation} value as that + * being passed in from the previous top fullscreen window. + * + * @param exitAnimId exiting resource id from the previous window. + * @param enterAnimId entering resource id from the previous window. + * @param forceDefault For rotation animations only, if true ignore the + * animation values and just return false. + * @return true if the previous values are still valid, false if they + * should be replaced with the default. + */ + public boolean validateRotationAnimationLw(int exitAnimId, int enterAnimId, + boolean forceDefault); + + /** * Create and return an animation to re-display a force hidden window. */ public Animation createForceHideEnterAnimation(boolean onWallpaper); @@ -909,6 +945,7 @@ public interface WindowManagerPolicy { * @see android.app.KeyguardManager.KeyguardLock#disableKeyguard() * @see android.app.KeyguardManager.KeyguardLock#reenableKeyguard() */ + @SuppressWarnings("javadoc") public void enableKeyguard(boolean enabled); /** @@ -924,6 +961,7 @@ public interface WindowManagerPolicy { * @param callback Callback to send the result back. * @see android.app.KeyguardManager#exitKeyguardSecurely(android.app.KeyguardManager.OnKeyguardExitResult) */ + @SuppressWarnings("javadoc") void exitKeyguardSecurely(OnKeyguardExitResult callback); /** diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index d0bfbe8..1321515 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -334,7 +334,8 @@ public class WebView extends AbsoluteLayout * See {@link WebView#capturePicture} for details of the picture. * * @param view the WebView that owns the picture - * @param picture the new picture + * @param picture the new picture. Applications targetting Jelly + * Bean MR2 or above will always receive a null Picture. * @deprecated Deprecated due to internal changes. */ @Deprecated diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 3ded1cd..19784a4 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -7909,7 +7909,11 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc if (mPictureListener != null) { // trigger picture listener for hardware layers. Software layers are // triggered in setNewPicture - mPictureListener.onNewPicture(getWebView(), capturePicture()); + // TODO: Update CUR_DEVELOPMENT when appropriate JBMR2 constant is + // available. + Picture picture = mContext.getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.CUR_DEVELOPMENT ? capturePicture() : null; + mPictureListener.onNewPicture(getWebView(), picture); } } @@ -7994,7 +7998,11 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc || mWebView.getLayerType() == View.LAYER_TYPE_SOFTWARE) { // trigger picture listener for software layers. Hardware layers are // triggered in pageSwapCallback - mPictureListener.onNewPicture(getWebView(), capturePicture()); + // TODO: Update CUR_DEVELOPMENT when appropriate JBMR2 constant is + // available. + Picture picture = mContext.getApplicationInfo().targetSdkVersion < + Build.VERSION_CODES.CUR_DEVELOPMENT ? capturePicture() : null; + mPictureListener.onNewPicture(getWebView(), picture); } } } diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 69e3177..4436fbb 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -2429,7 +2429,9 @@ public class ListView extends AbsListView { View selectedView = getSelectedView(); int selectedPos = mSelectedPosition; - int nextSelectedPosition = lookForSelectablePositionOnScreen(direction); + int nextSelectedPosition = (direction == View.FOCUS_DOWN) ? + lookForSelectablePosition(selectedPos + 1, true) : + lookForSelectablePosition(selectedPos - 1, false); int amountToScroll = amountToScroll(direction, nextSelectedPosition); // if we are moving focus, we may OVERRIDE the default behavior @@ -2641,14 +2643,18 @@ public class ListView extends AbsListView { final int listBottom = getHeight() - mListPadding.bottom; final int listTop = mListPadding.top; - final int numChildren = getChildCount(); + int numChildren = getChildCount(); if (direction == View.FOCUS_DOWN) { int indexToMakeVisible = numChildren - 1; if (nextSelectedPosition != INVALID_POSITION) { indexToMakeVisible = nextSelectedPosition - mFirstPosition; } - + while (numChildren <= indexToMakeVisible) { + // Child to view is not attached yet. + addViewBelow(getChildAt(numChildren - 1), mFirstPosition + numChildren - 1); + numChildren++; + } final int positionToMakeVisible = mFirstPosition + indexToMakeVisible; final View viewToMakeVisible = getChildAt(indexToMakeVisible); @@ -2682,6 +2688,12 @@ public class ListView extends AbsListView { if (nextSelectedPosition != INVALID_POSITION) { indexToMakeVisible = nextSelectedPosition - mFirstPosition; } + while (indexToMakeVisible < 0) { + // Child to view is not attached yet. + addViewAbove(getChildAt(0), mFirstPosition); + mFirstPosition--; + indexToMakeVisible = nextSelectedPosition - mFirstPosition; + } final int positionToMakeVisible = mFirstPosition + indexToMakeVisible; final View viewToMakeVisible = getChildAt(indexToMakeVisible); int goalTop = listTop; diff --git a/core/java/com/android/internal/os/SomeArgs.java b/core/java/com/android/internal/os/SomeArgs.java index 88e58dc..6fb72f1 100644 --- a/core/java/com/android/internal/os/SomeArgs.java +++ b/core/java/com/android/internal/os/SomeArgs.java @@ -39,6 +39,7 @@ public final class SomeArgs { public Object arg2; public Object arg3; public Object arg4; + public Object arg5; public int argi1; public int argi2; public int argi3; @@ -85,6 +86,7 @@ public final class SomeArgs { arg2 = null; arg3 = null; arg4 = null; + arg5 = null; argi1 = 0; argi2 = 0; argi3 = 0; diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index b76e89d..02bd4ac 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -34,7 +34,7 @@ public class BaseIWindow extends IWindow.Stub { } @Override - public void resized(Rect frame, Rect contentInsets, + public void resized(Rect frame, Rect overscanInsets, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { if (reportDraw) { try { diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java index a129496..18a696e 100644 --- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java +++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java @@ -41,7 +41,7 @@ public class ActionBarOverlayLayout extends FrameLayout { private ActionBarView mActionView; private View mActionBarBottom; private int mLastSystemUiVisibility; - private final Rect mZeroRect = new Rect(0, 0, 0, 0); + private final Rect mLocalInsets = new Rect(); static final int[] mActionBarSizeAttr = new int [] { com.android.internal.R.attr.actionBarSize @@ -165,13 +165,8 @@ public class ActionBarOverlayLayout extends FrameLayout { // make sure its content is not being covered by system UI... though it // will still be covered by the action bar since they have requested it to // overlay. - if ((vis & SYSTEM_UI_LAYOUT_FLAGS) == 0) { - changed |= applyInsets(mContent, insets, true, true, true, true); - // The insets are now consumed. - insets.set(0, 0, 0, 0); - } else { - changed |= applyInsets(mContent, mZeroRect, true, true, true, true); - } + boolean res = computeFitSystemWindows(insets, mLocalInsets); + changed |= applyInsets(mContent, mLocalInsets, true, true, true, true); if (stable || mActionBarTop.getVisibility() == VISIBLE) { @@ -190,7 +185,7 @@ public class ActionBarOverlayLayout extends FrameLayout { if (mActionView.isSplitActionBar()) { if (stable || (mActionBarBottom != null && mActionBarBottom.getVisibility() == VISIBLE)) { - // If action bar is split, adjust buttom insets for it. + // If action bar is split, adjust bottom insets for it. insets.bottom += mActionBarHeight; } } @@ -199,7 +194,8 @@ public class ActionBarOverlayLayout extends FrameLayout { requestLayout(); } - return super.fitSystemWindows(insets); + super.fitSystemWindows(insets); + return true; } void pullChildren() { diff --git a/core/jni/Android.mk b/core/jni/Android.mk index c6b7631..2544c54 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -162,7 +162,8 @@ LOCAL_C_INCLUDES += \ external/skia/include/effects \ external/skia/include/images \ external/skia/include/ports \ - external/skia/src/ports \ + external/skia/src/core \ + external/skia/src/images \ external/skia/include/utils \ external/sqlite/dist \ external/sqlite/android \ diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index b7fdecf..daabce3 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -231,7 +231,7 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding, } SkAutoTDelete<SkImageDecoder> add(decoder); - SkAutoTDelete<SkBitmap> adb(bitmap, !useExistingBitmap); + SkAutoTDelete<SkBitmap> adb(!useExistingBitmap ? bitmap : NULL); decoder->setPeeker(&peeker); if (!isPurgeable) { diff --git a/core/jni/android/graphics/Canvas.cpp b/core/jni/android/graphics/Canvas.cpp index 886eb6e..6410bc3 100644 --- a/core/jni/android/graphics/Canvas.cpp +++ b/core/jni/android/graphics/Canvas.cpp @@ -65,6 +65,16 @@ public: return bitmap ? new SkCanvas(*bitmap) : new SkCanvas; } + static void copyCanvasState(JNIEnv* env, jobject clazz, + SkCanvas* srcCanvas, SkCanvas* dstCanvas) { + if (srcCanvas && dstCanvas) { + if (NULL != srcCanvas->getDevice() && NULL != dstCanvas->getDevice()) { + dstCanvas->clipRegion(srcCanvas->getTotalClip()); + } + dstCanvas->setMatrix(srcCanvas->getTotalMatrix()); + } + } + static void freeCaches(JNIEnv* env, jobject) { // these are called in no particular order SkImageRef_GlobalPool::SetRAMUsed(0); @@ -93,14 +103,6 @@ public: return canvas->getDevice()->accessBitmap(false).height(); } - static void setBitmap(JNIEnv* env, jobject, SkCanvas* canvas, SkBitmap* bitmap) { - if (bitmap) { - canvas->setBitmapDevice(*bitmap); - } else { - canvas->setDevice(NULL); - } - } - static int saveAll(JNIEnv* env, jobject jcanvas) { NPE_CHECK_RETURN_ZERO(env, jcanvas); return GraphicsJNI::getNativeCanvas(env, jcanvas)->save(); @@ -278,25 +280,25 @@ public: canvas->setDrawFilter(filter); } - static jboolean quickReject__RectFI(JNIEnv* env, jobject, SkCanvas* canvas, - jobject rect, int edgetype) { + static jboolean quickReject__RectF(JNIEnv* env, jobject, SkCanvas* canvas, + jobject rect) { SkRect rect_; GraphicsJNI::jrectf_to_rect(env, rect, &rect_); - return canvas->quickReject(rect_, (SkCanvas::EdgeType)edgetype); + return canvas->quickReject(rect_); } - - static jboolean quickReject__PathI(JNIEnv* env, jobject, SkCanvas* canvas, - SkPath* path, int edgetype) { - return canvas->quickReject(*path, (SkCanvas::EdgeType)edgetype); + + static jboolean quickReject__Path(JNIEnv* env, jobject, SkCanvas* canvas, + SkPath* path) { + return canvas->quickReject(*path); } - - static jboolean quickReject__FFFFI(JNIEnv* env, jobject, SkCanvas* canvas, + + static jboolean quickReject__FFFF(JNIEnv* env, jobject, SkCanvas* canvas, jfloat left, jfloat top, jfloat right, - jfloat bottom, int edgetype) { + jfloat bottom) { SkRect r; r.set(SkFloatToScalar(left), SkFloatToScalar(top), SkFloatToScalar(right), SkFloatToScalar(bottom)); - return canvas->quickReject(r, (SkCanvas::EdgeType)edgetype); + return canvas->quickReject(r); } static void drawRGB(JNIEnv* env, jobject, SkCanvas* canvas, @@ -930,12 +932,19 @@ static void doDrawTextDecorations(SkCanvas* canvas, jfloat x, jfloat y, jfloat l jobject bounds) { SkRect r; SkIRect ir; - bool result = canvas->getClipBounds(&r, SkCanvas::kBW_EdgeType); + bool result = canvas->getClipBounds(&r); if (!result) { r.setEmpty(); + } else { + // ensure the clip is not larger than the canvas + SkRect canvasRect; + SkISize deviceSize = canvas->getDeviceSize(); + canvasRect.iset(0, 0, deviceSize.fWidth, deviceSize.fHeight); + r.intersect(canvasRect); } r.round(&ir); + (void)GraphicsJNI::irect_to_jrect(ir, env, bounds); return result; } @@ -949,10 +958,10 @@ static void doDrawTextDecorations(SkCanvas* canvas, jfloat x, jfloat y, jfloat l static JNINativeMethod gCanvasMethods[] = { {"finalizer", "(I)V", (void*) SkCanvasGlue::finalizer}, {"initRaster","(I)I", (void*) SkCanvasGlue::initRaster}, + {"copyNativeCanvasState","(II)V", (void*) SkCanvasGlue::copyCanvasState}, {"isOpaque","()Z", (void*) SkCanvasGlue::isOpaque}, {"getWidth","()I", (void*) SkCanvasGlue::getWidth}, {"getHeight","()I", (void*) SkCanvasGlue::getHeight}, - {"native_setBitmap","(II)V", (void*) SkCanvasGlue::setBitmap}, {"save","()I", (void*) SkCanvasGlue::saveAll}, {"save","(I)I", (void*) SkCanvasGlue::save}, {"native_saveLayer","(ILandroid/graphics/RectF;II)I", @@ -984,10 +993,10 @@ static JNINativeMethod gCanvasMethods[] = { {"native_getClipBounds","(ILandroid/graphics/Rect;)Z", (void*) SkCanvasGlue::getClipBounds}, {"native_getCTM", "(II)V", (void*)SkCanvasGlue::getCTM}, - {"native_quickReject","(ILandroid/graphics/RectF;I)Z", - (void*) SkCanvasGlue::quickReject__RectFI}, - {"native_quickReject","(III)Z", (void*) SkCanvasGlue::quickReject__PathI}, - {"native_quickReject","(IFFFFI)Z", (void*)SkCanvasGlue::quickReject__FFFFI}, + {"native_quickReject","(ILandroid/graphics/RectF;)Z", + (void*) SkCanvasGlue::quickReject__RectF}, + {"native_quickReject","(II)Z", (void*) SkCanvasGlue::quickReject__Path}, + {"native_quickReject","(IFFFF)Z", (void*)SkCanvasGlue::quickReject__FFFF}, {"native_drawRGB","(IIII)V", (void*) SkCanvasGlue::drawRGB}, {"native_drawARGB","(IIIII)V", (void*) SkCanvasGlue::drawARGB}, {"native_drawColor","(II)V", (void*) SkCanvasGlue::drawColor__I}, diff --git a/core/jni/android/graphics/NinePatchImpl.cpp b/core/jni/android/graphics/NinePatchImpl.cpp index ff0eb45..01e7e3e 100644 --- a/core/jni/android/graphics/NinePatchImpl.cpp +++ b/core/jni/android/graphics/NinePatchImpl.cpp @@ -105,7 +105,7 @@ SkScalar calculateStretch(SkScalar boundsLimit, SkScalar startingPoint, void NinePatch_Draw(SkCanvas* canvas, const SkRect& bounds, const SkBitmap& bitmap, const android::Res_png_9patch& chunk, const SkPaint* paint, SkRegion** outRegion) { - if (canvas && canvas->quickReject(bounds, SkCanvas::kBW_EdgeType)) { + if (canvas && canvas->quickReject(bounds)) { return; } diff --git a/core/jni/android/graphics/Region.cpp b/core/jni/android/graphics/Region.cpp index ab7cf46..ded2186 100644 --- a/core/jni/android/graphics/Region.cpp +++ b/core/jni/android/graphics/Region.cpp @@ -177,7 +177,7 @@ static SkRegion* Region_createFromParcel(JNIEnv* env, jobject clazz, jobject par SkRegion* region = new SkRegion; size_t size = p->readInt32(); - region->unflatten(p->readInplace(size)); + region->readFromMemory(p->readInplace(size)); return region; } @@ -190,9 +190,9 @@ static jboolean Region_writeToParcel(JNIEnv* env, jobject clazz, const SkRegion* android::Parcel* p = android::parcelForJavaObject(env, parcel); - size_t size = region->flatten(NULL); + size_t size = region->writeToMemory(NULL); p->writeInt32(size); - region->flatten(p->writeInplace(size)); + region->writeToMemory(p->writeInplace(size)); return true; } diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 60c6183..1a8612e 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -340,7 +340,7 @@ TextLayoutShaper::TextLayoutShaper() { } void TextLayoutShaper::init() { - mDefaultTypeface = SkFontHost::CreateTypeface(NULL, NULL, NULL, 0, SkTypeface::kNormal); + mDefaultTypeface = SkFontHost::CreateTypeface(NULL, NULL, SkTypeface::kNormal); } void TextLayoutShaper::unrefTypefaces() { diff --git a/core/jni/android/graphics/Typeface.cpp b/core/jni/android/graphics/Typeface.cpp index 7f4c37b..e056b61 100644 --- a/core/jni/android/graphics/Typeface.cpp +++ b/core/jni/android/graphics/Typeface.cpp @@ -147,25 +147,6 @@ static SkTypeface* Typeface_createFromFile(JNIEnv* env, jobject, jstring jpath) return SkTypeface::CreateFromFile(str.c_str()); } -#define MIN_GAMMA (0.1f) -#define MAX_GAMMA (10.0f) -static float pinGamma(float gamma) { - if (gamma < MIN_GAMMA) { - gamma = MIN_GAMMA; - } else if (gamma > MAX_GAMMA) { - gamma = MAX_GAMMA; - } - return gamma; -} - -extern void skia_set_text_gamma(float, float); - -static void Typeface_setGammaForText(JNIEnv* env, jobject, jfloat blackGamma, - jfloat whiteGamma) { - // Comment this out for release builds. This is only used during development - skia_set_text_gamma(pinGamma(blackGamma), pinGamma(whiteGamma)); -} - /////////////////////////////////////////////////////////////////////////////// static JNINativeMethod gTypefaceMethods[] = { @@ -177,7 +158,6 @@ static JNINativeMethod gTypefaceMethods[] = { (void*)Typeface_createFromAsset }, { "nativeCreateFromFile", "(Ljava/lang/String;)I", (void*)Typeface_createFromFile }, - { "setGammaForText", "(FF)V", (void*)Typeface_setGammaForText }, }; int register_android_graphics_Typeface(JNIEnv* env) diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 7c65662..c0e12da 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -537,7 +537,10 @@ static void android_hardware_Camera_setPreviewDisplay(JNIEnv *env, jobject thiz, sp<Camera> camera = get_native_camera(env, thiz, NULL); if (camera == 0) return; - sp<Surface> surface = android_view_Surface_getSurface(env, jSurface); + sp<Surface> surface; + if (jSurface) { + surface = android_view_Surface_getSurface(env, jSurface); + } if (camera->setPreviewDisplay(surface) != NO_ERROR) { jniThrowException(env, "java/io/IOException", "setPreviewDisplay failed"); diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 6724f36..56b687c 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -159,7 +159,8 @@ static void read_mapinfo(FILE *fp, stats_t* stats) name = line + name_pos; nameLen = strlen(name); - if (strstr(name, "[heap]") == name) { + if ((strstr(name, "[heap]") == name) || + (strstr(name, "/dev/ashmem/libc malloc") == name)) { whichHeap = HEAP_NATIVE; } else if (strstr(name, "/dev/ashmem/dalvik-") == name) { whichHeap = HEAP_DALVIK; diff --git a/core/jni/android_view_GLES20Canvas.cpp b/core/jni/android_view_GLES20Canvas.cpp index a6bb7c7..ba62f6d 100644 --- a/core/jni/android_view_GLES20Canvas.cpp +++ b/core/jni/android_view_GLES20Canvas.cpp @@ -270,8 +270,7 @@ static jint android_view_GLES20Canvas_saveLayerAlphaClip(JNIEnv* env, jobject cl // ---------------------------------------------------------------------------- static bool android_view_GLES20Canvas_quickReject(JNIEnv* env, jobject clazz, - OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom, - SkCanvas::EdgeType edge) { + OpenGLRenderer* renderer, jfloat left, jfloat top, jfloat right, jfloat bottom) { return renderer->quickReject(left, top, right, bottom); } @@ -961,7 +960,7 @@ static JNINativeMethod gMethods[] = { { "nSaveLayerAlpha", "(IFFFFII)I", (void*) android_view_GLES20Canvas_saveLayerAlpha }, { "nSaveLayerAlpha", "(III)I", (void*) android_view_GLES20Canvas_saveLayerAlphaClip }, - { "nQuickReject", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_quickReject }, + { "nQuickReject", "(IFFFF)Z", (void*) android_view_GLES20Canvas_quickReject }, { "nClipRect", "(IFFFFI)Z", (void*) android_view_GLES20Canvas_clipRectF }, { "nClipRect", "(IIIIII)Z", (void*) android_view_GLES20Canvas_clipRect }, { "nClipPath", "(III)Z", (void*) android_view_GLES20Canvas_clipPath }, diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 6cd1a5c..b4a19f1 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -55,7 +55,6 @@ static struct { jfieldID mNativeObject; jfieldID mGenerationId; jfieldID mCanvas; - jfieldID mCanvasSaveCount; jmethodID ctor; } gSurfaceClassInfo; @@ -67,10 +66,15 @@ static struct { } gRectClassInfo; static struct { + jfieldID mFinalizer; jfieldID mNativeCanvas; jfieldID mSurfaceFormat; } gCanvasClassInfo; +static struct { + jfieldID mNativeCanvas; +} gCanvasFinalizerClassInfo; + // ---------------------------------------------------------------------------- bool android_view_Surface_isInstanceOf(JNIEnv* env, jobject obj) { @@ -180,6 +184,15 @@ static inline SkBitmap::Config convertPixelFormat(PixelFormat format) { } } +static inline void swapCanvasPtr(JNIEnv* env, jobject canvasObj, SkCanvas* newCanvas) { + jobject canvasFinalizerObj = env->GetObjectField(canvasObj, gCanvasClassInfo.mFinalizer); + SkCanvas* previousCanvas = reinterpret_cast<SkCanvas*>( + env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas)); + env->SetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas, (int)newCanvas); + env->SetIntField(canvasFinalizerObj, gCanvasFinalizerClassInfo.mNativeCanvas, (int)newCanvas); + SkSafeUnref(previousCanvas); +} + static jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jint nativeObject, jobject dirtyRectObj) { sp<Surface> surface(reinterpret_cast<Surface *>(nativeObject)); @@ -219,8 +232,6 @@ static jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jint nativeObje jobject canvasObj = env->GetObjectField(surfaceObj, gSurfaceClassInfo.mCanvas); env->SetIntField(canvasObj, gCanvasClassInfo.mSurfaceFormat, outBuffer.format); - SkCanvas* nativeCanvas = reinterpret_cast<SkCanvas*>( - env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas)); SkBitmap bitmap; ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format); bitmap.setConfig(convertPixelFormat(outBuffer.format), outBuffer.width, outBuffer.height, bpr); @@ -233,7 +244,9 @@ static jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jint nativeObje // be safe with an empty bitmap. bitmap.setPixels(NULL); } - nativeCanvas->setBitmapDevice(bitmap); + + SkCanvas* nativeCanvas = SkNEW_ARGS(SkCanvas, (bitmap)); + swapCanvasPtr(env, canvasObj, nativeCanvas); SkRegion clipReg; if (dirtyRegion.isRect()) { // very common case @@ -250,9 +263,6 @@ static jobject nativeLockCanvas(JNIEnv* env, jobject surfaceObj, jint nativeObje nativeCanvas->clipRegion(clipReg); - int saveCount = nativeCanvas->save(); - env->SetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount, saveCount); - if (dirtyRectObj) { const Rect& bounds(dirtyRegion.getBounds()); env->SetIntField(dirtyRectObj, gRectClassInfo.left, bounds.left); @@ -277,12 +287,8 @@ static void nativeUnlockCanvasAndPost(JNIEnv* env, jobject surfaceObj, jint nati } // detach the canvas from the surface - SkCanvas* nativeCanvas = reinterpret_cast<SkCanvas*>( - env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas)); - int saveCount = env->GetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount); - nativeCanvas->restoreToCount(saveCount); - nativeCanvas->setBitmapDevice(SkBitmap()); - env->SetIntField(surfaceObj, gSurfaceClassInfo.mCanvasSaveCount, 0); + SkCanvas* nativeCanvas = SkNEW(SkCanvas); + swapCanvasPtr(env, canvasObj, nativeCanvas); // unlock surface status_t err = surface->unlockAndPost(); @@ -382,14 +388,16 @@ int register_android_view_Surface(JNIEnv* env) env->GetFieldID(gSurfaceClassInfo.clazz, "mGenerationId", "I"); gSurfaceClassInfo.mCanvas = env->GetFieldID(gSurfaceClassInfo.clazz, "mCanvas", "Landroid/graphics/Canvas;"); - gSurfaceClassInfo.mCanvasSaveCount = - env->GetFieldID(gSurfaceClassInfo.clazz, "mCanvasSaveCount", "I"); - gSurfaceClassInfo.ctor = env->GetMethodID(gSurfaceClassInfo.clazz, "<init>", "(I)V"); + gSurfaceClassInfo.ctor = env->GetMethodID(gSurfaceClassInfo.clazz, "<init>", "()V"); clazz = env->FindClass("android/graphics/Canvas"); + gCanvasClassInfo.mFinalizer = env->GetFieldID(clazz, "mFinalizer", "Landroid/graphics/Canvas$CanvasFinalizer;"); gCanvasClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I"); gCanvasClassInfo.mSurfaceFormat = env->GetFieldID(clazz, "mSurfaceFormat", "I"); + clazz = env->FindClass("android/graphics/Canvas$CanvasFinalizer"); + gCanvasFinalizerClassInfo.mNativeCanvas = env->GetFieldID(clazz, "mNativeCanvas", "I"); + clazz = env->FindClass("android/graphics/Rect"); gRectClassInfo.left = env->GetFieldID(clazz, "left", "I"); gRectClassInfo.top = env->GetFieldID(clazz, "top", "I"); diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index e477e54..a218488 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -110,6 +110,7 @@ protected: virtual void onUnlockPixels() { } + SK_DECLARE_UNFLATTENABLE_OBJECT() private: ScreenshotClient mScreenshot; SkColorTable* fCTable; diff --git a/core/jni/android_view_TextureView.cpp b/core/jni/android_view_TextureView.cpp index e75a2d8..8a89db5 100644 --- a/core/jni/android_view_TextureView.cpp +++ b/core/jni/android_view_TextureView.cpp @@ -43,11 +43,16 @@ static struct { } gRectClassInfo; static struct { - jfieldID nativeCanvas; - jfieldID surfaceFormat; + jfieldID mFinalizer; + jfieldID mNativeCanvas; + jfieldID mSurfaceFormat; } gCanvasClassInfo; static struct { + jfieldID mNativeCanvas; +} gCanvasFinalizerClassInfo; + +static struct { jfieldID nativeWindow; } gTextureViewClassInfo; @@ -120,6 +125,15 @@ static void android_view_TextureView_destroyNativeWindow(JNIEnv* env, jobject te } } +static inline void swapCanvasPtr(JNIEnv* env, jobject canvasObj, SkCanvas* newCanvas) { + jobject canvasFinalizerObj = env->GetObjectField(canvasObj, gCanvasClassInfo.mFinalizer); + SkCanvas* previousCanvas = reinterpret_cast<SkCanvas*>( + env->GetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas)); + env->SetIntField(canvasObj, gCanvasClassInfo.mNativeCanvas, (int)newCanvas); + env->SetIntField(canvasFinalizerObj, gCanvasFinalizerClassInfo.mNativeCanvas, (int)newCanvas); + SkSafeUnref(previousCanvas); +} + static void android_view_TextureView_lockCanvas(JNIEnv* env, jobject, jint nativeWindow, jobject canvas, jobject dirtyRect) { @@ -157,9 +171,10 @@ static void android_view_TextureView_lockCanvas(JNIEnv* env, jobject, bitmap.setPixels(NULL); } - SET_INT(canvas, gCanvasClassInfo.surfaceFormat, buffer.format); - SkCanvas* nativeCanvas = (SkCanvas*) GET_INT(canvas, gCanvasClassInfo.nativeCanvas); - nativeCanvas->setBitmapDevice(bitmap); + SET_INT(canvas, gCanvasClassInfo.mSurfaceFormat, buffer.format); + + SkCanvas* nativeCanvas = SkNEW_ARGS(SkCanvas, (bitmap)); + swapCanvasPtr(env, canvas, nativeCanvas); SkRect clipRect; clipRect.set(rect.left, rect.top, rect.right, rect.bottom); @@ -174,8 +189,8 @@ static void android_view_TextureView_lockCanvas(JNIEnv* env, jobject, static void android_view_TextureView_unlockCanvasAndPost(JNIEnv* env, jobject, jint nativeWindow, jobject canvas) { - SkCanvas* nativeCanvas = (SkCanvas*) GET_INT(canvas, gCanvasClassInfo.nativeCanvas); - nativeCanvas->setBitmapDevice(SkBitmap()); + SkCanvas* nativeCanvas = SkNEW(SkCanvas); + swapCanvasPtr(env, canvas, nativeCanvas); if (nativeWindow) { sp<ANativeWindow> window((ANativeWindow*) nativeWindow); @@ -226,8 +241,12 @@ int register_android_view_TextureView(JNIEnv* env) { GET_FIELD_ID(gRectClassInfo.bottom, clazz, "bottom", "I"); FIND_CLASS(clazz, "android/graphics/Canvas"); - GET_FIELD_ID(gCanvasClassInfo.nativeCanvas, clazz, "mNativeCanvas", "I"); - GET_FIELD_ID(gCanvasClassInfo.surfaceFormat, clazz, "mSurfaceFormat", "I"); + GET_FIELD_ID(gCanvasClassInfo.mFinalizer, clazz, "mFinalizer", "Landroid/graphics/Canvas$CanvasFinalizer;"); + GET_FIELD_ID(gCanvasClassInfo.mNativeCanvas, clazz, "mNativeCanvas", "I"); + GET_FIELD_ID(gCanvasClassInfo.mSurfaceFormat, clazz, "mSurfaceFormat", "I"); + + FIND_CLASS(clazz, "android/graphics/Canvas$CanvasFinalizer"); + GET_FIELD_ID(gCanvasFinalizerClassInfo.mNativeCanvas, clazz, "mNativeCanvas", "I"); FIND_CLASS(clazz, "android/view/TextureView"); GET_FIELD_ID(gTextureViewClassInfo.nativeWindow, clazz, "mNativeWindow", "I"); diff --git a/core/res/res/anim/rotation_animation_enter.xml b/core/res/res/anim/rotation_animation_enter.xml new file mode 100644 index 0000000..a674e1d --- /dev/null +++ b/core/res/res/anim/rotation_animation_enter.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<set xmlns:android="http://schemas.android.com/apk/res/android"> + <alpha android:fromAlpha="1.0" android:toAlpha="1.0" + android:duration="0" + android:interpolator="@interpolator/decelerate_quad" /> +</set> diff --git a/core/res/res/anim/rotation_animation_jump_exit.xml b/core/res/res/anim/rotation_animation_jump_exit.xml new file mode 100644 index 0000000..3338529 --- /dev/null +++ b/core/res/res/anim/rotation_animation_jump_exit.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<set xmlns:android="http://schemas.android.com/apk/res/android"> + <alpha android:fromAlpha="1.0" android:toAlpha="0.0" + android:duration="0" + android:interpolator="@interpolator/decelerate_quad" /> +</set> diff --git a/core/res/res/anim/rotation_animation_xfade_exit.xml b/core/res/res/anim/rotation_animation_xfade_exit.xml new file mode 100644 index 0000000..7300724 --- /dev/null +++ b/core/res/res/anim/rotation_animation_xfade_exit.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* Copyright 2013, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<set xmlns:android="http://schemas.android.com/apk/res/android"> + <alpha android:fromAlpha="1.0" android:toAlpha="0.0" + android:duration="500" + android:interpolator="@interpolator/decelerate_quad" /> +</set> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 4cb7888..a64758c 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Altydaan-VPN koppel tans..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Altydaan-VPN gekoppel"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Altydaan-VPN-fout"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Raak om verbinding terug te stel"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Kies lêer"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Geen lêer gekies nie"</string> <string name="reset" msgid="2448168080964209908">"Stel terug"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 54b5f6f..2a23541 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ሁልጊዜ የበራ VPN በመገናኘት ላይ…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ሁልጊዜ የበራ VPN ተገናኝቷል"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ሁልጊዜ የበራ VPN ስህተት"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"ግንኙነት ዳግም ለማስጀመር ይንኩ"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"ፋይል ምረጥ"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ምንም ፋይል አልተመረጠም"</string> <string name="reset" msgid="2448168080964209908">"ዳግም አስጀምር"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index a9ac95d..cba7680 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"جارٍ الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"تم الاتصال بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطأ بشبكة ظاهرية خاصة (VPN) دائمة التشغيل"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"المس لإعادة تعيين الاتصال"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"اختيار ملف"</string> <string name="no_file_chosen" msgid="6363648562170759465">"لم يتم اختيار أي ملف"</string> <string name="reset" msgid="2448168080964209908">"إعادة تعيين"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index c1cb9d5..a2284ce 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Падключэнне заўсёды ўключанага VPN..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Заўсёды ўключаны i падключаны VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Памылка заўсёды ўключанага VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Націсніце, каб скінуць падключэнне"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Выберыце файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Файл не выбраны"</string> <string name="reset" msgid="2448168080964209908">"Скінуць"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 158134e..cc8ec59 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Установява се връзка с винаги включената виртуална частна мрежа (VPN)…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Установена е връзка с винаги включената виртуална частна мрежа (VPN)"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка във винаги включената виртуална частна мрежа (VPN)"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Докоснете, за да възстановите връзката"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Избор на файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Няма избран файл"</string> <string name="reset" msgid="2448168080964209908">"Повторно задаване"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index e3ee35d..4e8aa9c 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"T\'estàs connectant a la VPN sempre activada…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Estàs connectat a la VPN sempre activada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error de la VPN sempre activada"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Toca per restablir la connexió"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Trieu un fitxer"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No s\'ha escollit cap fitxer"</string> <string name="reset" msgid="2448168080964209908">"Reinicia"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 35798a4..76c17de 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Připojování k trvalé síti VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Je připojena trvalá síť VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Chyba trvalé sítě VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Klepnutím resetujete připojení"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Zvolit soubor"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Není vybrán žádný soubor"</string> <string name="reset" msgid="2448168080964209908">"Resetovat"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 477f313..6b01a68 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Opretter forbindelse til Always-on VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN er forbundet"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fejl i Always-on VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Tryk for at nulstille forbindelsen"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Vælg fil"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil er valgt"</string> <string name="reset" msgid="2448168080964209908">"Nulstil"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 770cc61..7fb0014 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Verbindung zu durchgehend aktivem VPN wird hergestellt…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Mit durchgehend aktivem VPN verbunden"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Durchgehend aktives VPN – Verbindungsfehler"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Zum Zurücksetzen der Verbindung tippen"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Datei auswählen"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Keine ausgewählt"</string> <string name="reset" msgid="2448168080964209908">"Zurücksetzen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 5e3c56b..3307abf 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Σύνδεση πάντα ενεργοποιημένου VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Έχει συνδεθεί πάντα ενεργοποιημένο VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Σφάλμα πάντα ενεργοποιημένου VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Αγγίξτε για επαναφορά της σύνδεσης"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Επιλογή αρχείου"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Δεν έχει επιλεγεί αρχείο"</string> <string name="reset" msgid="2448168080964209908">"Επαναφορά"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 4af1886..a695432 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN connecting…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN connected"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Always-on VPN error"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Touch to reset connection"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Choose file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No file chosen"</string> <string name="reset" msgid="2448168080964209908">"Reset"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 8517662..3aa900f 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Estableciendo conexión con la VPN siempre activada..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Se estableció conexión con la VPN siempre activada."</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Se produjo un error al establecer conexión con la VPN siempre activada."</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Toca para restablecer la conexión."</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Elegir archivo"</string> <string name="no_file_chosen" msgid="6363648562170759465">"No se seleccionó un archivo."</string> <string name="reset" msgid="2448168080964209908">"Restablecer"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 2b657c8..788c265 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Conectando VPN siempre activada…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN siempre activada conectada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error de VPN siempre activada"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Toca para restablecer la conexión."</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Seleccionar archivo"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Archivo no seleccionado"</string> <string name="reset" msgid="2448168080964209908">"Restablecer"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 3303f00..3312381e 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ühendamine alati sees VPN-iga …"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ühendatud alati sees VPN-iga"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Alati sees VPN-i viga"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Ühenduse lähtestamiseks puudutage"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Valige fail"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ühtegi faili pole valitud"</string> <string name="reset" msgid="2448168080964209908">"Lähtesta"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index b4a15c5..b6e3abe 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"در حال اتصال VPN همیشه فعال…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN همیشه فعال متصل شد"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"خطای VPN همیشه فعال"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"برای بازنشانی اتصال لمس کنید"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"انتخاب فایل"</string> <string name="no_file_chosen" msgid="6363648562170759465">"هیچ فایلی انتخاب نشد"</string> <string name="reset" msgid="2448168080964209908">"بازنشانی"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 45f4a05..92712bc 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Yhdistetään aina käytössä olevaan VPN-verkkoon..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Yhdistetty aina käytössä olevaan VPN-verkkoon"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Aina käytössä oleva VPN: virhe"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Nollaa yhteys koskettamalla"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Valitse tiedosto"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ei valittua tiedostoa"</string> <string name="reset" msgid="2448168080964209908">"Palauta"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index c94946e..4c8ccc5 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1062,7 +1062,7 @@ <string name="noApplications" msgid="2991814273936504689">"Aucune application ne peut effectuer cette action."</string> <string name="aerr_title" msgid="1905800560317137752"></string> <string name="aerr_application" msgid="932628488013092776">"L\'application \"<xliff:g id="APPLICATION">%1$s</xliff:g>\" s\'est arrêtée."</string> - <string name="aerr_process" msgid="4507058997035697579">"Malheureusement, le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est arrêté."</string> + <string name="aerr_process" msgid="4507058997035697579">"Le processus <xliff:g id="PROCESS">%1$s</xliff:g> s\'est interrompu."</string> <string name="anr_title" msgid="4351948481459135709"></string> <string name="anr_activity_application" msgid="1904477189057199066">"L\'application <xliff:g id="APPLICATION">%2$s</xliff:g> ne répond pas."\n\n"Voulez-vous quitter ?"</string> <string name="anr_activity_process" msgid="5776209883299089767">"L\'activité <xliff:g id="ACTIVITY">%1$s</xliff:g> ne répond pas."\n\n"Voulez-vous quitter ?"</string> @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN permanent en cours de connexion…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN permanent connecté"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erreur du VPN permanent"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Appuyez sur l\'écran pour réinitialiser la connexion."</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Sélectionner un fichier"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Aucun fichier sélectionné"</string> <string name="reset" msgid="2448168080964209908">"Réinitialiser"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 3521f4b..057f620 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"हमेशा-चालू VPN कनेक्ट हो रहा है…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"हमेशा-चालू VPN कनेक्ट है"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"हमेशा-चालू VPN त्रुटि"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"कनेक्शन रीसेट करने के लिए स्पर्श करें"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"फ़ाइल चुनें"</string> <string name="no_file_chosen" msgid="6363648562170759465">"कोई फ़ाइल चुनी नहीं गई"</string> <string name="reset" msgid="2448168080964209908">"रीसेट करें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index ce7e954..cf566d7 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezivanje s uvijek uključenom VPN mrežom…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Povezan s uvijek uključenom VPN mrežom"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Pogreška uvijek uključene VPN mreže"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Dodirnite za poništavanje veze"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Odaberite datoteku"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nema odabranih datoteka"</string> <string name="reset" msgid="2448168080964209908">"Ponovo postavi"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index d74810a..02c80a6 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -994,7 +994,7 @@ <item quantity="other" msgid="2973062968038355991">"<xliff:g id="COUNT">%d</xliff:g> nap múlva"</item> </plurals> <string name="preposition_for_date" msgid="9093949757757445117">"e napon: <xliff:g id="DATE">%s</xliff:g>"</string> - <string name="preposition_for_time" msgid="5506831244263083793">"ekkor: <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="preposition_for_time" msgid="5506831244263083793">"<xliff:g id="TIME">%s</xliff:g>"</string> <string name="preposition_for_year" msgid="5040395640711867177">"év: <xliff:g id="YEAR">%s</xliff:g>"</string> <string name="day" msgid="8144195776058119424">"nap"</string> <string name="days" msgid="4774547661021344602">"nap"</string> @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Csatlakozás a mindig bekapcsolt VPN-hez..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Csatlakozva a mindig bekapcsolt VPN-hez"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Hiba a mindig bekapcsolt VPN-nel"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Érintse meg a kapcsolat alaphelyzetbe állításához."</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Fájl kiválasztása"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nincs fájl kiválasztva"</string> <string name="reset" msgid="2448168080964209908">"Alaphelyzet"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index d0b4d61..f0fd1ef 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Menyambungkan VPN selalu aktif..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN selalu aktif tersambung"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kesalahan VPN selalu aktif"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Sentuh untuk menyetel ulang sambungan"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Pilih file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Tidak ada file yang dipilih"</string> <string name="reset" msgid="2448168080964209908">"Setel ulang"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 87d21fe..ad9a94d 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Connessione a VPN sempre attiva…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre attiva connessa"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Errore VPN sempre attiva"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Tocca per ripristinare la connessione"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Scegli file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nessun file è stato scelto"</string> <string name="reset" msgid="2448168080964209908">"Reimposta"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index d698a77..9a2275b 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"ה-VPN שמופעל תמיד, מתחבר..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"ה-VPN שפועל תמיד, מחובר"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"שגיאת VPN שמופעל תמיד"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"גע כדי לאפס את החיבור"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"בחר קובץ"</string> <string name="no_file_chosen" msgid="6363648562170759465">"לא נבחר קובץ"</string> <string name="reset" msgid="2448168080964209908">"איפוס"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index fb7ceb9..df3d6f7 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPNに常時接続しています…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPNに常時接続しました"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"常時接続VPNのエラー"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"接続をリセットするにはタップします"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"ファイルを選択"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ファイルが選択されていません"</string> <string name="reset" msgid="2448168080964209908">"リセット"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 53fbeb4..67192dd 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"연결 유지 VPN에 연결하는 중…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"연결 유지 VPN에 연결됨"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"연결 유지 VPN 오류"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"터치하여 연결 재설정"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"파일 선택"</string> <string name="no_file_chosen" msgid="6363648562170759465">"파일을 선택하지 않았습니다."</string> <string name="reset" msgid="2448168080964209908">"초기화"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3b6e440..22656ff 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Prisijungiama prie visada įjungto VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Prisijungta prie visada įjungto VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Visada įjungto VPN klaida"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Palieskite, kad iš naujo nustatytumėte ryšį"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Pasirinkti failą"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nepasirinktas joks failas"</string> <string name="reset" msgid="2448168080964209908">"Atstatyti"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 646b7fa..f9b3381 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Notiek savienojuma izveide ar vienmēr ieslēgtu VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Izveidots savienojums ar vienmēr ieslēgtu VPN."</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kļūda saistībā ar vienmēr ieslēgtu VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Pieskarieties, lai atiestatītu savienojumu."</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Izvēlēties failu"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Neviens fails nav izvēlēts"</string> <string name="reset" msgid="2448168080964209908">"Atiestatīt"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 784a424..d9b39aa 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sentiasa hidup sedang disambungkan..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sentiasa hidup telah disambungkan"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Ralat VPN sentiasa hidup"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Sentuh untuk menetapkan semula sambungan"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Pilih fail"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Tiada fail dipilih"</string> <string name="reset" msgid="2448168080964209908">"Tetapkan semula"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 485a11f..4e7eba8 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Alltid-på VPN kobler til ..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Alltid-på VPN er tilkoblet"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Alltid-på VPN-feil"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Trykk for å tilbakestille tilkoblingen"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Velg fil"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil er valgt"</string> <string name="reset" msgid="2448168080964209908">"Tilbakestill"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 95da93b..8af7e4c 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Always-on VPN-verbinding maken…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Always-on VPN-verbinding"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fout met Always-on VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Raak dit aan om de verbinding opnieuw in te stellen"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Bestand kiezen"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Geen bestand geselecteerd"</string> <string name="reset" msgid="2448168080964209908">"Opnieuw instellen"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index f15c106..e7bee92 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Łączę z zawsze włączoną siecią VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Połączono z zawsze włączoną siecią VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Błąd zawsze włączonej sieci VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Kliknij, aby zresetować połączenie"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Wybierz plik"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nie wybrano pliku"</string> <string name="reset" msgid="2448168080964209908">"Resetuj"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 7f7d6d2..552d24e 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"A ligar VPN sempre ativa..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa ligada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro da VPN sempre ativa"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Toque para repor a ligação"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Escolher ficheiro"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Não foi selecionado nenhum ficheiro"</string> <string name="reset" msgid="2448168080964209908">"Repor"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index a2c6675..db894a0 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"VPN sempre ativa conectando..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"VPN sempre ativa conectada"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Erro na VPN sempre ativa"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Toque para redefinir a conexão"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Escolher arquivo"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nenhum arquivo escolhido"</string> <string name="reset" msgid="2448168080964209908">"Redefinir"</string> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index 53729f7..b49854a 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -1993,7 +1993,7 @@ <skip /> <!-- no translation found for vpn_lockdown_error (6009249814034708175) --> <skip /> - <!-- no translation found for vpn_lockdown_reset (5365010427963548932) --> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> <skip /> <string name="upload_file" msgid="2897957172366730416">"Tscherner ina datoteca"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nagina datoteca tschernida"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index e6d142b..fe7b437 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Se efectuează conectarea la reţeaua VPN activată permanent…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Conectat(ă) la reţeaua VPN activată permanent"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Eroare de reţea VPN activată permanent"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Atingeţi pentru a reseta conexiunea"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Alegeţi un fişier"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nu au fost găsite fişiere"</string> <string name="reset" msgid="2448168080964209908">"Resetaţi"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index fa623e0..249e46b 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Подключение…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Подключено"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Ошибка"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Нажмите, чтобы сбросить соединение"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Выбрать файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Не выбран файл"</string> <string name="reset" msgid="2448168080964209908">"Сбросить"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 5f49e68..e11f93a 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Prebieha pripájanie k vždy zapnutej sieti VPN..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Pripojenie k vždy zapnutej sieti VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Chyba vždy zapnutej siete VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Dotykom obnovíte pripojenie"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Zvoliť súbor"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nie je vybratý žiadny súbor"</string> <string name="reset" msgid="2448168080964209908">"Obnoviť"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index aa240de..5a3f897 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Povezovanje v stalno vklopljeno navidezno zasebno omrežje ..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Vzpostavljena povezava v stalno vklopljeno navidezno zasebno omrežje"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Napaka stalno vklopljenega navideznega zasebnega omrežja"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Dotaknite se, da ponastavite povezavo"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Izberi datoteko"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Nobena datoteka ni izbrana"</string> <string name="reset" msgid="2448168080964209908">"Ponastavi"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 7a3ff07..2072c7e 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Повезивање стално укљученог VPN-а..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Стално укључени VPN је повезан"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Грешка стално укљученог VPN-а"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Додирните да бисте ресетовали везу"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Одабери датотеку"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Није изабрана ниједна датотека"</string> <string name="reset" msgid="2448168080964209908">"Поново постави"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index eca52e6..1b4cba5 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Ansluter till Always-on VPN ..."</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Ansluten till Always-on VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Fel på Always-on VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Tryck för att återställa anslutningen"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Välj fil"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ingen fil har valts"</string> <string name="reset" msgid="2448168080964209908">"Återställ"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 554921b..a678e1f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Kila mara VPN iliyowashwa inaunganishwa…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Kila mara VPN iliyowashwa imeunganishwa"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Kila mara kuna hitilafu ya VPN iliyowashwa"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Gusa ili kuweka upya muunganisho"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Chagua faili"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Hakuna faili iliyochaguliwa"</string> <string name="reset" msgid="2448168080964209908">"Weka upya"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index af28134..01a9fec 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"กำลังเชื่อมต่อ VPN แบบเปิดตลอดเวลา…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"เชื่อมต่อ VPN แบบเปิดตลอดเวลาแล้ว"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"ข้อผิดพลาดของ VPN แบบเปิดตลอดเวลา"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"แตะเพื่อรีเซ็ตการเชื่อมต่อ"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"เลือกไฟล์"</string> <string name="no_file_chosen" msgid="6363648562170759465">"ไม่ได้เลือกไฟล์ไว้"</string> <string name="reset" msgid="2448168080964209908">"รีเซ็ต"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 6268786..4de813a 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Kumukonekta ang Always-on VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Nakakonekta ang Always-on VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Error sa Always-on VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Pindutin upang i-reset ang koneksyon"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Pumili ng file"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Walang napiling file"</string> <string name="reset" msgid="2448168080964209908">"I-reset"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 21fe6d4..cfc3c7b 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Her zaman açık VPN\'ye bağlanılıyor…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Her zaman açık VPN\'ye bağlanıldı"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Her zaman açık VPN hatası"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Bağlantıyı sıfırlamak için dokunun"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Dosya seç"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Seçili dosya yok"</string> <string name="reset" msgid="2448168080964209908">"Sıfırla"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index ce5fdc0..095c364 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Під’єднання до постійної мережі VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Під’єднано до постійної мережі VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Помилка постійної мережі VPN"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Торкніться, щоб скинути з’єднання"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Виберіть файл"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Не вибрано файл"</string> <string name="reset" msgid="2448168080964209908">"Віднов."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 7edb530..2918928 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Đang kết nối VPN luôn bật…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Đã kết nối VPN luôn bật"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Lỗi VPN luôn bật"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Chạm để đặt lại kết nối"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Chọn tệp"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Không có tệp nào được chọn"</string> <string name="reset" msgid="2448168080964209908">"Đặt lại"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 1406064..dcfc35f 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在连接到始终开启的 VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"已连接到始终开启的 VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"始终开启的 VPN 出现错误"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"触摸即可重置连接"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"选择文件"</string> <string name="no_file_chosen" msgid="6363648562170759465">"未选定任何文件"</string> <string name="reset" msgid="2448168080964209908">"重置"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index b313268..2ceb440 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"正在連線至永久連線的 VPN…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"已連線至永久連線的 VPN"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"永久連線的 VPN 發生錯誤"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"輕觸即可重設連線"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"選擇檔案"</string> <string name="no_file_chosen" msgid="6363648562170759465">"未選擇任何檔案"</string> <string name="reset" msgid="2448168080964209908">"重設"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 30893c6..01cadb7 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1269,7 +1269,8 @@ <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"I-VPN ehlala ikhanya iyaxhuma…"</string> <string name="vpn_lockdown_connected" msgid="8202679674819213931">"I-VPN ehlala ikhanya ixhunyiwe"</string> <string name="vpn_lockdown_error" msgid="6009249814034708175">"Iphutha le-VPN ehlala ikhanya"</string> - <string name="vpn_lockdown_reset" msgid="5365010427963548932">"Thinta ukuze usethe kabusha ukuxhuma"</string> + <!-- no translation found for vpn_lockdown_config (6415899150671537970) --> + <skip /> <string name="upload_file" msgid="2897957172366730416">"Khetha ifayela"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Ayikho ifayela ekhethiwe"</string> <string name="reset" msgid="2448168080964209908">"Setha kabusha"</string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 42ce336..c87cb27 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1487,6 +1487,9 @@ <java-symbol type="anim" name="screen_user_exit" /> <java-symbol type="anim" name="screen_user_enter" /> <java-symbol type="anim" name="window_move_from_decor" /> + <java-symbol type="anim" name="rotation_animation_jump_exit" /> + <java-symbol type="anim" name="rotation_animation_xfade_exit" /> + <java-symbol type="anim" name="rotation_animation_enter" /> <java-symbol type="array" name="config_autoBrightnessButtonBacklightValues" /> <java-symbol type="array" name="config_autoBrightnessKeyboardBacklightValues" /> <java-symbol type="array" name="config_autoBrightnessLcdBacklightValues" /> diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java index 53876a5..e3c7cc4 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java @@ -167,7 +167,7 @@ public class WifiStressTest ssidAppearInScanResultsCount, i)); long startTime = System.currentTimeMillis(); mAct.scanResultAvailable = false; - assertTrue("start scan failed", mAct.mWifiManager.startScanActive()); + assertTrue("start scan failed", mAct.mWifiManager.startScan()); while (true) { if ((System.currentTimeMillis() - startTime) > ConnectivityManagerTestActivity.WIFI_SCAN_TIMEOUT) { diff --git a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java index d5fcc1c..dd60dd4 100644 --- a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java +++ b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java @@ -588,7 +588,7 @@ public class ConnectionUtil { return true; } else { // Start an active scan - mWifiManager.startScanActive(); + mWifiManager.startScan(); mScanResultIsAvailable = false; long startTime = System.currentTimeMillis(); while (!mScanResultIsAvailable) { |