--- /dev/null
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Record of energy and activity information from controller and
+ * underlying bt stack state.Timestamp the record with system
+ * time
+ * @hide
+ */
+public final class BluetoothActivityEnergyInfo implements Parcelable {
+ private final int mBluetoothStackState;
+ private final int mControllerTxTimeMs;
+ private final int mControllerRxTimeMs;
+ private final int mControllerIdleTimeMs;
+ private final int mControllerEnergyUsed;
+ private final long timestamp;
+
+ public static final int BT_STACK_STATE_INVALID = 0;
+ public static final int BT_STACK_STATE_STATE_ACTIVE = 1;
+ public static final int BT_STACK_STATE_STATE_SCANNING = 2;
+ public static final int BT_STACK_STATE_STATE_IDLE = 3;
+
+ public BluetoothActivityEnergyInfo(int stackState, int txTime, int rxTime,
+ int idleTime, int energyUsed) {
+ mBluetoothStackState = stackState;
+ mControllerTxTimeMs = txTime;
+ mControllerRxTimeMs = rxTime;
+ mControllerIdleTimeMs = idleTime;
+ mControllerEnergyUsed = energyUsed;
+ timestamp = System.currentTimeMillis();
+ }
+
+ @Override
+ public String toString() {
+ return "BluetoothActivityEnergyInfo{"
+ + " timestamp=" + timestamp
+ + " mBluetoothStackState=" + mBluetoothStackState
+ + " mControllerTxTimeMs=" + mControllerTxTimeMs
+ + " mControllerRxTimeMs=" + mControllerRxTimeMs
+ + " mControllerIdleTimeMs=" + mControllerIdleTimeMs
+ + " mControllerEnergyUsed=" + mControllerEnergyUsed
+ + " }";
+ }
+
+ public static final Parcelable.Creator<BluetoothActivityEnergyInfo> CREATOR =
+ new Parcelable.Creator<BluetoothActivityEnergyInfo>() {
+ public BluetoothActivityEnergyInfo createFromParcel(Parcel in) {
+ int stackState = in.readInt();
+ int txTime = in.readInt();
+ int rxTime = in.readInt();
+ int idleTime = in.readInt();
+ int energyUsed = in.readInt();
+ return new BluetoothActivityEnergyInfo(stackState, txTime, rxTime,
+ idleTime, energyUsed);
+ }
+ public BluetoothActivityEnergyInfo[] newArray(int size) {
+ return new BluetoothActivityEnergyInfo[size];
+ }
+ };
+
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mBluetoothStackState);
+ out.writeInt(mControllerTxTimeMs);
+ out.writeInt(mControllerRxTimeMs);
+ out.writeInt(mControllerIdleTimeMs);
+ out.writeInt(mControllerEnergyUsed);
+ }
+
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * @return bt stack reported state
+ */
+ public int getBluetoothStackState() {
+ return mBluetoothStackState;
+ }
+
+ /**
+ * @return tx time in ms
+ */
+ public int getControllerTxTimeMillis() {
+ return mControllerTxTimeMs;
+ }
+
+ /**
+ * @return rx time in ms
+ */
+ public int getControllerRxTimeMillis() {
+ return mControllerRxTimeMs;
+ }
+
+ /**
+ * @return idle time in ms
+ */
+ public int getControllerIdleTimeMillis() {
+ return mControllerIdleTimeMs;
+ }
+
+ /**
+ * product of current(mA), voltage(V) and time(ms)
+ * @return energy used
+ */
+ public int getControllerEnergyUsed() {
+ return mControllerEnergyUsed;
+ }
+ /**
+ * @return timestamp(wall clock) of record creation
+ */
+ public long getTimeStamp() {
+ return timestamp;
+ }
+
+ /**
+ * @return if the record is valid
+ */
+ public boolean isValid() {
+ return ((getControllerTxTimeMillis() !=0) ||
+ (getControllerRxTimeMillis() !=0) ||
+ (getControllerIdleTimeMillis() !=0));
+ }
+}
private static final int ADDRESS_LENGTH = 17;
+ private static final int CONTROLLER_ENERGY_UPDATE_TIMEOUT_MILLIS = 30;
+ /** @hide */
+ public static final int ACTIVITY_ENERGY_INFO_CACHED = 0;
+ /** @hide */
+ public static final int ACTIVITY_ENERGY_INFO_REFRESHED = 1;
+
/**
* Lazily initialized singleton. Guaranteed final after first object
* constructed.
}
/**
+ * Return the record of {@link BluetoothActivityEnergyInfo} object that
+ * has the activity and energy info. This can be used to ascertain what
+ * the controller has been up to, since the last sample.
+ * @param updateType Type of info, cached vs refreshed.
+ *
+ * @return a record with {@link BluetoothActivityEnergyInfo} or null if
+ * report is unavailable or unsupported
+ * @hide
+ */
+ public BluetoothActivityEnergyInfo getControllerActivityEnergyInfo(int updateType) {
+ if (getState() != STATE_ON) return null;
+ try {
+ BluetoothActivityEnergyInfo record;
+ if (!mService.isActivityAndEnergyReportingSupported()) {
+ return null;
+ }
+ synchronized(this) {
+ if (updateType == ACTIVITY_ENERGY_INFO_REFRESHED) {
+ mService.getActivityEnergyInfoFromController();
+ wait(CONTROLLER_ENERGY_UPDATE_TIMEOUT_MILLIS);
+ }
+ record = mService.reportActivityInfo();
+ if (record.isValid()) {
+ return record;
+ } else {
+ return null;
+ }
+ }
+ } catch (InterruptedException e) {
+ Log.e(TAG, "getControllerActivityEnergyInfoCallback wait interrupted: " + e);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getControllerActivityEnergyInfoCallback: " + e);
+ }
+ return null;
+ }
+
+ /**
* Return the set of {@link BluetoothDevice} objects that are bonded
* (paired) to the local adapter.
* <p>If Bluetooth state is not {@link #STATE_ON}, this API