Merge "Update advanced bt header"
diff --git a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java
index 4b8efd4..a09018e 100644
--- a/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderController.java
@@ -21,6 +21,7 @@
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.Drawable;
+import android.view.View;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
@@ -33,12 +34,16 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.fuelgauge.BatteryMeterView;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
+import com.android.settingslib.core.lifecycle.LifecycleObserver;
+import com.android.settingslib.core.lifecycle.events.OnStart;
+import com.android.settingslib.core.lifecycle.events.OnStop;
 import com.android.settingslib.widget.LayoutPreference;
 
 /**
  * This class adds a header with device name and status (connected/disconnected, etc.).
  */
-public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceController {
+public class AdvancedBluetoothDetailsHeaderController extends BasePreferenceController implements
+        LifecycleObserver, OnStart, OnStop, CachedBluetoothDevice.Callback {
 
     @VisibleForTesting
     LayoutPreference mLayoutPreference;
@@ -63,6 +68,16 @@
         refresh();
     }
 
+    @Override
+    public void onStart() {
+        mCachedDevice.registerCallback(this::onDeviceAttributesChanged);
+    }
+
+    @Override
+    public void onStop() {
+        mCachedDevice.unregisterCallback(this::onDeviceAttributesChanged);
+    }
+
     public void init(CachedBluetoothDevice cachedBluetoothDevice) {
         mCachedDevice = cachedBluetoothDevice;
     }
@@ -75,25 +90,33 @@
             final TextView summary = mLayoutPreference.findViewById(R.id.entity_header_summary);
             summary.setText(mCachedDevice.getConnectionSummary());
 
+            if (!mCachedDevice.isConnected()) {
+                updateDisconnectLayout();
+                return;
+            }
+
             updateSubLayout(mLayoutPreference.findViewById(R.id.layout_left),
                     BluetoothDevice.METADATA_UNTHETHERED_LEFT_ICON,
                     BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY,
+                    BluetoothDevice.METADATA_UNTHETHERED_LEFT_CHARGING,
                     R.string.bluetooth_left_name);
 
             updateSubLayout(mLayoutPreference.findViewById(R.id.layout_middle),
                     BluetoothDevice.METADATA_UNTHETHERED_CASE_ICON,
                     BluetoothDevice.METADATA_UNTHETHERED_CASE_BATTERY,
+                    BluetoothDevice.METADATA_UNTHETHERED_CASE_CHARGING,
                     R.string.bluetooth_middle_name);
 
             updateSubLayout(mLayoutPreference.findViewById(R.id.layout_right),
                     BluetoothDevice.METADATA_UNTHETHERED_RIGHT_ICON,
                     BluetoothDevice.METADATA_UNTHETHERED_RIGHT_BATTERY,
+                    BluetoothDevice.METADATA_UNTHETHERED_RIGHT_CHARGING,
                     R.string.bluetooth_right_name);
         }
     }
 
     @VisibleForTesting
-    Drawable createBtBatteryIcon(Context context, int level) {
+    Drawable createBtBatteryIcon(Context context, int level, boolean charging) {
         final BatteryMeterView.BatteryMeterDrawable drawable =
                 new BatteryMeterView.BatteryMeterDrawable(context,
                         context.getColor(R.color.meter_background_color));
@@ -103,12 +126,13 @@
                 com.android.settings.Utils.getColorAttrDefaultColor(context,
                         android.R.attr.colorControlNormal),
                 PorterDuff.Mode.SRC_IN));
+        drawable.setCharging(charging);
 
         return drawable;
     }
 
     private void updateSubLayout(LinearLayout linearLayout, int iconMetaKey, int batteryMetaKey,
-            int titleResId) {
+            int chargeMetaKey, int titleResId) {
         if (linearLayout == null) {
             return;
         }
@@ -121,14 +145,51 @@
         }
 
         final int batteryLevel = Utils.getIntMetaData(bluetoothDevice, batteryMetaKey);
+        final boolean charging = Utils.getBooleanMetaData(bluetoothDevice, chargeMetaKey);
         if (batteryLevel != Utils.META_INT_ERROR) {
+            linearLayout.setVisibility(View.VISIBLE);
             final ImageView imageView = linearLayout.findViewById(R.id.bt_battery_icon);
-            imageView.setImageDrawable(createBtBatteryIcon(mContext, batteryLevel));
+            imageView.setImageDrawable(createBtBatteryIcon(mContext, batteryLevel, charging));
+            imageView.setVisibility(View.VISIBLE);
             final TextView textView = linearLayout.findViewById(R.id.bt_battery_summary);
             textView.setText(com.android.settings.Utils.formatPercentage(batteryLevel));
+            textView.setVisibility(View.VISIBLE);
+        } else {
+            // Hide it if it doesn't have battery information
+            linearLayout.setVisibility(View.GONE);
         }
 
         final TextView textView = linearLayout.findViewById(R.id.header_title);
         textView.setText(titleResId);
