From 00938baf7d2a51006d9c2f462d830b1db932aebb Mon Sep 17 00:00:00 2001 From: Daniele Gobbetti Date: Fri, 21 Oct 2016 17:44:36 +0200 Subject: [PATCH] Further refinements: - disconnect by long-pressing device icon (temporary) - use level-list to show battery level + charging - remove padding around cards list - use style colors for action icons (supports dark theme) - add secondary text to the themes, even though the color is the same - replace the info icon with three vertical dots --- .../adapter/GBDeviceAdapterv2.java | 129 ++++++++++-------- app/src/main/res/drawable/ic_battery_20.xml | 13 ++ app/src/main/res/drawable/ic_battery_50.xml | 13 ++ app/src/main/res/drawable/ic_battery_80.xml | 13 ++ .../res/drawable/ic_battery_charging_20.xml | 13 ++ .../res/drawable/ic_battery_charging_50.xml | 13 ++ .../res/drawable/ic_battery_charging_80.xml | 13 ++ .../res/drawable/ic_battery_charging_full.xml | 9 ++ .../{ic_battery.xml => ic_battery_full.xml} | 0 app/src/main/res/drawable/ic_more_vert.xml | 9 ++ .../main/res/drawable/level_list_battery.xml | 11 ++ .../activity_controlcenterv2_content_main.xml | 4 - app/src/main/res/layout/device_itemv2.xml | 34 +++-- app/src/main/res/values/styles.xml | 2 + 14 files changed, 206 insertions(+), 70 deletions(-) create mode 100644 app/src/main/res/drawable/ic_battery_20.xml create mode 100644 app/src/main/res/drawable/ic_battery_50.xml create mode 100644 app/src/main/res/drawable/ic_battery_80.xml create mode 100644 app/src/main/res/drawable/ic_battery_charging_20.xml create mode 100644 app/src/main/res/drawable/ic_battery_charging_50.xml create mode 100644 app/src/main/res/drawable/ic_battery_charging_80.xml create mode 100644 app/src/main/res/drawable/ic_battery_charging_full.xml rename app/src/main/res/drawable/{ic_battery.xml => ic_battery_full.xml} (100%) create mode 100644 app/src/main/res/drawable/ic_more_vert.xml create mode 100644 app/src/main/res/drawable/level_list_battery.xml diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java index c3e43e49d..9f891c6fa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java @@ -2,7 +2,6 @@ package nodomain.freeyourgadget.gadgetbridge.adapter; import android.content.Context; import android.content.Intent; -import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -14,7 +13,6 @@ import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; -import java.util.Collections; import java.util.List; import nodomain.freeyourgadget.gadgetbridge.GBApplication; @@ -24,7 +22,6 @@ import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.model.BatteryState; -import nodomain.freeyourgadget.gadgetbridge.model.ItemWithDetails; import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; /** @@ -57,6 +54,16 @@ public class GBDeviceAdapterv2 extends ArrayAdapter { TextView batteryStatusLabel = (TextView) view.findViewById(R.id.battery_status); final ImageView deviceImageView = (ImageView) view.findViewById(R.id.device_image); + deviceImageView.setOnLongClickListener(new View.OnLongClickListener(){ + + @Override + public boolean onLongClick(View v) { + //TODO: move somewhere else + GBApplication.deviceService().disconnect(); + + return true; + } + }); ProgressBar busyIndicator = (ProgressBar) view.findViewById(R.id.device_busy_indicator); @@ -82,110 +89,120 @@ public class GBDeviceAdapterv2 extends ArrayAdapter { batteryStatusBox.setVisibility(View.VISIBLE); batteryStatusLabel.setText(device.getBatteryLevel() + "%"); BatteryState batteryState = device.getBatteryState(); - if (BatteryState.BATTERY_LOW.equals(batteryState)) { - //batteryIcon.setImageTintMode(olor.RED); + if (BatteryState.BATTERY_CHARGING.equals(batteryState) || + BatteryState.BATTERY_CHARGING_FULL.equals(batteryState)) { + batteryIcon.setImageLevel(device.getBatteryLevel() + 100); } else { - batteryStatusLabel.setTextColor(ContextCompat.getColor(getContext(), R.color.secondarytext)); - - if (BatteryState.BATTERY_CHARGING.equals(batteryState) || - BatteryState.BATTERY_CHARGING_FULL.equals(batteryState)) { - batteryStatusLabel.append(" CHG"); - } + batteryIcon.setImageLevel(device.getBatteryLevel()); } } - //fetch activity data ImageView fetchActivityData = (ImageView) view.findViewById(R.id.device_action_fetch_activity); LinearLayout fetchActivityDataBox = (LinearLayout) view.findViewById(R.id.device_action_fetch_activity_box); - fetchActivityDataBox.setVisibility((device.isConnected() && coordinator.supportsActivityDataFetching()) ? View.VISIBLE : View.GONE); - fetchActivityData.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - GBApplication.deviceService().onFetchActivityData(); - } - } + fetchActivityDataBox.setVisibility((device.isInitialized() && coordinator.supportsActivityDataFetching()) ? View.VISIBLE : View.GONE); + fetchActivityData.setOnClickListener(new View.OnClickListener() + + { + @Override + public void onClick(View v) { + GBApplication.deviceService().onFetchActivityData(); + } + } + ); //take screenshot ImageView takeScreenshotView = (ImageView) view.findViewById(R.id.device_action_take_screenshot); - takeScreenshotView.setVisibility((device.isConnected() && coordinator.supportsScreenshots()) ? View.VISIBLE : View.GONE); - takeScreenshotView.setOnClickListener(new View.OnClickListener() { + takeScreenshotView.setVisibility((device.isInitialized() && coordinator.supportsScreenshots()) ? View.VISIBLE : View.GONE); + takeScreenshotView.setOnClickListener(new View.OnClickListener() + + { @Override public void onClick(View v) { GBApplication.deviceService().onScreenshotReq(); } } + ); //set alarms ImageView setAlarmsView = (ImageView) view.findViewById(R.id.device_action_set_alarms); setAlarmsView.setVisibility(coordinator.supportsAlarmConfiguration() ? View.VISIBLE : View.GONE); - setAlarmsView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent startIntent; - startIntent = new Intent(context, ConfigureAlarms.class); - context.startActivity(startIntent); - } - } + setAlarmsView.setOnClickListener(new View.OnClickListener() + + { + @Override + public void onClick(View v) { + Intent startIntent; + startIntent = new Intent(context, ConfigureAlarms.class); + context.startActivity(startIntent); + } + } + ); //show graphs ImageView showActivityGraphs = (ImageView) view.findViewById(R.id.device_action_show_activity_graphs); showActivityGraphs.setVisibility(coordinator.supportsActivityTracking() ? View.VISIBLE : View.GONE); - showActivityGraphs.setOnClickListener(new View.OnClickListener() { + showActivityGraphs.setOnClickListener(new View.OnClickListener() + + { @Override public void onClick(View v) { Intent startIntent; startIntent = new Intent(context, ChartsActivity.class); startIntent.putExtra(GBDevice.EXTRA_DEVICE, device); - context.startActivity(startIntent); } + context.startActivity(startIntent); + } } + ); //Info icon is last in the row ImageView deviceInfoView = (ImageView) view.findViewById(R.id.device_info_image); final RelativeLayout deviceInfoBox = (RelativeLayout) view.findViewById(R.id.device_item_infos_box); - final ListView deviceInfoList = (ListView) view.findViewById(R.id.device_item_infos); - //TODO: can we spare all these additional layouts? find out more. + ListView deviceInfoList = (ListView) view.findViewById(R.id.device_item_infos); ItemWithDetailsAdapter infoAdapter = new ItemWithDetailsAdapter(context, device.getDeviceInfos()); infoAdapter.setHorizontalAlignment(true); deviceInfoList.setAdapter(infoAdapter); + justifyListViewHeightBasedOnChildren(deviceInfoList); + deviceInfoList.setFocusable(false); + boolean showInfoIcon = device.hasDeviceInfos() && !device.isBusy(); deviceInfoView.setVisibility(showInfoIcon ? View.VISIBLE : View.GONE); deviceInfoView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (deviceInfoBox.getVisibility() == View.VISIBLE) { - deviceInfoBox.setVisibility(View.GONE); - } else { - ArrayAdapter adapter = (ArrayAdapter) deviceInfoList.getAdapter(); - adapter.clear(); - List infos = device.getDeviceInfos(); - Collections.sort(infos); - adapter.addAll(infos); - justifyListViewHeightBasedOnChildren(deviceInfoList); - deviceInfoBox.setVisibility(View.VISIBLE); - deviceInfoBox.setFocusable(false); - } - } - }); + @Override + public void onClick(View v) { + if (deviceInfoBox.getVisibility() == View.VISIBLE) { + deviceInfoBox.setVisibility(View.GONE); + } else { + deviceInfoBox.setVisibility(View.VISIBLE); + } + } + } + + ); //remove device, hidden under details ImageView removeDevice = (ImageView) view.findViewById(R.id.device_action_remove); - removeDevice.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - //TODO: the logic is bolted to controlcenter, but I don't think it belongs here - } - } + removeDevice.setOnClickListener(new View.OnClickListener() + + { + @Override + public void onClick(View v) { + //TODO: the logic is bolted to controlcenter, but I don't think it belongs here + } + } + ); - switch (device.getType()) { + switch (device.getType()) + + { case PEBBLE: if (device.isConnected()) { deviceImageView.setImageResource(R.drawable.ic_device_pebble); diff --git a/app/src/main/res/drawable/ic_battery_20.xml b/app/src/main/res/drawable/ic_battery_20.xml new file mode 100644 index 000000000..d9a1e6468 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_20.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_50.xml b/app/src/main/res/drawable/ic_battery_50.xml new file mode 100644 index 000000000..8236b239c --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_50.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_80.xml b/app/src/main/res/drawable/ic_battery_80.xml new file mode 100644 index 000000000..600ad7784 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_80.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_charging_20.xml b/app/src/main/res/drawable/ic_battery_charging_20.xml new file mode 100644 index 000000000..c3bf3b703 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_charging_20.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_charging_50.xml b/app/src/main/res/drawable/ic_battery_charging_50.xml new file mode 100644 index 000000000..d794783a5 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_charging_50.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_charging_80.xml b/app/src/main/res/drawable/ic_battery_charging_80.xml new file mode 100644 index 000000000..e004a0a61 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_charging_80.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_battery_charging_full.xml b/app/src/main/res/drawable/ic_battery_charging_full.xml new file mode 100644 index 000000000..9389e7ce2 --- /dev/null +++ b/app/src/main/res/drawable/ic_battery_charging_full.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_battery.xml b/app/src/main/res/drawable/ic_battery_full.xml similarity index 100% rename from app/src/main/res/drawable/ic_battery.xml rename to app/src/main/res/drawable/ic_battery_full.xml diff --git a/app/src/main/res/drawable/ic_more_vert.xml b/app/src/main/res/drawable/ic_more_vert.xml new file mode 100644 index 000000000..5176d8a4b --- /dev/null +++ b/app/src/main/res/drawable/ic_more_vert.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/level_list_battery.xml b/app/src/main/res/drawable/level_list_battery.xml new file mode 100644 index 000000000..0a2d643d1 --- /dev/null +++ b/app/src/main/res/drawable/level_list_battery.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_controlcenterv2_content_main.xml b/app/src/main/res/layout/activity_controlcenterv2_content_main.xml index ea7abee29..f95b30dc7 100644 --- a/app/src/main/res/layout/activity_controlcenterv2_content_main.xml +++ b/app/src/main/res/layout/activity_controlcenterv2_content_main.xml @@ -5,10 +5,6 @@ android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingBottom="@dimen/activity_vertical_margin" - android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" - android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="nodomain.freeyourgadget.gadgetbridge.activities.ControlCenterv2" tools:showIn="@layout/activity_controlcenterv2_app_bar_main"> diff --git a/app/src/main/res/layout/device_itemv2.xml b/app/src/main/res/layout/device_itemv2.xml index 07a610afa..bd6fbd5b9 100644 --- a/app/src/main/res/layout/device_itemv2.xml +++ b/app/src/main/res/layout/device_itemv2.xml @@ -24,8 +24,10 @@ android:id="@+id/device_image" android:layout_width="48dp" android:layout_height="48dp" - android:layout_gravity="left|top" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" android:contentDescription="@string/candidate_item_device_image" + android:longClickable="true" tools:src="@drawable/ic_device_pebble" /> + android:tint="?android:attr/textColor" + card_view:srcCompat="@drawable/level_list_battery" /> + tools:text="100%" /> @@ -95,6 +99,7 @@ android:layout_height="36dp" android:clickable="true" android:contentDescription="@string/controlcenter_fetch_activity_data" + android:tint="?android:attr/textColor" card_view:srcCompat="@drawable/ic_action_fetch_activity_data" /> + android:tint="?android:attr/textColor" + android:src="@drawable/ic_more_vert" /> - + android:focusable="false" + android:layout_alignParentLeft="true" + android:layout_toStartOf="@+id/device_action_remove" + android:scrollbars="none" /> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0924ffa5c..f864ebbe6 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,6 +2,7 @@