diff options
48 files changed, 597 insertions, 506 deletions
diff --git a/api/current.xml b/api/current.xml index 22a105a..0948888 100644 --- a/api/current.xml +++ b/api/current.xml @@ -22935,17 +22935,6 @@ visibility="public" > </field> -<field name="IMPORTANCE_HEAVY_WEIGHT" - type="int" - transient="false" - volatile="false" - value="170" - static="true" - final="true" - deprecated="not deprecated" - visibility="public" -> -</field> <field name="IMPORTANCE_PERCEPTIBLE" type="int" transient="false" @@ -36131,7 +36120,7 @@ <implements name="android.bluetooth.BluetoothProfile"> </implements> <method name="getConnectedDevices" - return="java.util.Set<android.bluetooth.BluetoothDevice>" + return="java.util.List<android.bluetooth.BluetoothDevice>" abstract="false" native="false" synchronized="false" @@ -36155,7 +36144,7 @@ </parameter> </method> <method name="getDevicesMatchingConnectionStates" - return="java.util.Set<android.bluetooth.BluetoothDevice>" + return="java.util.List<android.bluetooth.BluetoothDevice>" abstract="false" native="false" synchronized="false" @@ -37969,7 +37958,7 @@ <implements name="android.bluetooth.BluetoothProfile"> </implements> <method name="getConnectedDevices" - return="java.util.Set<android.bluetooth.BluetoothDevice>" + return="java.util.List<android.bluetooth.BluetoothDevice>" abstract="false" native="false" synchronized="false" @@ -37993,7 +37982,7 @@ </parameter> </method> <method name="getDevicesMatchingConnectionStates" - return="java.util.Set<android.bluetooth.BluetoothDevice>" + return="java.util.List<android.bluetooth.BluetoothDevice>" abstract="false" native="false" synchronized="false" @@ -38097,7 +38086,7 @@ visibility="public" > <method name="getConnectedDevices" - return="java.util.Set<android.bluetooth.BluetoothDevice>" + return="java.util.List<android.bluetooth.BluetoothDevice>" abstract="true" native="false" synchronized="false" @@ -38121,7 +38110,7 @@ </parameter> </method> <method name="getDevicesMatchingConnectionStates" - return="java.util.Set<android.bluetooth.BluetoothDevice>" + return="java.util.List<android.bluetooth.BluetoothDevice>" abstract="true" native="false" synchronized="false" @@ -111981,6 +111970,18 @@ deprecated="not deprecated" visibility="public" > +<parameter name="data" type="byte[]"> +</parameter> +<exception name="FormatException" type="android.nfc.FormatException"> +</exception> +</constructor> +<constructor name="NdefMessage" + type="android.nfc.NdefMessage" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> <parameter name="records" type="android.nfc.NdefRecord[]"> </parameter> </constructor> @@ -112006,6 +112007,17 @@ visibility="public" > </method> +<method name="toByteArray" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="writeToParcel" return="void" abstract="false" @@ -112125,6 +112137,17 @@ visibility="public" > </method> +<method name="toByteArray" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> <method name="writeToParcel" return="void" abstract="false" diff --git a/cmds/installd/commands.c b/cmds/installd/commands.c index a5b3e0e..2f03c7a 100644 --- a/cmds/installd/commands.c +++ b/cmds/installd/commands.c @@ -946,14 +946,12 @@ int linklib(const char* dataDir, const char* asecLibDir) const size_t libdirLen = strlen(dataDir) + strlen(PKG_LIB_POSTFIX); if (libdirLen >= PKG_PATH_MAX) { LOGE("library dir len too large"); - rc = -1; - goto out; + return -1; } if (snprintf(libdir, sizeof(libdir), "%s%s", dataDir, PKG_LIB_POSTFIX) != (ssize_t)libdirLen) { LOGE("library dir not written successfully: %s\n", strerror(errno)); - rc = -1; - goto out; + return -1; } if (stat(dataDir, &s) < 0) return -1; diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 5ae8a1f..fe1e7d7 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -797,10 +797,12 @@ public class ActivityManager { public static final int IMPORTANCE_PERCEPTIBLE = 130; /** - * Constant for {@link #importance}: this process is running a - * heavy-weight application and thus should not be killed. + * Constant for {@link #importance}: this process is running an + * application that can not save its state, and thus can't be killed + * while in the background. + * @hide */ - public static final int IMPORTANCE_HEAVY_WEIGHT = 170; + public static final int IMPORTANCE_CANT_SAVE_STATE = 170; /** * Constant for {@link #importance}: this process is contains services diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java index 920ef89..61b4303 100644 --- a/core/java/android/bluetooth/BluetoothA2dp.java +++ b/core/java/android/bluetooth/BluetoothA2dp.java @@ -26,11 +26,8 @@ import android.os.ServiceManager; import android.server.BluetoothA2dpService; import android.util.Log; -import java.util.Collections; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; /** @@ -167,35 +164,35 @@ public final class BluetoothA2dp implements BluetoothProfile { /** * {@inheritDoc} */ - public Set<BluetoothDevice> getConnectedDevices() { + public List<BluetoothDevice> getConnectedDevices() { if (DBG) log("getConnectedDevices()"); if (mService != null && isEnabled()) { try { - return toDeviceSet(mService.getConnectedDevices()); + return mService.getConnectedDevices(); } catch (RemoteException e) { Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } } if (mService == null) Log.w(TAG, "Proxy not attached to service"); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } /** * {@inheritDoc} */ - public Set<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { + public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { if (DBG) log("getDevicesMatchingStates()"); if (mService != null && isEnabled()) { try { - return toDeviceSet(mService.getDevicesMatchingConnectionStates(states)); + return mService.getDevicesMatchingConnectionStates(states); } catch (RemoteException e) { Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } } if (mService == null) Log.w(TAG, "Proxy not attached to service"); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } /** @@ -396,11 +393,6 @@ public final class BluetoothA2dp implements BluetoothProfile { return false; } - private Set<BluetoothDevice> toDeviceSet(BluetoothDevice[] devices) { - return Collections.unmodifiableSet( - new HashSet<BluetoothDevice>(Arrays.asList(devices))); - } - private static void log(String msg) { Log.d(TAG, msg); } diff --git a/core/java/android/bluetooth/BluetoothDeviceProfileState.java b/core/java/android/bluetooth/BluetoothDeviceProfileState.java index b33ab21..fd8f930 100644 --- a/core/java/android/bluetooth/BluetoothDeviceProfileState.java +++ b/core/java/android/bluetooth/BluetoothDeviceProfileState.java @@ -321,7 +321,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine mA2dpService.getDevicesMatchingConnectionStates( new int[] {BluetoothA2dp.STATE_CONNECTED, BluetoothProfile.STATE_CONNECTING, - BluetoothProfile.STATE_DISCONNECTING}).length == 0) { + BluetoothProfile.STATE_DISCONNECTING}).size() == 0) { mA2dpService.connect(mDevice); } if (mService.getInputDevicePriority(mDevice) == diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java index 0496b1f..c64fdbe 100644 --- a/core/java/android/bluetooth/BluetoothHeadset.java +++ b/core/java/android/bluetooth/BluetoothHeadset.java @@ -18,20 +18,16 @@ package android.bluetooth; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; -import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothDevice; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.os.RemoteException; import android.os.IBinder; +import android.os.RemoteException; import android.util.Log; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; /** * Public API for controlling the Bluetooth Headset Service. This includes both @@ -218,35 +214,35 @@ public final class BluetoothHeadset implements BluetoothProfile { /** * {@inheritDoc} */ - public Set<BluetoothDevice> getConnectedDevices() { + public List<BluetoothDevice> getConnectedDevices() { if (DBG) log("getConnectedDevices()"); if (mService != null && isEnabled()) { try { - return toDeviceSet(mService.getConnectedDevices()); + return mService.getConnectedDevices(); } catch (RemoteException e) { Log.e(TAG, Log.getStackTraceString(new Throwable())); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } } if (mService == null) Log.w(TAG, "Proxy not attached to service"); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } /** * {@inheritDoc} */ - public Set<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { + public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { if (DBG) log("getDevicesMatchingStates()"); if (mService != null && isEnabled()) { try { - return toDeviceSet(mService.getDevicesMatchingConnectionStates(states)); + return mService.getDevicesMatchingConnectionStates(states); } catch (RemoteException e) { Log.e(TAG, Log.getStackTraceString(new Throwable())); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } } if (mService == null) Log.w(TAG, "Proxy not attached to service"); - return toDeviceSet(new BluetoothDevice[0]); + return new ArrayList<BluetoothDevice>(); } /** @@ -569,11 +565,6 @@ public final class BluetoothHeadset implements BluetoothProfile { return false; } - private Set<BluetoothDevice> toDeviceSet(BluetoothDevice[] devices) { - return Collections.unmodifiableSet( - new HashSet<BluetoothDevice>(Arrays.asList(devices))); - } - private static void log(String msg) { Log.d(TAG, msg); } diff --git a/core/java/android/bluetooth/BluetoothInputDevice.java b/core/java/android/bluetooth/BluetoothInputDevice.java index 1793838..bc8a836 100644 --- a/core/java/android/bluetooth/BluetoothInputDevice.java +++ b/core/java/android/bluetooth/BluetoothInputDevice.java @@ -24,10 +24,8 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; /** * Public API for controlling the Bluetooth HID (Input Device) Profile @@ -167,18 +165,16 @@ public final class BluetoothInputDevice { /** Check if any Input Device is connected. * - * @return a unmodifiable set of connected Input Devices, or null on error. + * @return List of devices, empty List on error. * @hide */ - public Set<BluetoothDevice> getConnectedInputDevices() { + public List<BluetoothDevice> getConnectedInputDevices() { if (DBG) log("getConnectedInputDevices()"); try { - return Collections.unmodifiableSet( - new HashSet<BluetoothDevice>( - Arrays.asList(mService.getConnectedInputDevices()))); + return mService.getConnectedInputDevices(); } catch (RemoteException e) { Log.e(TAG, "", e); - return null; + return new ArrayList<BluetoothDevice>(); } } diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java index 9d0b3f2..f55e96a 100644 --- a/core/java/android/bluetooth/BluetoothPan.java +++ b/core/java/android/bluetooth/BluetoothPan.java @@ -19,15 +19,13 @@ package android.bluetooth; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.content.Context; -import android.os.ServiceManager; -import android.os.RemoteException; import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; import android.util.Log; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; /** * @hide @@ -154,18 +152,16 @@ public final class BluetoothPan { * * Does not include devices that are currently connecting or disconnecting * - * @return a unmodifiable set of connected PAN Devices, or null on error. + * @return List of PAN devices or empty on Error * @hide */ - public Set<BluetoothDevice> getConnectedDevices() { + public List<BluetoothDevice> getConnectedDevices() { if (DBG) log("getConnectedDevices"); try { - return Collections.unmodifiableSet( - new HashSet<BluetoothDevice>( - Arrays.asList(mService.getConnectedPanDevices()))); + return mService.getConnectedPanDevices(); } catch (RemoteException e) { Log.e(TAG, "", e); - return null; + return new ArrayList<BluetoothDevice>(); } } diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java index 3b4c84c..3949b26 100644 --- a/core/java/android/bluetooth/BluetoothProfile.java +++ b/core/java/android/bluetooth/BluetoothProfile.java @@ -17,10 +17,7 @@ package android.bluetooth; -import android.annotation.SdkConstant; -import android.annotation.SdkConstant.SdkConstantType; - -import java.util.Set; +import java.util.List; /** * Public APIs for the Bluetooth Profiles. @@ -150,9 +147,9 @@ public interface BluetoothProfile { * * <p>Requires {@link android.Manifest.permission#BLUETOOTH} * - * @return An unmodifiable set of devices. The set will be empty on error. + * @return List of devices. The list will be empty on error. */ - public Set<BluetoothDevice> getConnectedDevices(); + public List<BluetoothDevice> getConnectedDevices(); /** * Get a set of devices that match any of the given connection @@ -166,9 +163,9 @@ public interface BluetoothProfile { * @param states Array of states. States can be one of * {@link #STATE_CONNECTED}, {@link #STATE_CONNECTING}, * {@link #STATE_DISCONNECTED}, {@link #STATE_DISCONNECTING}, - * @return An unmodifiable set of devices. The set will be empty on error. + * @return List of devices. The list will be empty on error. */ - public Set<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states); + public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states); /** * Get the current connection state of the profile diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl index cc23146..f0252b7 100644 --- a/core/java/android/bluetooth/IBluetooth.aidl +++ b/core/java/android/bluetooth/IBluetooth.aidl @@ -81,7 +81,7 @@ interface IBluetooth // HID profile APIs boolean connectInputDevice(in BluetoothDevice device); boolean disconnectInputDevice(in BluetoothDevice device); - BluetoothDevice[] getConnectedInputDevices(); // change to Set<> once AIDL supports + List<BluetoothDevice> getConnectedInputDevices(); int getInputDeviceState(in BluetoothDevice device); boolean setInputDevicePriority(in BluetoothDevice device, int priority); int getInputDevicePriority(in BluetoothDevice device); @@ -89,7 +89,7 @@ interface IBluetooth boolean isTetheringOn(); void setBluetoothTethering(boolean value); int getPanDeviceState(in BluetoothDevice device); - BluetoothDevice[] getConnectedPanDevices(); + List<BluetoothDevice> getConnectedPanDevices(); boolean connectPanDevice(in BluetoothDevice device); boolean disconnectPanDevice(in BluetoothDevice device); } diff --git a/core/java/android/bluetooth/IBluetoothA2dp.aidl b/core/java/android/bluetooth/IBluetoothA2dp.aidl index c5044c2..b4fc366 100644 --- a/core/java/android/bluetooth/IBluetoothA2dp.aidl +++ b/core/java/android/bluetooth/IBluetoothA2dp.aidl @@ -27,9 +27,8 @@ interface IBluetoothA2dp { // Public API boolean connect(in BluetoothDevice device); boolean disconnect(in BluetoothDevice device); - // change to Set<> once AIDL supports - BluetoothDevice[] getConnectedDevices(); - BluetoothDevice[] getDevicesMatchingConnectionStates(in int[] states); + List<BluetoothDevice> getConnectedDevices(); + List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states); int getConnectionState(in BluetoothDevice device); boolean setPriority(in BluetoothDevice device, int priority); int getPriority(in BluetoothDevice device); diff --git a/core/java/android/bluetooth/IBluetoothHeadset.aidl b/core/java/android/bluetooth/IBluetoothHeadset.aidl index 8bcf103..3e4c7b4 100644 --- a/core/java/android/bluetooth/IBluetoothHeadset.aidl +++ b/core/java/android/bluetooth/IBluetoothHeadset.aidl @@ -27,9 +27,8 @@ interface IBluetoothHeadset { // Public API boolean connect(in BluetoothDevice device); boolean disconnect(in BluetoothDevice device); - // Change to Set<> when AIDL supports - BluetoothDevice[] getConnectedDevices(); - BluetoothDevice[] getDevicesMatchingConnectionStates(in int[] states); + List<BluetoothDevice> getConnectedDevices(); + List<BluetoothDevice> getDevicesMatchingConnectionStates(in int[] states); int getConnectionState(in BluetoothDevice device); boolean setPriority(in BluetoothDevice device, int priority); int getPriority(in BluetoothDevice device); diff --git a/core/java/android/net/http/CertificateChainValidator.java b/core/java/android/net/http/CertificateChainValidator.java index 503c470..218df75 100644 --- a/core/java/android/net/http/CertificateChainValidator.java +++ b/core/java/android/net/http/CertificateChainValidator.java @@ -129,57 +129,6 @@ class CertificateChainValidator { } } - // Clean up the certificates chain and build a new one. - // Theoretically, we shouldn't have to do this, but various web servers - // in practice are mis-configured to have out-of-order certificates or - // expired self-issued root certificate. - int chainLength = serverCertificates.length; - if (serverCertificates.length > 1) { - // 1. we clean the received certificates chain. - // We start from the end-entity certificate, tracing down by matching - // the "issuer" field and "subject" field until we can't continue. - // This helps when the certificates are out of order or - // some certificates are not related to the site. - int currIndex; - for (currIndex = 0; currIndex < serverCertificates.length; ++currIndex) { - boolean foundNext = false; - for (int nextIndex = currIndex + 1; - nextIndex < serverCertificates.length; - ++nextIndex) { - if (serverCertificates[currIndex].getIssuerDN().equals( - serverCertificates[nextIndex].getSubjectDN())) { - foundNext = true; - // Exchange certificates so that 0 through currIndex + 1 are in proper order - if (nextIndex != currIndex + 1) { - X509Certificate tempCertificate = serverCertificates[nextIndex]; - serverCertificates[nextIndex] = serverCertificates[currIndex + 1]; - serverCertificates[currIndex + 1] = tempCertificate; - } - break; - } - } - if (!foundNext) break; - } - - // 2. we exam if the last traced certificate is self issued and it is expired. - // If so, we drop it and pass the rest to checkServerTrusted(), hoping we might - // have a similar but unexpired trusted root. - chainLength = currIndex + 1; - X509Certificate lastCertificate = serverCertificates[chainLength - 1]; - Date now = new Date(); - if (lastCertificate.getSubjectDN().equals(lastCertificate.getIssuerDN()) - && now.after(lastCertificate.getNotAfter())) { - --chainLength; - } - } - - // 3. Now we copy the newly built chain into an appropriately sized array. - X509Certificate[] newServerCertificates = null; - newServerCertificates = new X509Certificate[chainLength]; - for (int i = 0; i < chainLength; ++i) { - newServerCertificates[i] = serverCertificates[i]; - } - // first, we validate the new chain using the standard validation // solution; if we do not find any errors, we are done; if we // fail the standard validation, we re-validate again below, @@ -188,7 +137,7 @@ class CertificateChainValidator { // try { SSLParametersImpl.getDefaultTrustManager().checkServerTrusted( - newServerCertificates, "RSA"); + serverCertificates, "RSA"); // no errors!!! return null; diff --git a/core/java/android/nfc/NdefMessage.java b/core/java/android/nfc/NdefMessage.java index 378304e..feca94e 100644 --- a/core/java/android/nfc/NdefMessage.java +++ b/core/java/android/nfc/NdefMessage.java @@ -34,15 +34,12 @@ public class NdefMessage implements Parcelable { private final NdefRecord[] mRecords; - //TODO(npelly) FormatException /** * Create an NDEF message from raw bytes. * <p> * Validation is performed to make sure the Record format headers are valid, * and the ID + TYPE + PAYLOAD fields are of the correct size. * @throws FormatException - * - * @hide */ public NdefMessage(byte[] data) throws FormatException { mRecords = null; // stop compiler complaints about final field @@ -69,10 +66,7 @@ public class NdefMessage implements Parcelable { } /** - * Get a byte array representation of this NDEF message. - * - * @return byte array - * @hide + * Returns a byte array representation of this entire NDEF message. */ public byte[] toByteArray() { //TODO(nxp): do not return null diff --git a/core/java/android/nfc/NdefRecord.java b/core/java/android/nfc/NdefRecord.java index edc5ab9..557e44d 100644 --- a/core/java/android/nfc/NdefRecord.java +++ b/core/java/android/nfc/NdefRecord.java @@ -247,8 +247,7 @@ public class NdefRecord implements Parcelable { } /** - * Return this NDEF Record as a byte array. - * @hide + * Returns this entire NDEF Record as a byte array. */ public byte[] toByteArray() { return generate(mFlags, mTnf, mType, mId, mPayload); diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 9767786..b4c6a2923 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -188,15 +188,7 @@ public class Build { public static final int FROYO = 8; /** - * Next version of Android. - * - * <p>Applications targeting this or a later release will get these - * new changes in behavior:</p> - * <ul> - * <li> The status bar is now dark. Targeting this version allows - * the platform to perform performing compatibility on status bar - * graphics to ensure they look okay on a dark background. - * </ul> + * Newest version of Android, version 2.3. */ public static final int GINGERBREAD = 9; diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java index 7b2022b..61e2305 100644 --- a/core/java/android/server/BluetoothA2dpService.java +++ b/core/java/android/server/BluetoothA2dpService.java @@ -41,6 +41,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; public class BluetoothA2dpService extends IBluetoothA2dp.Stub { @@ -107,10 +108,10 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { } else if (action.equals(AudioManager.VOLUME_CHANGED_ACTION)) { int streamType = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE, -1); if (streamType == AudioManager.STREAM_MUSIC) { - BluetoothDevice sinks[] = getConnectedDevices(); + List<BluetoothDevice> sinks = getConnectedDevices(); - if (sinks.length != 0 && isPhoneDocked(sinks[0])) { - String address = sinks[0].getAddress(); + if (sinks.size() != 0 && isPhoneDocked(sinks.get(0))) { + String address = sinks.get(0).getAddress(); int newVolLevel = intent.getIntExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, 0); int oldVolLevel = @@ -319,7 +320,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { if (getDevicesMatchingConnectionStates(new int[] { BluetoothA2dp.STATE_CONNECTING, BluetoothA2dp.STATE_CONNECTED, - BluetoothA2dp.STATE_DISCONNECTING}).length != 0) { + BluetoothA2dp.STATE_DISCONNECTING}).size() != 0) { return false; } @@ -430,19 +431,16 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { return state; } - public synchronized BluetoothDevice[] getConnectedDevices() { + public synchronized List<BluetoothDevice> getConnectedDevices() { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); - BluetoothDevice[] sinks = getDevicesMatchingConnectionStates( + List<BluetoothDevice> sinks = getDevicesMatchingConnectionStates( new int[] {BluetoothA2dp.STATE_CONNECTED}); return sinks; } - public synchronized BluetoothDevice[] getDevicesMatchingConnectionStates(int[] states) { + public synchronized List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); - ArrayList<BluetoothDevice> sinks = new ArrayList(); - if (mAudioDevices.isEmpty()) { - return sinks.toArray(new BluetoothDevice[sinks.size()]); - } + ArrayList<BluetoothDevice> sinks = new ArrayList<BluetoothDevice>(); for (BluetoothDevice device: mAudioDevices.keySet()) { int sinkState = getConnectionState(device); for (int state : states) { @@ -452,7 +450,7 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub { } } } - return sinks.toArray(new BluetoothDevice[sinks.size()]); + return sinks; } public synchronized int getPriority(BluetoothDevice device) { diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java index 239c3ac..f47c553 100644 --- a/core/java/android/server/BluetoothEventLoop.java +++ b/core/java/android/server/BluetoothEventLoop.java @@ -29,11 +29,12 @@ import android.content.Intent; import android.os.Handler; import android.os.Message; import android.os.ParcelUuid; +import android.os.PowerManager; import android.util.Log; import java.util.HashMap; +import java.util.List; import java.util.Set; -import android.os.PowerManager; /** @@ -629,7 +630,7 @@ class BluetoothEventLoop { } private boolean isOtherInputDeviceConnected(String address) { - Set<BluetoothDevice> devices = + List<BluetoothDevice> devices = mBluetoothService.lookupInputDevicesMatchingStates(new int[] { BluetoothInputDevice.STATE_CONNECTING, BluetoothInputDevice.STATE_CONNECTED}); @@ -654,13 +655,13 @@ class BluetoothEventLoop { } private boolean isOtherSinkInNonDisconnectedState(String address) { - Set<BluetoothDevice> devices = + List<BluetoothDevice> devices = mA2dp.getDevicesMatchingConnectionStates(new int[] {BluetoothA2dp.STATE_CONNECTED, BluetoothA2dp.STATE_CONNECTING, BluetoothA2dp.STATE_DISCONNECTING}); if (devices.size() == 0) return false; - for(BluetoothDevice dev: devices) { + for (BluetoothDevice dev: devices) { if (!dev.getAddress().equals(address)) return true; } return false; diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java index 7abb98e..660f9ab 100644 --- a/core/java/android/server/BluetoothService.java +++ b/core/java/android/server/BluetoothService.java @@ -27,12 +27,12 @@ package android.server; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothHeadset; import android.bluetooth.BluetoothDeviceProfileState; +import android.bluetooth.BluetoothHeadset; +import android.bluetooth.BluetoothInputDevice; import android.bluetooth.BluetoothPan; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothProfileState; -import android.bluetooth.BluetoothInputDevice; import android.bluetooth.BluetoothSocket; import android.bluetooth.BluetoothUuid; import android.bluetooth.IBluetooth; @@ -80,6 +80,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; @@ -1415,7 +1416,7 @@ public class BluetoothService extends IBluetooth.Stub { } /*package*/ synchronized boolean allowIncomingTethering() { - if (isTetheringOn() && getConnectedPanDevices().length < mMaxPanDevices) + if (isTetheringOn() && getConnectedPanDevices().size() < mMaxPanDevices) return true; return false; } @@ -1503,16 +1504,17 @@ public class BluetoothService extends IBluetooth.Stub { return true; } - public synchronized BluetoothDevice[] getConnectedPanDevices() { + public synchronized List<BluetoothDevice> getConnectedPanDevices() { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); - Set<BluetoothDevice> devices = new HashSet<BluetoothDevice>(); + List<BluetoothDevice> devices = new ArrayList<BluetoothDevice>(); + for (BluetoothDevice device: mPanDevices.keySet()) { if (getPanDeviceState(device) == BluetoothPan.STATE_CONNECTED) { devices.add(device); } } - return devices.toArray(new BluetoothDevice[devices.size()]); + return devices; } public synchronized boolean disconnectPanDevice(BluetoothDevice device) { @@ -1569,7 +1571,7 @@ public class BluetoothService extends IBluetooth.Stub { } private String createNewTetheringAddressLocked() { - if (getConnectedPanDevices().length == mMaxPanDevices) { + if (getConnectedPanDevices().size() == mMaxPanDevices) { log("Max PAN device connections reached"); return null; } @@ -1688,7 +1690,7 @@ public class BluetoothService extends IBluetooth.Stub { "Need BLUETOOTH_ADMIN permission"); String objectPath = getObjectPathFromAddress(device.getAddress()); - if (objectPath == null || getConnectedInputDevices().length == 0) { + if (objectPath == null || getConnectedInputDevices().size() == 0) { return false; } BluetoothDeviceProfileState state = mDeviceProfileState.get(device.getAddress()); @@ -1721,11 +1723,11 @@ public class BluetoothService extends IBluetooth.Stub { return mInputDevices.get(device); } - public synchronized BluetoothDevice[] getConnectedInputDevices() { + public synchronized List<BluetoothDevice> getConnectedInputDevices() { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); - Set<BluetoothDevice> devices = lookupInputDevicesMatchingStates( + List<BluetoothDevice> devices = lookupInputDevicesMatchingStates( new int[] {BluetoothInputDevice.STATE_CONNECTED}); - return devices.toArray(new BluetoothDevice[devices.size()]); + return devices; } public synchronized int getInputDevicePriority(BluetoothDevice device) { @@ -1746,11 +1748,9 @@ public class BluetoothService extends IBluetooth.Stub { priority); } - /*package*/synchronized Set<BluetoothDevice> lookupInputDevicesMatchingStates(int[] states) { - Set<BluetoothDevice> inputDevices = new HashSet<BluetoothDevice>(); - if (mInputDevices.isEmpty()) { - return inputDevices; - } + /*package*/synchronized List<BluetoothDevice> lookupInputDevicesMatchingStates(int[] states) { + List<BluetoothDevice> inputDevices = new ArrayList<BluetoothDevice>(); + for (BluetoothDevice device: mInputDevices.keySet()) { int inputDeviceState = getInputDeviceState(device); for (int state : states) { @@ -2487,11 +2487,11 @@ public class BluetoothService extends IBluetooth.Stub { // dump pw.println("\n--Headset Service--"); if (mBluetoothHeadset != null) { - Set<BluetoothDevice> deviceSet = mBluetoothHeadset.getConnectedDevices(); - if (deviceSet.size() == 0) { + List<BluetoothDevice> deviceList = mBluetoothHeadset.getConnectedDevices(); + if (deviceList.size() == 0) { pw.println("\n--No headsets connected--"); } - BluetoothDevice device = (BluetoothDevice) deviceSet.toArray()[0]; + BluetoothDevice device = deviceList.get(0); switch (mBluetoothHeadset.getConnectionState(device)) { case BluetoothHeadset.STATE_DISCONNECTED: @@ -2511,11 +2511,11 @@ public class BluetoothService extends IBluetooth.Stub { break; } - deviceSet.clear(); - deviceSet = mBluetoothHeadset.getDevicesMatchingConnectionStates(new int[] { + deviceList.clear(); + deviceList = mBluetoothHeadset.getDevicesMatchingConnectionStates(new int[] { BluetoothProfile.STATE_CONNECTED, BluetoothProfile.STATE_DISCONNECTED}); pw.println("\n--Connected and Disconnected Headsets"); - for (BluetoothDevice dev: deviceSet) { + for (BluetoothDevice dev: deviceList) { pw.println(device); if (mBluetoothHeadset.isAudioConnected(device)) { pw.println("SCO audio connected to device:" + device); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index be056da..09563fc 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -5018,6 +5018,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } mLayout = mHintLayout = null; + + // Since it depends on the value of mLayout + prepareCursorControllers(); } /** diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 224f9a5..0f482b7 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -51,8 +51,8 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock; @@ -65,16 +65,16 @@ public final class BatteryStatsImpl extends BatteryStats { private static final String TAG = "BatteryStatsImpl"; private static final boolean DEBUG = false; private static final boolean DEBUG_HISTORY = false; - + // In-memory Parcel magic number, used to detect attempts to unmarshall bad data - private static final int MAGIC = 0xBA757475; // 'BATSTATS' + private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version private static final int VERSION = 52; // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; - + // No, really, THIS is the maximum number of items we will record in the history. private static final int MAX_MAX_HISTORY_ITEMS = 3000; @@ -82,9 +82,9 @@ public final class BatteryStatsImpl extends BatteryStats { // per uid; once the limit is reached, we batch the remaining wakelocks // in to one common name. private static final int MAX_WAKELOCKS_PER_UID = 30; - + private static final String BATCHED_WAKELOCK_NAME = "*overflow*"; - + private static int sNumSpeedSteps; private final JournaledFile mFile; @@ -147,9 +147,9 @@ public final class BatteryStatsImpl extends BatteryStats { // These are the objects that will want to do something when the device // is unplugged from power. final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); - + boolean mShuttingDown; - + long mHistoryBaseTime; boolean mHaveBatteryLevel = false; boolean mRecordingHistory = true; @@ -159,7 +159,7 @@ public final class BatteryStatsImpl extends BatteryStats { HistoryItem mHistoryLastEnd; HistoryItem mHistoryCache; final HistoryItem mHistoryCur = new HistoryItem(); - + int mStartCount; long mBatteryUptime; @@ -173,41 +173,41 @@ public final class BatteryStatsImpl extends BatteryStats { long mRealtime; long mRealtimeStart; long mLastRealtime; - + boolean mScreenOn; StopwatchTimer mScreenOnTimer; int mScreenBrightnessBin = -1; final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; - + Counter mInputEventCounter; - + boolean mPhoneOn; StopwatchTimer mPhoneOnTimer; - + boolean mAudioOn; StopwatchTimer mAudioOnTimer; - + boolean mVideoOn; StopwatchTimer mVideoOnTimer; - + int mPhoneSignalStrengthBin = -1; - final StopwatchTimer[] mPhoneSignalStrengthsTimer = + final StopwatchTimer[] mPhoneSignalStrengthsTimer = new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS]; StopwatchTimer mPhoneSignalScanningTimer; int mPhoneDataConnectionType = -1; - final StopwatchTimer[] mPhoneDataConnectionsTimer = + final StopwatchTimer[] mPhoneDataConnectionsTimer = new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; - + boolean mWifiOn; StopwatchTimer mWifiOnTimer; int mWifiOnUid = -1; boolean mGlobalWifiRunning; StopwatchTimer mGlobalWifiRunningTimer; - + boolean mBluetoothOn; StopwatchTimer mBluetoothOnTimer; @@ -256,15 +256,15 @@ public final class BatteryStatsImpl extends BatteryStats { /* * Holds a SamplingTimer associated with each kernel wakelock name being tracked. */ - private final HashMap<String, SamplingTimer> mKernelWakelockStats = + private final HashMap<String, SamplingTimer> mKernelWakelockStats = new HashMap<String, SamplingTimer>(); - + public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { return mKernelWakelockStats; } - + private static int sKernelWakelockUpdateVersion = 0; - + private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count @@ -273,19 +273,19 @@ public final class BatteryStatsImpl extends BatteryStats { Process.PROC_TAB_TERM, Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime }; - + private final String[] mProcWakelocksName = new String[3]; private final long[] mProcWakelocksData = new long[3]; - + /* * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added * to mKernelWakelockStats. */ - private final Map<String, KernelWakelockStats> mProcWakelockFileStats = + private final Map<String, KernelWakelockStats> mProcWakelockFileStats = new HashMap<String, KernelWakelockStats>(); private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); - + // For debugging public BatteryStatsImpl() { mFile = null; @@ -296,7 +296,7 @@ public final class BatteryStatsImpl extends BatteryStats { void unplug(long batteryUptime, long batteryRealtime); void plug(long batteryUptime, long batteryRealtime); } - + /** * State for keeping track of counting information. */ @@ -307,7 +307,7 @@ public final class BatteryStatsImpl extends BatteryStats { int mLastCount; int mUnpluggedCount; int mPluggedCount; - + Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { mUnpluggables = unpluggables; mPluggedCount = in.readInt(); @@ -322,7 +322,7 @@ public final class BatteryStatsImpl extends BatteryStats { mUnpluggables = unpluggables; unpluggables.add(this); } - + public void writeToParcel(Parcel out) { out.writeInt(mCount.get()); out.writeInt(mLoadedCount); @@ -337,7 +337,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void plug(long batteryUptime, long batteryRealtime) { mPluggedCount = mCount.get(); } - + /** * Writes a possibly null Counter to a Parcel. * @@ -377,7 +377,7 @@ public final class BatteryStatsImpl extends BatteryStats { + " mUnpluggedCount=" + mUnpluggedCount + " mPluggedCount=" + mPluggedCount); } - + void stepAtomic() { mCount.incrementAndGet(); } @@ -392,11 +392,11 @@ public final class BatteryStatsImpl extends BatteryStats { detach(); } } - + void detach() { mUnpluggables.remove(this); } - + void writeSummaryFromParcelLocked(Parcel out) { int count = mCount.get(); out.writeInt(count); @@ -431,41 +431,41 @@ public final class BatteryStatsImpl extends BatteryStats { public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { final int mType; final ArrayList<Unpluggable> mUnpluggables; - + int mCount; int mLoadedCount; int mLastCount; int mUnpluggedCount; - + // Times are in microseconds for better accuracy when dividing by the // lock count, and are in "battery realtime" units. - + /** * The total time we have accumulated since the start of the original * boot, to the last time something interesting happened in the * current run. */ long mTotalTime; - + /** * The total time we loaded for the previous runs. Subtract this from * mTotalTime to find the time for the current run of the system. */ long mLoadedTime; - + /** * The run time of the last run of the system, as loaded from the * saved data. */ long mLastTime; - + /** * The value of mTotalTime when unplug() was last called. Subtract * this from mTotalTime to find the time since the last unplug from * power. */ long mUnpluggedTime; - + /** * Constructs from a parcel. * @param type @@ -476,7 +476,7 @@ public final class BatteryStatsImpl extends BatteryStats { Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { mType = type; mUnpluggables = unpluggables; - + mCount = in.readInt(); mLoadedCount = in.readInt(); mLastCount = 0; @@ -495,9 +495,9 @@ public final class BatteryStatsImpl extends BatteryStats { } protected abstract long computeRunTimeLocked(long curBatteryRealtime); - + protected abstract int computeCurrentCountLocked(); - + /** * Clear state of this timer. Returns true if the timer is inactive * so can be completely dropped. @@ -510,11 +510,11 @@ public final class BatteryStatsImpl extends BatteryStats { } return true; } - + void detach() { mUnpluggables.remove(this); } - + public void writeToParcel(Parcel out, long batteryRealtime) { out.writeInt(mCount); out.writeInt(mLoadedCount); @@ -551,7 +551,7 @@ public final class BatteryStatsImpl extends BatteryStats { + ": new mTotalTime=" + mTotalTime); } } - + /** * Writes a possibly null Timer to a Parcel. * @@ -612,8 +612,8 @@ public final class BatteryStatsImpl extends BatteryStats { pw.println(prefix + "mLastTime=" + mLastTime + " mUnpluggedTime=" + mUnpluggedTime); } - - + + void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { long runTime = computeRunTimeLocked(batteryRealtime); // Divide by 1000 for backwards compatibility @@ -631,9 +631,9 @@ public final class BatteryStatsImpl extends BatteryStats { mUnpluggedCount = mCount; } } - + public static final class SamplingTimer extends Timer { - + /** * The most recent reported count from /proc/wakelocks. */ @@ -647,7 +647,7 @@ public final class BatteryStatsImpl extends BatteryStats { /** * The most recent reported total_time from /proc/wakelocks. - */ + */ long mCurrentReportedTotalTime; @@ -666,12 +666,12 @@ public final class BatteryStatsImpl extends BatteryStats { * Whether we are currently recording reported values. */ boolean mTrackingReportedValues; - + /* * A sequnce counter, incremented once for each update of the stats. */ int mUpdateVersion; - + SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { super(0, unpluggables, in); mCurrentReportedCount = in.readInt(); @@ -681,28 +681,28 @@ public final class BatteryStatsImpl extends BatteryStats { mTrackingReportedValues = in.readInt() == 1; mInDischarge = inDischarge; } - - SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, + + SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, boolean trackReportedValues) { super(0, unpluggables); mTrackingReportedValues = trackReportedValues; mInDischarge = inDischarge; } - + public void setStale() { mTrackingReportedValues = false; mUnpluggedReportedTotalTime = 0; mUnpluggedReportedCount = 0; } - + public void setUpdateVersion(int version) { mUpdateVersion = version; } - + public int getUpdateVersion() { return mUpdateVersion; } - + public void updateCurrentReportedCount(int count) { if (mInDischarge && mUnpluggedReportedCount == 0) { // Updating the reported value for the first time. @@ -712,7 +712,7 @@ public final class BatteryStatsImpl extends BatteryStats { } mCurrentReportedCount = count; } - + public void updateCurrentReportedTotalTime(long totalTime) { if (mInDischarge && mUnpluggedReportedTotalTime == 0) { // Updating the reported value for the first time. @@ -722,7 +722,7 @@ public final class BatteryStatsImpl extends BatteryStats { } mCurrentReportedTotalTime = totalTime; } - + public void unplug(long batteryUptime, long batteryRealtime) { super.unplug(batteryUptime, batteryRealtime); if (mTrackingReportedValues) { @@ -736,25 +736,25 @@ public final class BatteryStatsImpl extends BatteryStats { super.plug(batteryUptime, batteryRealtime); mInDischarge = false; } - + public void logState(Printer pw, String prefix) { super.logState(pw, prefix); - pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount + pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount + " mUnpluggedReportedCount=" + mUnpluggedReportedCount + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); } - + protected long computeRunTimeLocked(long curBatteryRealtime) { - return mTotalTime + (mInDischarge && mTrackingReportedValues + return mTotalTime + (mInDischarge && mTrackingReportedValues ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); } - + protected int computeCurrentCountLocked() { return mCount + (mInDischarge && mTrackingReportedValues ? mCurrentReportedCount - mUnpluggedReportedCount : 0); } - + public void writeToParcel(Parcel out, long batteryRealtime) { super.writeToParcel(out, batteryRealtime); out.writeInt(mCurrentReportedCount); @@ -763,13 +763,13 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeLong(mUnpluggedReportedTotalTime); out.writeInt(mTrackingReportedValues ? 1 : 0); } - + boolean reset(BatteryStatsImpl stats, boolean detachIfReset) { super.reset(stats, detachIfReset); setStale(); return true; } - + void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { super.writeSummaryFromParcelLocked(out, batteryRealtime); out.writeLong(mCurrentReportedTotalTime); @@ -784,7 +784,7 @@ public final class BatteryStatsImpl extends BatteryStats { mTrackingReportedValues = in.readInt() == 1; } } - + /** * State for keeping track of timing information. */ @@ -800,7 +800,7 @@ public final class BatteryStatsImpl extends BatteryStats { * time we have been running since we last computed an update. */ long mUpdateTime; - + /** * The total time at which the timer was acquired, to determine if it * was actually held for an interesting duration. @@ -829,7 +829,7 @@ public final class BatteryStatsImpl extends BatteryStats { mUid = uid; mTimerPool = timerPool; } - + void setTimeout(long timeout) { mTimeout = timeout; } @@ -857,7 +857,7 @@ public final class BatteryStatsImpl extends BatteryStats { pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime + " mAcquireTime=" + mAcquireTime); } - + void startRunningLocked(BatteryStatsImpl stats) { if (mNesting++ == 0) { mUpdateTime = stats.getBatteryRealtimeLocked( @@ -897,19 +897,19 @@ public final class BatteryStatsImpl extends BatteryStats { // Remove this timer from the active pool mTimerPool.remove(this); } else { - final long realtime = SystemClock.elapsedRealtime() * 1000; + final long realtime = SystemClock.elapsedRealtime() * 1000; final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); mNesting = 1; mTotalTime = computeRunTimeLocked(batteryRealtime); mNesting = 0; } - + if (DEBUG && mType < 0) { Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime + " mTotalTime=" + mTotalTime + " mCount=" + mCount + " mAcquireTime=" + mAcquireTime); } - + if (mTotalTime == mAcquireTime) { // If there was no change in the time, then discard this // count. A somewhat cheezy strategy, but hey. @@ -922,7 +922,7 @@ public final class BatteryStatsImpl extends BatteryStats { // due to a change in timer count private static void refreshTimersLocked(final BatteryStatsImpl stats, final ArrayList<StopwatchTimer> pool) { - final long realtime = SystemClock.elapsedRealtime() * 1000; + final long realtime = SystemClock.elapsedRealtime() * 1000; final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); final int N = pool.size(); for (int i=N-1; i>= 0; i--) { @@ -961,25 +961,25 @@ public final class BatteryStatsImpl extends BatteryStats { mAcquireTime = mTotalTime; return canDetach; } - + void detach() { super.detach(); if (mTimerPool != null) { mTimerPool.remove(this); } } - + void readSummaryFromParcelLocked(Parcel in) { super.readSummaryFromParcelLocked(in); mNesting = 0; } } - + private final Map<String, KernelWakelockStats> readKernelWakelockStats() { - + byte[] buffer = new byte[8192]; int len; - + try { FileInputStream is = new FileInputStream("/proc/wakelocks"); len = is.read(buffer); @@ -999,10 +999,10 @@ public final class BatteryStatsImpl extends BatteryStats { } catch (java.io.IOException e) { return null; } - + return parseProcWakelocks(buffer, len); } - + private final Map<String, KernelWakelockStats> parseProcWakelocks( byte[] wlBuffer, int len) { String name; @@ -1018,11 +1018,11 @@ public final class BatteryStatsImpl extends BatteryStats { synchronized(this) { Map<String, KernelWakelockStats> m = mProcWakelockFileStats; - + sKernelWakelockUpdateVersion++; while (endIndex < len) { - for (endIndex=startIndex; - endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; + for (endIndex=startIndex; + endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; endIndex++); endIndex++; // endIndex is an exclusive upper bound. // Don't go over the end of the buffer, Process.parseProcLine might @@ -1049,7 +1049,7 @@ public final class BatteryStatsImpl extends BatteryStats { if (parsed && name.length() > 0) { if (!m.containsKey(name)) { - m.put(name, new KernelWakelockStats(count, totalTime, + m.put(name, new KernelWakelockStats(count, totalTime, sKernelWakelockUpdateVersion)); numUpdatedWlNames++; } else { @@ -1080,27 +1080,27 @@ public final class BatteryStatsImpl extends BatteryStats { return m; } } - + private class KernelWakelockStats { public int mCount; public long mTotalTime; public int mVersion; - + KernelWakelockStats(int count, long totalTime, int version) { mCount = count; mTotalTime = totalTime; mVersion = version; } } - + /* - * Get the KernelWakelockTimer associated with name, and create a new one if one + * Get the KernelWakelockTimer associated with name, and create a new one if one * doesn't already exist. */ public SamplingTimer getKernelWakelockTimerLocked(String name) { SamplingTimer kwlt = mKernelWakelockStats.get(name); if (kwlt == null) { - kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, + kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, true /* track reported values */); mKernelWakelockStats.put(name, kwlt); } @@ -1144,7 +1144,7 @@ public final class BatteryStatsImpl extends BatteryStats { } /** - * Returns the duration that the cell radio was up for data transfers. + * Returns the duration that the cell radio was up for data transfers. */ public long getRadioDataUptime() { if (mRadioDataStart == -1) { @@ -1156,10 +1156,9 @@ public final class BatteryStatsImpl extends BatteryStats { private int getCurrentBluetoothPingCount() { if (mBtHeadset != null) { - Set<BluetoothDevice> deviceSet = mBtHeadset.getConnectedDevices(); - BluetoothDevice[] devices = deviceSet.toArray(new BluetoothDevice[deviceSet.size()]); - if (devices.length > 0) { - return mBtHeadset.getBatteryUsageHint(devices[0]); + List<BluetoothDevice> deviceList = mBtHeadset.getConnectedDevices(); + if (deviceList.size() > 0) { + return mBtHeadset.getBatteryUsageHint(deviceList.get(0)); } } return -1; @@ -1234,7 +1233,7 @@ public final class BatteryStatsImpl extends BatteryStats { addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE); } - + void addHistoryRecordLocked(long curTime, byte cmd) { HistoryItem rec = mHistoryCache; if (rec != null) { @@ -1243,10 +1242,10 @@ public final class BatteryStatsImpl extends BatteryStats { rec = new HistoryItem(); } rec.setTo(mHistoryBaseTime + curTime, cmd, mHistoryCur); - + addHistoryRecordLocked(rec); } - + void addHistoryRecordLocked(HistoryItem rec) { mNumHistoryItems++; rec.next = null; @@ -1258,7 +1257,7 @@ public final class BatteryStatsImpl extends BatteryStats { mHistory = mHistoryEnd = rec; } } - + void clearHistoryLocked() { if (mHistory != null) { mHistoryEnd.next = mHistoryCache; @@ -1268,7 +1267,7 @@ public final class BatteryStatsImpl extends BatteryStats { mNumHistoryItems = 0; mHistoryBaseTime = 0; } - + public void doUnplugLocked(long batteryUptime, long batteryRealtime) { for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { Uid u = mUidStats.valueAt(iu); @@ -1532,7 +1531,7 @@ public final class BatteryStatsImpl extends BatteryStats { } int mGpsNesting; - + public void noteStartGpsLocked(int uid) { if (mGpsNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG; @@ -1543,7 +1542,7 @@ public final class BatteryStatsImpl extends BatteryStats { mGpsNesting++; getUidStatsLocked(uid).noteStartGps(); } - + public void noteStopGpsLocked(int uid) { mGpsNesting--; if (mGpsNesting == 0) { @@ -1572,7 +1571,7 @@ public final class BatteryStatsImpl extends BatteryStats { noteStartWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); } } - + public void noteScreenOffLocked() { if (mScreenOn) { mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG; @@ -1588,7 +1587,7 @@ public final class BatteryStatsImpl extends BatteryStats { noteStopWakeLocked(-1, -1, "dummy", WAKE_TYPE_PARTIAL); } } - + public void noteScreenBrightnessLocked(int brightness) { // Bin the brightness. int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); @@ -1609,15 +1608,15 @@ public final class BatteryStatsImpl extends BatteryStats { mScreenBrightnessBin = bin; } } - + public void noteInputEventAtomic() { mInputEventCounter.stepAtomic(); } - + public void noteUserActivityLocked(int uid, int event) { getUidStatsLocked(uid).noteUserActivityLocked(event); } - + public void notePhoneOnLocked() { if (!mPhoneOn) { mHistoryCur.states |= HistoryItem.STATE_PHONE_IN_CALL_FLAG; @@ -1628,7 +1627,7 @@ public final class BatteryStatsImpl extends BatteryStats { mPhoneOnTimer.startRunningLocked(this); } } - + public void notePhoneOffLocked() { if (mPhoneOn) { mHistoryCur.states &= ~HistoryItem.STATE_PHONE_IN_CALL_FLAG; @@ -1688,7 +1687,7 @@ public final class BatteryStatsImpl extends BatteryStats { mPhoneSignalScanningTimer.startRunningLocked(this); } } - + if (!scanning) { // If we are no longer scanning, then stop the scanning timer. if (mPhoneSignalScanningTimer.isRunningLocked()) { @@ -1746,7 +1745,7 @@ public final class BatteryStatsImpl extends BatteryStats { mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); } } - + public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { int bin = DATA_CONNECTION_NONE; if (hasData) { @@ -1806,7 +1805,7 @@ public final class BatteryStatsImpl extends BatteryStats { mPhoneDataConnectionsTimer[bin].startRunningLocked(this); } } - + public void noteWifiOnLocked() { if (!mWifiOn) { mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG; @@ -1817,7 +1816,7 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiOnTimer.startRunningLocked(this); } } - + public void noteWifiOffLocked() { if (mWifiOn) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG; @@ -1844,7 +1843,7 @@ public final class BatteryStatsImpl extends BatteryStats { } getUidStatsLocked(uid).noteAudioTurnedOnLocked(); } - + public void noteAudioOffLocked(int uid) { if (mAudioOn) { mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; @@ -1868,7 +1867,7 @@ public final class BatteryStatsImpl extends BatteryStats { } getUidStatsLocked(uid).noteVideoTurnedOnLocked(); } - + public void noteVideoOffLocked(int uid) { if (mVideoOn) { mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG; @@ -1940,7 +1939,7 @@ public final class BatteryStatsImpl extends BatteryStats { mBluetoothOnTimer.startRunningLocked(this); } } - + public void noteBluetoothOffLocked() { if (mBluetoothOn) { mHistoryCur.states &= ~HistoryItem.STATE_BLUETOOTH_ON_FLAG; @@ -1951,9 +1950,9 @@ public final class BatteryStatsImpl extends BatteryStats { mBluetoothOnTimer.stopRunningLocked(this); } } - + int mWifiFullLockNesting = 0; - + public void noteFullWifiLockAcquiredLocked(int uid) { if (mWifiFullLockNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; @@ -1977,7 +1976,7 @@ public final class BatteryStatsImpl extends BatteryStats { } int mWifiScanLockNesting = 0; - + public void noteScanWifiLockAcquiredLocked(int uid) { if (mWifiScanLockNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_LOCK_FLAG; @@ -2001,7 +2000,7 @@ public final class BatteryStatsImpl extends BatteryStats { } int mWifiMulticastNesting = 0; - + public void noteWifiMulticastEnabledLocked(int uid) { if (mWifiMulticastNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; @@ -2069,7 +2068,7 @@ public final class BatteryStatsImpl extends BatteryStats { @Override public long getScreenOnTime(long batteryRealtime, int which) { return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); } - + @Override public long getScreenBrightnessTime(int brightnessBin, long batteryRealtime, int which) { return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( @@ -2079,7 +2078,7 @@ public final class BatteryStatsImpl extends BatteryStats { @Override public int getInputEventCount(int which) { return mInputEventCounter.getCountLocked(which); } - + @Override public long getPhoneOnTime(long batteryRealtime, int which) { return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); } @@ -2099,21 +2098,21 @@ public final class BatteryStatsImpl extends BatteryStats { @Override public int getPhoneSignalStrengthCount(int dataType, int which) { return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); } - + @Override public long getPhoneDataConnectionTime(int dataType, long batteryRealtime, int which) { return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( batteryRealtime, which); } - + @Override public int getPhoneDataConnectionCount(int dataType, int which) { return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); } - + @Override public long getWifiOnTime(long batteryRealtime, int which) { return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); } - + @Override public long getGlobalWifiRunningTime(long batteryRealtime, int which) { return mGlobalWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); } @@ -2121,11 +2120,11 @@ public final class BatteryStatsImpl extends BatteryStats { @Override public long getBluetoothOnTime(long batteryRealtime, int which) { return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); } - + @Override public boolean getIsOnBattery() { return mOnBattery; } - + @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { return mUidStats; } @@ -2134,7 +2133,7 @@ public final class BatteryStatsImpl extends BatteryStats { * The statistics associated with a particular uid. */ public final class Uid extends BatteryStats.Uid { - + final int mUid; long mLoadedTcpBytesReceived; long mLoadedTcpBytesSent; @@ -2142,32 +2141,32 @@ public final class BatteryStatsImpl extends BatteryStats { long mCurrentTcpBytesSent; long mTcpBytesReceivedAtLastUnplug; long mTcpBytesSentAtLastUnplug; - + // These are not saved/restored when parcelling, since we want // to return from the parcel with a snapshot of the state. long mStartedTcpBytesReceived = -1; long mStartedTcpBytesSent = -1; - + boolean mWifiRunning; StopwatchTimer mWifiRunningTimer; - + boolean mFullWifiLockOut; StopwatchTimer mFullWifiLockTimer; - + boolean mScanWifiLockOut; StopwatchTimer mScanWifiLockTimer; - + boolean mWifiMulticastEnabled; StopwatchTimer mWifiMulticastTimer; - + boolean mAudioTurnedOn; StopwatchTimer mAudioTurnedOnTimer; - + boolean mVideoTurnedOn; StopwatchTimer mVideoTurnedOnTimer; Counter[] mUserActivityCounters; - + /** * The statistics we have collected for this uid's wake locks. */ @@ -2187,7 +2186,7 @@ public final class BatteryStatsImpl extends BatteryStats { * The statistics we have collected for this uid's processes. */ final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); - + /** * The transient wake stats we have collected for this uid's pids. */ @@ -2248,7 +2247,7 @@ public final class BatteryStatsImpl extends BatteryStats { return current; } } - + public long computeCurrentTcpBytesReceived() { return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0); @@ -2268,7 +2267,7 @@ public final class BatteryStatsImpl extends BatteryStats { return current; } } - + @Override public void noteWifiRunningLocked() { if (!mWifiRunning) { @@ -2280,7 +2279,7 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiRunningTimer.startRunningLocked(BatteryStatsImpl.this); } } - + @Override public void noteWifiStoppedLocked() { if (mWifiRunning) { @@ -2288,7 +2287,7 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiRunningTimer.stopRunningLocked(BatteryStatsImpl.this); } } - + @Override public void noteFullWifiLockAcquiredLocked() { if (!mFullWifiLockOut) { @@ -2300,7 +2299,7 @@ public final class BatteryStatsImpl extends BatteryStats { mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); } } - + @Override public void noteFullWifiLockReleasedLocked() { if (mFullWifiLockOut) { @@ -2308,7 +2307,7 @@ public final class BatteryStatsImpl extends BatteryStats { mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); } } - + @Override public void noteScanWifiLockAcquiredLocked() { if (!mScanWifiLockOut) { @@ -2320,7 +2319,7 @@ public final class BatteryStatsImpl extends BatteryStats { mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); } } - + @Override public void noteScanWifiLockReleasedLocked() { if (mScanWifiLockOut) { @@ -2389,7 +2388,7 @@ public final class BatteryStatsImpl extends BatteryStats { } } - @Override + @Override public long getWifiRunningTime(long batteryRealtime, int which) { if (mWifiRunningTimer == null) { return 0; @@ -2397,15 +2396,15 @@ public final class BatteryStatsImpl extends BatteryStats { return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); } - @Override + @Override public long getFullWifiLockTime(long batteryRealtime, int which) { if (mFullWifiLockTimer == null) { return 0; } return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); } - - @Override + + @Override public long getScanWifiLockTime(long batteryRealtime, int which) { if (mScanWifiLockTimer == null) { return 0; @@ -2422,7 +2421,7 @@ public final class BatteryStatsImpl extends BatteryStats { which); } - @Override + @Override public long getAudioTurnedOnTime(long batteryRealtime, int which) { if (mAudioTurnedOnTimer == null) { return 0; @@ -2430,7 +2429,7 @@ public final class BatteryStatsImpl extends BatteryStats { return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); } - @Override + @Override public long getVideoTurnedOnTime(long batteryRealtime, int which) { if (mVideoTurnedOnTimer == null) { return 0; @@ -2447,12 +2446,12 @@ public final class BatteryStatsImpl extends BatteryStats { else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; mUserActivityCounters[type].stepAtomic(); } - + @Override public boolean hasUserActivity() { return mUserActivityCounters != null; } - + @Override public int getUserActivityCount(int type, int which) { if (mUserActivityCounters == null) { @@ -2460,14 +2459,14 @@ public final class BatteryStatsImpl extends BatteryStats { } return mUserActivityCounters[type].getCountLocked(which); } - + void initUserActivityLocked() { mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { mUserActivityCounters[i] = new Counter(mUnpluggables); } } - + public long computeCurrentTcpBytesSent() { return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); @@ -2479,7 +2478,7 @@ public final class BatteryStatsImpl extends BatteryStats { */ boolean reset() { boolean active = false; - + if (mWifiRunningTimer != null) { active |= !mWifiRunningTimer.reset(BatteryStatsImpl.this, false); active |= mWifiRunning; @@ -2504,10 +2503,10 @@ public final class BatteryStatsImpl extends BatteryStats { active |= !mVideoTurnedOnTimer.reset(BatteryStatsImpl.this, false); active |= mVideoTurnedOn; } - + mLoadedTcpBytesReceived = mLoadedTcpBytesSent = 0; mCurrentTcpBytesReceived = mCurrentTcpBytesSent = 0; - + if (mUserActivityCounters != null) { for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { mUserActivityCounters[i].reset(false); @@ -2571,7 +2570,7 @@ public final class BatteryStatsImpl extends BatteryStats { } mPackageStats.clear(); } - + mPids.clear(); if (!active) { @@ -2599,10 +2598,10 @@ public final class BatteryStatsImpl extends BatteryStats { } } } - + return !active; } - + void writeToParcelLocked(Parcel out, long batteryRealtime) { out.writeInt(mWakelockStats.size()); for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { @@ -2631,7 +2630,7 @@ public final class BatteryStatsImpl extends BatteryStats { Uid.Pkg pkg = pkgEntry.getValue(); pkg.writeToParcelLocked(out); } - + out.writeLong(mLoadedTcpBytesReceived); out.writeLong(mLoadedTcpBytesSent); out.writeLong(computeCurrentTcpBytesReceived()); @@ -2725,7 +2724,7 @@ public final class BatteryStatsImpl extends BatteryStats { pkg.readFromParcelLocked(in); mPackageStats.put(packageName, pkg); } - + mLoadedTcpBytesReceived = in.readLong(); mLoadedTcpBytesSent = in.readLong(); mCurrentTcpBytesReceived = in.readLong(); @@ -2846,7 +2845,7 @@ public final class BatteryStatsImpl extends BatteryStats { } return !wlactive; } - + void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, mPartialTimers, unpluggables, in); @@ -2876,7 +2875,7 @@ public final class BatteryStatsImpl extends BatteryStats { public final class Sensor extends BatteryStats.Uid.Sensor { final int mHandle; StopwatchTimer mTimer; - + public Sensor(int handle) { mHandle = handle; } @@ -2902,7 +2901,7 @@ public final class BatteryStatsImpl extends BatteryStats { } return false; } - + void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { mTimer = readTimerFromParcel(unpluggables, in); } @@ -3024,7 +3023,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void plug(long batteryUptime, long batteryRealtime) { } - + void detach() { mUnpluggables.remove(this); for (int i = 0; i < mSpeedBins.length; i++) { @@ -3035,7 +3034,7 @@ public final class BatteryStatsImpl extends BatteryStats { } } } - + public int countExcessivePowers() { return mExcessivePower != null ? mExcessivePower.size() : 0; } @@ -3302,18 +3301,18 @@ public final class BatteryStatsImpl extends BatteryStats { Pkg() { mUnpluggables.add(this); } - + public void unplug(long batteryUptime, long batteryRealtime) { mUnpluggedWakeups = mWakeups; } public void plug(long batteryUptime, long batteryRealtime) { } - + void detach() { mUnpluggables.remove(this); } - + void readFromParcelLocked(Parcel in) { mWakeups = in.readInt(); mLoadedWakeups = in.readInt(); @@ -3464,7 +3463,7 @@ public final class BatteryStatsImpl extends BatteryStats { Serv() { mUnpluggables.add(this); } - + public void unplug(long batteryUptime, long batteryRealtime) { mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); mUnpluggedStarts = mStarts; @@ -3473,11 +3472,11 @@ public final class BatteryStatsImpl extends BatteryStats { public void plug(long batteryUptime, long batteryRealtime) { } - + void detach() { mUnpluggables.remove(this); } - + void readFromParcelLocked(Parcel in) { mStartTime = in.readLong(); mRunningSince = in.readLong(); @@ -3652,7 +3651,7 @@ public final class BatteryStatsImpl extends BatteryStats { public SparseArray<? extends Pid> getPidStats() { return mPids; } - + public Pid getPidStatsLocked(int pid) { Pid p = mPids.get(pid); if (p == null) { @@ -3790,7 +3789,7 @@ public final class BatteryStatsImpl extends BatteryStats { p.addExcessiveWake(overTime, usedTime); } } - + public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) { Proc p = getProcessStatsLocked(proc); if (p != null) { @@ -3802,7 +3801,7 @@ public final class BatteryStatsImpl extends BatteryStats { StopwatchTimer t = getSensorTimerLocked(sensor, true); if (t != null) { t.startRunningLocked(BatteryStatsImpl.this); - } + } } public void noteStopSensor(int sensor) { @@ -3810,16 +3809,16 @@ public final class BatteryStatsImpl extends BatteryStats { StopwatchTimer t = getSensorTimerLocked(sensor, false); if (t != null) { t.stopRunningLocked(BatteryStatsImpl.this); - } + } } - + public void noteStartGps() { StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); if (t != null) { t.startRunningLocked(BatteryStatsImpl.this); - } + } } - + public void noteStopGps() { StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); if (t != null) { @@ -3909,12 +3908,12 @@ public final class BatteryStatsImpl extends BatteryStats { public HistoryItem getHistory() { return mHistory; } - + @Override public long getHistoryBaseTime() { return mHistoryBaseTime; } - + @Override public int getStartCount() { return mStartCount; @@ -3936,7 +3935,7 @@ public final class BatteryStatsImpl extends BatteryStats { mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); } - + public void resetAllStatsLocked() { mStartCount = 0; initTimes(); @@ -3958,24 +3957,24 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiOnTimer.reset(this, false); mGlobalWifiRunningTimer.reset(this, false); mBluetoothOnTimer.reset(this, false); - + for (int i=0; i<mUidStats.size(); i++) { if (mUidStats.valueAt(i).reset()) { mUidStats.remove(mUidStats.keyAt(i)); i--; } } - + if (mKernelWakelockStats.size() > 0) { for (SamplingTimer timer : mKernelWakelockStats.values()) { mUnpluggables.remove(timer); } mKernelWakelockStats.clear(); } - + clearHistoryLocked(); } - + void setOnBattery(boolean onBattery, int oldStatus, int level) { synchronized(this) { boolean doWrite = false; @@ -3983,7 +3982,7 @@ public final class BatteryStatsImpl extends BatteryStats { m.arg1 = onBattery ? 1 : 0; mHandler.sendMessage(m); mOnBattery = mOnBatteryInternal = onBattery; - + long uptime = SystemClock.uptimeMillis() * 1000; long mSecRealtime = SystemClock.elapsedRealtime(); long realtime = mSecRealtime * 1000; @@ -4036,10 +4035,10 @@ public final class BatteryStatsImpl extends BatteryStats { } } } - + // This should probably be exposed in the API, though it's not critical private static final int BATTERY_PLUGGED_NONE = 0; - + public void setBatteryState(int status, int health, int plugType, int level, int temp, int volt) { boolean onBattery = plugType == BATTERY_PLUGGED_NONE; @@ -4107,10 +4106,10 @@ public final class BatteryStatsImpl extends BatteryStats { mRecordingHistory = false; } } - + public void updateKernelWakelocksLocked() { Map<String, KernelWakelockStats> m = readKernelWakelockStats(); - + if (m == null) { // Not crashing might make board bringup easier. Slog.w(TAG, "Couldn't get kernel wake lock stats"); @@ -4120,10 +4119,10 @@ public final class BatteryStatsImpl extends BatteryStats { for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { String name = ent.getKey(); KernelWakelockStats kws = ent.getValue(); - + SamplingTimer kwlt = mKernelWakelockStats.get(name); if (kwlt == null) { - kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, + kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, true /* track reported values */); mKernelWakelockStats.put(name, kwlt); } @@ -4131,7 +4130,7 @@ public final class BatteryStatsImpl extends BatteryStats { kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); } - + if (m.size() != mKernelWakelockStats.size()) { // Set timers to stale if they didn't appear in /proc/wakelocks this time. for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { @@ -4276,18 +4275,18 @@ public final class BatteryStatsImpl extends BatteryStats { return getDischargeStartLevelLocked(); } } - + public int getDischargeStartLevelLocked() { return mDischargeUnplugLevel; } - + @Override public int getDischargeCurrentLevel() { synchronized(this) { return getDischargeCurrentLevelLocked(); } } - + public int getDischargeCurrentLevelLocked() { return mDischargeCurrentLevel; } @@ -4430,7 +4429,7 @@ public final class BatteryStatsImpl extends BatteryStats { writeSyncLocked(); mShuttingDown = true; } - + Parcel mPendingWrite = null; final ReentrantLock mWriteLock = new ReentrantLock(); @@ -4451,7 +4450,7 @@ public final class BatteryStatsImpl extends BatteryStats { if (mShuttingDown) { return; } - + Parcel out = Parcel.obtain(); writeSummaryToParcel(out); mLastWriteTime = SystemClock.elapsedRealtime(); @@ -4551,7 +4550,7 @@ public final class BatteryStatsImpl extends BatteryStats { } catch(java.io.IOException e) { Slog.e("BatteryStats", "Error reading battery statistics", e); } - + addHistoryRecordLocked(SystemClock.elapsedRealtime(), HistoryItem.CMD_START); } @@ -4570,7 +4569,7 @@ public final class BatteryStatsImpl extends BatteryStats { mHistoryBaseTime = rec.time; } } - + long oldnow = SystemClock.elapsedRealtime() - (5*60*100); if (oldnow > 0) { // If the system process has restarted, but not the entire @@ -4582,7 +4581,7 @@ public final class BatteryStatsImpl extends BatteryStats { mHistoryBaseTime -= oldnow; } } - + void writeHistory(Parcel out) { HistoryItem rec = mHistory; while (rec != null) { @@ -4591,7 +4590,7 @@ public final class BatteryStatsImpl extends BatteryStats { } out.writeLong(-1); } - + private void readSummaryFromParcel(Parcel in) { final int version = in.readInt(); if (version != VERSION) { @@ -4601,7 +4600,7 @@ public final class BatteryStatsImpl extends BatteryStats { } readHistory(in); - + mStartCount = in.readInt(); mBatteryUptime = in.readLong(); mBatteryRealtime = in.readLong(); @@ -4611,9 +4610,9 @@ public final class BatteryStatsImpl extends BatteryStats { mDischargeCurrentLevel = in.readInt(); mLowDischargeAmountSinceCharge = in.readInt(); mHighDischargeAmountSinceCharge = in.readInt(); - + mStartCount++; - + mScreenOn = false; mScreenOnTimer.readSummaryFromParcelLocked(in); for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { @@ -4693,7 +4692,7 @@ public final class BatteryStatsImpl extends BatteryStats { u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); } } - + int NW = in.readInt(); if (NW > 10000) { Slog.w(TAG, "File corrupt: too many wake locks " + NW); @@ -4786,7 +4785,7 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(VERSION); writeHistory(out); - + out.writeInt(mStartCount); out.writeLong(computeBatteryUptime(NOW_SYS, STATS_SINCE_CHARGED)); out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED)); @@ -4796,7 +4795,7 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(mDischargeCurrentLevel); out.writeInt(mLowDischargeAmountSinceCharge); out.writeInt(mHighDischargeAmountSinceCharge); - + mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); @@ -4825,14 +4824,14 @@ public final class BatteryStatsImpl extends BatteryStats { out.writeInt(0); } } - + out.writeInt(sNumSpeedSteps); final int NU = mUidStats.size(); out.writeInt(NU); for (int iu = 0; iu < NU; iu++) { out.writeInt(mUidStats.keyAt(iu)); Uid u = mUidStats.valueAt(iu); - + if (u.mWifiRunningTimer != null) { out.writeInt(1); u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); @@ -4878,7 +4877,7 @@ public final class BatteryStatsImpl extends BatteryStats { u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); } } - + int NW = u.mWakelockStats.size(); out.writeInt(NW); if (NW > 0) { @@ -4970,7 +4969,7 @@ public final class BatteryStatsImpl extends BatteryStats { } } } - + out.writeLong(u.getTcpBytesReceived(STATS_SINCE_CHARGED)); out.writeLong(u.getTcpBytesSent(STATS_SINCE_CHARGED)); } @@ -4979,7 +4978,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void readFromParcel(Parcel in) { readFromParcelLocked(in); } - + void readFromParcelLocked(Parcel in) { int magic = in.readInt(); if (magic != MAGIC) { @@ -4987,7 +4986,7 @@ public final class BatteryStatsImpl extends BatteryStats { } readHistory(in); - + mStartCount = in.readInt(); mBatteryUptime = in.readLong(); mBatteryLastUptime = 0; @@ -5062,7 +5061,7 @@ public final class BatteryStatsImpl extends BatteryStats { mKernelWakelockStats.put(wakelockName, kwlt); } } - + mPartialTimers.clear(); mFullTimers.clear(); mWindowTimers.clear(); @@ -5090,18 +5089,18 @@ public final class BatteryStatsImpl extends BatteryStats { public void writeToParcelWithoutUids(Parcel out, int flags) { writeToParcelLocked(out, false, flags); } - - @SuppressWarnings("unused") + + @SuppressWarnings("unused") void writeToParcelLocked(Parcel out, boolean inclUids, int flags) { final long uSecUptime = SystemClock.uptimeMillis() * 1000; final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; final long batteryUptime = getBatteryUptimeLocked(uSecUptime); final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); - + out.writeInt(MAGIC); - + writeHistory(out); - + out.writeInt(mStartCount); out.writeLong(mBatteryUptime); out.writeLong(mBatteryRealtime); @@ -5190,7 +5189,7 @@ public final class BatteryStatsImpl extends BatteryStats { return new BatteryStatsImpl[size]; } }; - + public void dumpLocked(PrintWriter pw) { if (DEBUG) { Printer pr = new PrintWriterPrinter(pw); diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index f700791..bf18d55 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -65,6 +65,7 @@ static SkMemoryStream* buildSkMemoryStream(SkStream *stream) { } } data = (char*)sk_realloc_throw(data, streamLen); + SkMemoryStream* streamMem = new SkMemoryStream(); streamMem->setMemoryOwned(data, streamLen); return streamMem; @@ -133,6 +134,12 @@ static jobject nativeNewInstanceFromFileDescriptor(JNIEnv* env, jobject clazz, } stream = fdStream; } else { + /* Restore our offset when we leave, so we can be called more than once + with the same descriptor. This is only required if we didn't dup the + file descriptor, but it is OK to do it all the time. + */ + AutoFDSeek as(descriptor); + SkFDStream* fdStream = new SkFDStream(descriptor, false); if (!fdStream->isValid()) { fdStream->unref(); @@ -142,12 +149,6 @@ static jobject nativeNewInstanceFromFileDescriptor(JNIEnv* env, jobject clazz, fdStream->unref(); } - /* Restore our offset when we leave, so we can be called more than once - with the same descriptor. This is only required if we didn't dup the - file descriptor, but it is OK to do it all the time. - */ - AutoFDSeek as(descriptor); - return doBuildTileIndex(env, stream); } diff --git a/include/media/IOMX.h b/include/media/IOMX.h index 1f8ce71..fa775e7 100644 --- a/include/media/IOMX.h +++ b/include/media/IOMX.h @@ -79,6 +79,9 @@ public: node_id node, OMX_INDEXTYPE index, const void *params, size_t size) = 0; + virtual status_t storeMetaDataInBuffers( + node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; + virtual status_t enableGraphicBuffers( node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0; diff --git a/include/media/stagefright/HardwareAPI.h b/include/media/stagefright/HardwareAPI.h index 4ded5e8..b009e1b 100644 --- a/include/media/stagefright/HardwareAPI.h +++ b/include/media/stagefright/HardwareAPI.h @@ -49,6 +49,32 @@ struct EnableAndroidNativeBuffersParams { OMX_BOOL enable; }; +// A pointer to this struct is passed to OMX_SetParameter() when the extension +// index "OMX.google.android.index.storeMetaDataInBuffers" +// is given. +// +// When meta data is stored in the video buffers passed between OMX clients +// and OMX components, interpretation of the buffer data is up to the +// buffer receiver, and the data may or may not be the actual video data, but +// some information helpful for the receiver to locate the actual data. +// The buffer receiver thus needs to know how to interpret what is stored +// in these buffers, with mechanisms pre-determined externally. How to +// interpret the meta data is outside of the scope of this method. +// +// Currently, this is specifically used to pass meta data from video source +// (camera component, for instance) to video encoder to avoid memcpying of +// input video frame data. To do this, bStoreMetaDta is set to OMX_TRUE. +// If bStoreMetaData is set to false, real YUV frame data will be stored +// in the buffers. In addition, if no OMX_SetParameter() call is made +// with the corresponding extension index, real YUV data is stored +// in the buffers. +struct StoreMetaDataInBuffersParams { + OMX_U32 nSize; + OMX_VERSIONTYPE nVersion; + OMX_U32 nPortIndex; + OMX_BOOL bStoreMetaData; +}; + // Color formats in the range [OMX_COLOR_FormatAndroidPrivateStart, // OMX_COLOR_FormatAndroidPrivateEnd) will be converted to a gralloc pixel // format when used to allocate Android native buffers via gralloc. The diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 38e153f..faad297 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -357,7 +357,7 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, mSnapshot->transform->mapRect(bounds); // Layers only make sense if they are in the framebuffer's bounds - bounds.intersect(*mSnapshot->clipRect); + bounds.intersect(*snapshot->clipRect); // When the layer is not an FBO, we may use glCopyTexImage so we // need to make sure the layer does not extend outside the bounds diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 6aa1ae6..23f34d2 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -58,6 +58,7 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; @@ -1112,18 +1113,16 @@ public class AudioService extends IAudioService.Stub { new BluetoothProfile.ServiceListener() { public void onServiceConnected(int profile, BluetoothProfile proxy) { mBluetoothHeadset = (BluetoothHeadset) proxy; - Set<BluetoothDevice> deviceSet = mBluetoothHeadset.getConnectedDevices(); - if (deviceSet.size() > 0) { - BluetoothDevice[] devices = - deviceSet.toArray(new BluetoothDevice[deviceSet.size()]); - mBluetoothHeadsetDevice = devices[0]; + List<BluetoothDevice> deviceList = mBluetoothHeadset.getConnectedDevices(); + if (deviceList.size() > 0) { + mBluetoothHeadsetDevice = deviceList.get(0); } else { mBluetoothHeadsetDevice = null; } } public void onServiceDisconnected(int profile) { if (mBluetoothHeadset != null) { - Set<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices(); + List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices(); if (devices.size() == 0) { mBluetoothHeadsetDevice = null; clearAllScoClients(); diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp index 40801a2..f975217 100644 --- a/media/libmedia/IOMX.cpp +++ b/media/libmedia/IOMX.cpp @@ -24,6 +24,7 @@ enum { ENABLE_GRAPHIC_BUFFERS, USE_BUFFER, USE_GRAPHIC_BUFFER, + STORE_META_DATA_IN_BUFFERS, ALLOC_BUFFER, ALLOC_BUFFER_WITH_BACKUP, FREE_BUFFER, @@ -276,6 +277,19 @@ public: return err; } + virtual status_t storeMetaDataInBuffers( + node_id node, OMX_U32 port_index, OMX_BOOL enable) { + Parcel data, reply; + data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); + data.writeIntPtr((intptr_t)node); + data.writeInt32(port_index); + data.writeInt32((uint32_t)enable); + remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply); + + status_t err = reply.readInt32(); + return err; + } + virtual status_t allocateBuffer( node_id node, OMX_U32 port_index, size_t size, buffer_id *buffer, void **buffer_data) { @@ -634,6 +648,20 @@ status_t BnOMX::onTransact( return NO_ERROR; } + case STORE_META_DATA_IN_BUFFERS: + { + CHECK_INTERFACE(IOMX, data, reply); + + node_id node = (void*)data.readIntPtr(); + OMX_U32 port_index = data.readInt32(); + OMX_BOOL enable = (OMX_BOOL)data.readInt32(); + + status_t err = storeMetaDataInBuffers(node, port_index, enable); + reply->writeInt32(err); + + return NO_ERROR; + } + case ALLOC_BUFFER: { CHECK_INTERFACE(IOMX, data, reply); diff --git a/media/libstagefright/include/OMX.h b/media/libstagefright/include/OMX.h index 83b75ad..5a6c96f9 100644 --- a/media/libstagefright/include/OMX.h +++ b/media/libstagefright/include/OMX.h @@ -62,6 +62,9 @@ public: virtual status_t enableGraphicBuffers( node_id node, OMX_U32 port_index, OMX_BOOL enable); + virtual status_t storeMetaDataInBuffers( + node_id node, OMX_U32 port_index, OMX_BOOL enable); + virtual status_t useBuffer( node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, buffer_id *buffer); diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h index 8c7c562..86c102c 100644 --- a/media/libstagefright/include/OMXNodeInstance.h +++ b/media/libstagefright/include/OMXNodeInstance.h @@ -50,6 +50,7 @@ struct OMXNodeInstance { status_t setConfig(OMX_INDEXTYPE index, const void *params, size_t size); status_t enableGraphicBuffers(OMX_U32 portIndex, OMX_BOOL enable); + status_t storeMetaDataInBuffers(OMX_U32 portIndex, OMX_BOOL enable); status_t useBuffer( OMX_U32 portIndex, const sp<IMemory> ¶ms, diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index d89f54b..f9f638f 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -294,6 +294,11 @@ status_t OMX::enableGraphicBuffers( return findInstance(node)->enableGraphicBuffers(port_index, enable); } +status_t OMX::storeMetaDataInBuffers( + node_id node, OMX_U32 port_index, OMX_BOOL enable) { + return findInstance(node)->storeMetaDataInBuffers(port_index, enable); +} + status_t OMX::useBuffer( node_id node, OMX_U32 port_index, const sp<IMemory> ¶ms, buffer_id *buffer) { diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index ba4d765..9b6d441 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -284,6 +284,37 @@ status_t OMXNodeInstance::enableGraphicBuffers( return OK; } +status_t OMXNodeInstance::storeMetaDataInBuffers( + OMX_U32 portIndex, + OMX_BOOL enable) { + Mutex::Autolock autolock(mLock); + + OMX_INDEXTYPE index; + OMX_STRING name = const_cast<OMX_STRING>( + "OMX.google.android.index.storeMetaDataInBuffers"); + + OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); + if (err != OMX_ErrorNone) { + LOGE("OMX_GetExtensionIndex %s failed", name); + return StatusFromOMXError(err); + } + + StoreMetaDataInBuffersParams params; + memset(¶ms, 0, sizeof(params)); + params.nSize = sizeof(params); + + // Version: 1.0.0.0 + params.nVersion.s.nVersionMajor = 1; + + params.nPortIndex = portIndex; + params.bStoreMetaData = enable; + if ((err = OMX_SetParameter(mHandle, index, ¶ms)) != OMX_ErrorNone) { + LOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err); + return UNKNOWN_ERROR; + } + return err; +} + status_t OMXNodeInstance::useBuffer( OMX_U32 portIndex, const sp<IMemory> ¶ms, OMX::buffer_id *buffer) { diff --git a/native/copy-to-ndk.sh b/native/copy-to-ndk.sh index 4f5a16a..6470892 100644 --- a/native/copy-to-ndk.sh +++ b/native/copy-to-ndk.sh @@ -10,7 +10,7 @@ copyndkheaders() { local DST_HEADERS=$NDK_PLATFORMS/$CURR_PLATFORM local SRC_LIB_ANDROID=$ANDROID_PRODUCT_OUT/system/lib/libandroid.so - local DST_LIB_ANDROID=$NDK_PLATFORMS/$CURR_PLATFORM/arch-arm/usr/lib/libandroid.so + local DST_LIB_ANDROID=$NDK_PLATFORMS/$CURR_PLATFORM/arch-arm/lib/libandroid.so local didsomething="" @@ -20,9 +20,9 @@ copyndkheaders() { local src=$SRC_HEADERS/$i local changed="" for j in $ALL_PLATFORMS; do - local dst=$NDK_PLATFORMS/$j/arch-arm/usr/include/android/$i + local dst=$NDK_PLATFORMS/$j/include/android/$i if [ "$changed" == "" -a -e $dst ]; then - #echo "Exists: $dst" + echo "Exists: $dst" if diff $src $dst >/dev/null; then echo "$i: has not changed from $j" >/dev/null changed="false" @@ -34,13 +34,13 @@ copyndkheaders() { done if [ "$changed" == "true" -o "$changed" == "" ]; then echo "Updating: $i" - cp $src $NDK_PLATFORMS/$CURR_PLATFORM/arch-arm/usr/include/android/$i + cp $src $NDK_PLATFORMS/$CURR_PLATFORM/include/android/$i didsomething="true" fi done if diff $SRC_LIB_ANDROID $DST_LIB_ANDROID >/dev/null; then - echo "libandroid.so: has not changed" >/dev/null + echo "libandroid.so: has not changed" else echo "Updating: $DST_LIB_ANDROID" cp $SRC_LIB_ANDROID $DST_LIB_ANDROID diff --git a/packages/SystemUI/res/anim/notification_dnd_off.xml b/packages/SystemUI/res/anim/notification_dnd_off.xml new file mode 100644 index 0000000..4e88855 --- /dev/null +++ b/packages/SystemUI/res/anim/notification_dnd_off.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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" + > + <translate android:fromXDelta="100%p" android:toXDelta="0" + android:duration="@android:integer/config_longAnimTime" + android:interpolator="@anim/hydraulic_brake_interpolator" + /> +</set> diff --git a/packages/SystemUI/res/anim/notification_dnd_on.xml b/packages/SystemUI/res/anim/notification_dnd_on.xml new file mode 100644 index 0000000..309943b --- /dev/null +++ b/packages/SystemUI/res/anim/notification_dnd_on.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2010 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" + > + <translate android:toXDelta="100%p" android:fromXDelta="0" + android:duration="@android:integer/config_longAnimTime" + android:interpolator="@anim/hydraulic_brake_interpolator" + /> +</set> diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png Binary files differnew file mode 100644 index 0000000..9123fef --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png Binary files differnew file mode 100644 index 0000000..8e56f2a --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png Binary files differnew file mode 100644 index 0000000..80cf99c --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png Binary files differnew file mode 100644 index 0000000..e0d018b --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png Binary files differnew file mode 100644 index 0000000..5db8c9c --- /dev/null +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index ed52ad5..cf96e37 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -28,19 +28,21 @@ > <ImageView - android:id="@+id/expand" + android:id="@+id/notificationTrigger" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_sysbar_open" + android:layout_height="match_parent" + android:layout_alignParentRight="true" + android:layout_marginLeft="6dip" + android:src="@drawable/ic_sysbar_noti_none" android:background="@drawable/ic_sysbar_icon_bg" - android:paddingLeft="6dip" + android:gravity="center" /> <LinearLayout android:id="@+id/notificationButtons" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_toRightOf="@+id/expand" + android:layout_toLeftOf="@+id/notificationTrigger" android:gravity="center_vertical" android:orientation="horizontal" android:visibility="gone" @@ -78,7 +80,7 @@ android:id="@+id/notificationIcons" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_toLeftOf="@+id/expand" + android:layout_toLeftOf="@+id/notificationTrigger" android:gravity="center_vertical" android:orientation="horizontal" > @@ -92,14 +94,6 @@ android:visibility="invisible" /> <view - class="com.android.systemui.statusbar.tablet.NotificationIconArea$DraggerView" - android:id="@+id/handle" - android:layout_width="32dip" - android:layout_height="match_parent" - android:background="@drawable/sysbar_hidenotification_handle" - android:layout_marginLeft="8dip" - /> - <view class="com.android.systemui.statusbar.tablet.NotificationIconArea$IconLayout" android:id="@+id/icons" android:layout_width="wrap_content" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java index 7c7d74c..2b4f9d2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java @@ -32,13 +32,11 @@ public class NotificationIconArea extends LinearLayout { private static final String TAG = "NotificationIconArea"; IconLayout mIconLayout; - DraggerView mDraggerView; public NotificationIconArea(Context context, AttributeSet attrs) { super(context, attrs); mIconLayout = (IconLayout)findViewById(R.id.icons); - mDraggerView = (DraggerView) findViewById(R.id.handle); } static class IconLayout extends LinearLayout { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java index fd65e4d..d11aba6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java @@ -77,7 +77,7 @@ public class TabletStatusBarService extends StatusBarService { private NotificationData mNotns = new NotificationData(); TabletStatusBarView mStatusBarView; - View mNotificationTrigger; + ImageView mNotificationTrigger; NotificationIconArea mNotificationIconArea; View mNotificationButtons; View mSystemInfo; @@ -192,7 +192,7 @@ public class TabletStatusBarService extends StatusBarService { mCurtains.setOnLongClickListener(on); // the button to open the notification area - mNotificationTrigger = sb.findViewById(R.id.expand); + mNotificationTrigger = (ImageView) sb.findViewById(R.id.notificationTrigger); mNotificationTrigger.setOnClickListener(mOnClickListener); // the more notifications icon @@ -222,6 +222,7 @@ public class TabletStatusBarService extends StatusBarService { // set the initial view visibility setAreThereNotifications(); + refreshNotificationTrigger(); // Add the windows addPanelWindows(); @@ -253,6 +254,7 @@ public class TabletStatusBarService extends StatusBarService { R.anim.notification_icons_out); setViewVisibility(mNotificationButtons, View.VISIBLE, R.anim.notification_buttons_in); + refreshNotificationTrigger(); } break; case MSG_CLOSE_NOTIFICATION_PANEL: @@ -263,6 +265,7 @@ public class TabletStatusBarService extends StatusBarService { R.anim.notification_icons_in); setViewVisibility(mNotificationButtons, View.GONE, R.anim.notification_buttons_out); + refreshNotificationTrigger(); } break; case MSG_OPEN_SYSTEM_PANEL: @@ -276,6 +279,22 @@ public class TabletStatusBarService extends StatusBarService { } } } + + public void refreshNotificationTrigger() { + if (mNotificationTrigger == null) return; + + int resId; + boolean panel = (mNotificationPanel != null + && mNotificationPanel.getVisibility() == View.VISIBLE); + if (!mNotificationsOn) { + resId = R.drawable.ic_sysbar_noti_dnd; + } else if (mNotns.size() > 0) { + resId = panel ? R.drawable.ic_sysbar_noti_avail_open : R.drawable.ic_sysbar_noti_avail; + } else { + resId = panel ? R.drawable.ic_sysbar_noti_none_open : R.drawable.ic_sysbar_noti_none; + } + mNotificationTrigger.setImageResource(resId); + } public void setBatteryMeter(int level, boolean plugged) { if (DEBUG) Slog.d(TAG, "battery=" + level + (plugged ? " - plugged" : " - unplugged")); @@ -598,21 +617,30 @@ public class TabletStatusBarService extends StatusBarService { // system process is dead if we're here. } animateCollapse(); + refreshNotificationTrigger(); } void onClickDoNotDisturb() { mNotificationsOn = !mNotificationsOn; + mIconLayout.setVisibility(mNotificationsOn ? View.VISIBLE : View.INVISIBLE); // TODO: animation animateCollapse(); + refreshNotificationTrigger(); } public void onClickNotificationTrigger() { if (DEBUG) Slog.d(TAG, "clicked notification icons"); if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { - int msg = (mNotificationPanel.getVisibility() == View.GONE) - ? MSG_OPEN_NOTIFICATION_PANEL - : MSG_CLOSE_NOTIFICATION_PANEL; - mHandler.removeMessages(msg); - mHandler.sendEmptyMessage(msg); + if (!mNotificationsOn) { + mNotificationsOn = true; + mIconLayout.setVisibility(View.VISIBLE); // TODO: animation + refreshNotificationTrigger(); + } else { + int msg = (mNotificationPanel.getVisibility() == View.GONE) + ? MSG_OPEN_NOTIFICATION_PANEL + : MSG_CLOSE_NOTIFICATION_PANEL; + mHandler.removeMessages(msg); + mHandler.sendEmptyMessage(msg); + } } } @@ -757,6 +785,8 @@ public class TabletStatusBarService extends StatusBarService { for (int i=0; i<N; i++) { mPile.addView(mNotns.get(N-i-1).row); } + + refreshNotificationTrigger(); } private boolean inflateViews(NotificationData.Entry entry, ViewGroup parent) { diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java index c50a01e..7c758a2 100644 --- a/services/java/com/android/server/PackageManagerService.java +++ b/services/java/com/android/server/PackageManagerService.java @@ -7166,7 +7166,9 @@ class PackageManagerService extends IPackageManager.Stub { pw.print(" resourcePath="); pw.println(ps.resourcePathString); pw.print(" nativeLibraryPath="); pw.println(ps.nativeLibraryPathString); pw.print(" obbPath="); pw.println(ps.obbPathString); + pw.print(" versionCode="); pw.println(ps.versionCode); if (ps.pkg != null) { + pw.print(" versionName="); pw.println(ps.pkg.mVersionName); pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir); pw.print(" targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion); if (ps.pkg.mOperationPending) { @@ -7224,8 +7226,6 @@ class PackageManagerService extends IPackageManager.Stub { pw.print(" pkgFlags=0x"); pw.print(Integer.toHexString(ps.pkgFlags)); pw.print(" installStatus="); pw.print(ps.installStatus); pw.print(" enabled="); pw.println(ps.enabled); - pw.print(" versionCode="); pw.print(ps.versionCode); - pw.print(" versionName="); pw.println(ps.pkg.mVersionName); if (ps.disabledComponents.size() > 0) { pw.println(" disabledComponents:"); for (String s : ps.disabledComponents) { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 54a7aa1..de2e965 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -7152,7 +7152,7 @@ public final class ActivityManagerService extends ActivityManagerNative } else if (adj >= SECONDARY_SERVER_ADJ) { currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE; } else if (adj >= HEAVY_WEIGHT_APP_ADJ) { - currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_HEAVY_WEIGHT; + currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE; } else if (adj >= PERCEPTIBLE_APP_ADJ) { currApp.importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE; } else if (adj >= VISIBLE_APP_ADJ) { diff --git a/tools/layoutlib/bridge/.classpath b/tools/layoutlib/bridge/.classpath index 175a98b..70140d8 100644 --- a/tools/layoutlib/bridge/.classpath +++ b/tools/layoutlib/bridge/.classpath @@ -4,7 +4,7 @@ <classpathentry kind="src" path="tests"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/> - <classpathentry combineaccessrules="false" kind="src" path="/layoutlib_api"/> + <classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/layoutlib_api/layoutlib_api-prebuilt.jar"/> <classpathentry kind="var" path="ANDROID_SRC/prebuilt/common/kxml2/kxml2-2.3.0.jar" sourcepath="/ANDROID_SRC/dalvik/libcore/xml/src/main/java"/> <classpathentry kind="var" path="ANDROID_OUT_FRAMEWORK/layoutlib.jar" sourcepath="/ANDROID_SRC/frameworks/base/core/java"/> <classpathentry kind="var" path="ANDROID_OUT_FRAMEWORK/ninepatch.jar" sourcepath="/ANDROID_SRC/development/tools/ninepatch/src"/> diff --git a/tools/layoutlib/bridge/Android.mk b/tools/layoutlib/bridge/Android.mk index b2010d5..b7a602a 100644 --- a/tools/layoutlib/bridge/Android.mk +++ b/tools/layoutlib/bridge/Android.mk @@ -20,7 +20,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under,src) LOCAL_JAVA_LIBRARIES := \ kxml2-2.3.0 \ - layoutlib_api \ + layoutlib_api-prebuilt \ ninepatch LOCAL_STATIC_JAVA_LIBRARIES := temp_layoutlib diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java index 9ad2e6e..7d80796 100644 --- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java @@ -28,11 +28,8 @@ import org.junit.Before; import org.junit.Test; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.util.TraceClassVisitor; import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; import java.lang.annotation.Annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -178,24 +175,26 @@ public class DelegateClassAdapterTest { }; cl2.testModifiedInstance(); - } catch (Throwable t) { - // For debugging, dump the bytecode of the class in case of unexpected error. - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - TraceClassVisitor tcv = new TraceClassVisitor(pw); - - ClassReader cr2 = new ClassReader(bytes); - cr2.accept(tcv, 0 /* flags */); - - String msg = "\n" + t.getClass().getCanonicalName(); - if (t.getMessage() != null) { - msg += ": " + t.getMessage(); - } - msg = msg + "\nBytecode dump:\n" + sw.toString(); - - // Re-throw exception with new message - RuntimeException ex = new RuntimeException(msg, t); - throw ex; + // This code block is useful for debugging. However to make it work you need to + // pull in the org.objectweb.asm.util.TraceClassVisitor class and associated + // utilities which are found in the ASM source jar. + // + // } catch (Throwable t) { + // For debugging, dump the bytecode of the class in case of unexpected error. + // StringWriter sw = new StringWriter(); + // PrintWriter pw = new PrintWriter(sw); + // TraceClassVisitor tcv = new TraceClassVisitor(pw); + // ClassReader cr2 = new ClassReader(bytes); + // cr2.accept(tcv, 0 /* flags */); + // String msg = "\n" + t.getClass().getCanonicalName(); + // if (t.getMessage() != null) { + // msg += ": " + t.getMessage(); + // } + // msg = msg + "\nBytecode dump:\n" + sw.toString(); + // // Re-throw exception with new message + // RuntimeException ex = new RuntimeException(msg, t); + // throw ex; + } finally { } } diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index 65b910b..e3deeb3 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -79,7 +79,6 @@ import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Pattern; @@ -1297,14 +1296,14 @@ public class WifiStateMachine extends HierarchicalStateMachine { */ private boolean shouldDisableCoexistenceMode() { if (mBluetoothHeadset == null) return true; - Set<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices(); + List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices(); return (devices.size() != 0 ? false : true); } private void checkIsBluetoothPlaying() { boolean isBluetoothPlaying = false; if (mBluetoothA2dp != null) { - Set<BluetoothDevice> connected = mBluetoothA2dp.getConnectedDevices(); + List<BluetoothDevice> connected = mBluetoothA2dp.getConnectedDevices(); for (BluetoothDevice device : connected) { if (mBluetoothA2dp.isA2dpPlaying(device)) { |