+        textView.setVisibility(View.VISIBLE);
+    }
+
+    private void updateDisconnectLayout() {
+        mLayoutPreference.findViewById(R.id.layout_left).setVisibility(View.GONE);
+        mLayoutPreference.findViewById(R.id.layout_right).setVisibility(View.GONE);
+
+        // Hide title, battery icon and battery summary
+        final LinearLayout linearLayout = mLayoutPreference.findViewById(R.id.layout_middle);
+        linearLayout.setVisibility(View.VISIBLE);
+        linearLayout.findViewById(R.id.header_title).setVisibility(View.GONE);
+        linearLayout.findViewById(R.id.bt_battery_summary).setVisibility(View.GONE);
+        linearLayout.findViewById(R.id.bt_battery_icon).setVisibility(View.GONE);
+
+        // Only show bluetooth icon
+        final BluetoothDevice bluetoothDevice = mCachedDevice.getDevice();
+        final String iconUri = Utils.getStringMetaData(bluetoothDevice,
+                BluetoothDevice.METADATA_MAIN_ICON);
+        if (iconUri != null) {
+            final ImageView imageView = linearLayout.findViewById(R.id.header_icon);
+            final IconCompat iconCompat = IconCompat.createWithContentUri(iconUri);
+            imageView.setImageBitmap(iconCompat.getBitmap());
+        }
+    }
+
+    @Override
+    public void onDeviceAttributesChanged() {
+        if (mCachedDevice != null) {
+            refresh();
+        }
     }
 }
diff --git a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java
index a74610e..e646273 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/AdvancedBluetoothDetailsHeaderControllerTest.java
@@ -24,6 +24,7 @@
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.view.LayoutInflater;
+import android.view.View;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
@@ -74,16 +75,18 @@
 
     @Test
     public void createBatteryIcon_hasCorrectInfo() {
-        final Drawable drawable = mController.createBtBatteryIcon(mContext, BATTERY_LEVEL_MAIN);
+        final Drawable drawable = mController.createBtBatteryIcon(mContext, BATTERY_LEVEL_MAIN,
+                true /* charging */);
         assertThat(drawable).isInstanceOf(BatteryMeterView.BatteryMeterDrawable.class);
 
         final BatteryMeterView.BatteryMeterDrawable iconDrawable =
                 (BatteryMeterView.BatteryMeterDrawable) drawable;
         assertThat(iconDrawable.getBatteryLevel()).isEqualTo(BATTERY_LEVEL_MAIN);
+        assertThat(iconDrawable.getCharging()).isTrue();
     }
 
     @Test
-    public void refresh_updateCorrectInfo() {
+    public void refresh_connected_updateCorrectInfo() {
         when(mBluetoothDevice.getMetadata(
                 BluetoothDevice.METADATA_UNTHETHERED_LEFT_BATTERY)).thenReturn(
                 String.valueOf(BATTERY_LEVEL_LEFT));
@@ -93,6 +96,7 @@
         when(mBluetoothDevice.getMetadata(
                 BluetoothDevice.METADATA_UNTHETHERED_CASE_BATTERY)).thenReturn(
                 String.valueOf(BATTERY_LEVEL_MAIN));
+        when(mCachedDevice.isConnected()).thenReturn(true);
         mController.refresh();
 
         assertBatteryLevel(mLayoutPreference.findViewById(R.id.layout_left), BATTERY_LEVEL_LEFT);
@@ -101,6 +105,26 @@
     }
 
     @Test
+    public void refresh_disconnected_updateCorrectInfo() {
+        when(mCachedDevice.isConnected()).thenReturn(false);
+
+        mController.refresh();
+
+        final LinearLayout layout = mLayoutPreference.findViewById(R.id.layout_middle);
+
+        assertThat(mLayoutPreference.findViewById(R.id.layout_left).getVisibility()).isEqualTo(
+                View.GONE);
+        assertThat(mLayoutPreference.findViewById(R.id.layout_right).getVisibility()).isEqualTo(
+                View.GONE);
+        assertThat(layout.getVisibility()).isEqualTo(View.VISIBLE);
+        assertThat(layout.findViewById(R.id.header_title).getVisibility()).isEqualTo(View.GONE);
+        assertThat(layout.findViewById(R.id.bt_battery_summary).getVisibility()).isEqualTo(
+                View.GONE);
+        assertThat(layout.findViewById(R.id.bt_battery_icon).getVisibility()).isEqualTo(View.GONE);
+        assertThat(layout.findViewById(R.id.header_icon).getVisibility()).isEqualTo(View.VISIBLE);
+    }
+
+    @Test
     public void getAvailabilityStatus_unthetheredHeadset_returnAvailable() {
         when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTHETHERED_HEADSET))
                 .thenReturn("true");