ControlCenterv2: further steps:

Close drawer before launching activities (feels sloow).
Implement device deletion (untested).
Add app-management icon, remove tap-connected-device-for-primary-activity, hidden (not removed) text hint.
Use level-list for device icon.
Use the new control center when tapping GB notifications.
Added icons to the legacy control center context menu, perhaps it can be embedded in the card?
This commit is contained in:
Daniele Gobbetti 2016-10-25 17:49:21 +02:00
parent d93a5be57a
commit d467b37493
8 changed files with 117 additions and 55 deletions

View File

@ -203,6 +203,9 @@ public class ControlCenterv2 extends AppCompatActivity
@Override @Override
public boolean onNavigationItemSelected(MenuItem item) { public boolean onNavigationItemSelected(MenuItem item) {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_settings: case R.id.action_settings:
Intent settingsIntent = new Intent(this, SettingsActivity.class); Intent settingsIntent = new Intent(this, SettingsActivity.class);
@ -221,8 +224,6 @@ public class ControlCenterv2 extends AppCompatActivity
return true; return true;
} }
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true; return true;
} }

View File

@ -1,10 +1,12 @@
package nodomain.freeyourgadget.gadgetbridge.adapter; package nodomain.freeyourgadget.gadgetbridge.adapter;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.transition.TransitionManager; import android.transition.TransitionManager;
import android.view.LayoutInflater; import android.view.LayoutInflater;
@ -17,6 +19,7 @@ import android.widget.ListView;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import java.util.List; import java.util.List;
@ -25,9 +28,11 @@ import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureAlarms; import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureAlarms;
import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity; import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator; import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.BatteryState; import nodomain.freeyourgadget.gadgetbridge.model.BatteryState;
import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
/** /**
* Adapter for displaying GBDevice instances. * Adapter for displaying GBDevice instances.
@ -57,29 +62,23 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter<GBDeviceAdapterv2.Vi
final GBDevice device = deviceList.get(position); final GBDevice device = deviceList.get(position);
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device); DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
holder.deviceImageView.setImageResource(R.drawable.level_list_device);
//level-list does not allow negative values, hence we always add 100 to the key.
holder.deviceImageView.setImageLevel(device.getType().getKey() + 100 + (device.isInitialized() ? 100 : 0));
holder.deviceImageView.setOnClickListener(new View.OnClickListener() { holder.deviceImageView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
if (device.isInitialized()) { //TODO: move somewhere else?
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
Class<? extends Activity> primaryActivity = coordinator.getPrimaryActivity();
if (primaryActivity != null) {
Intent startIntent = new Intent(context, primaryActivity);
startIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
context.startActivity(startIntent);
}
} else {
//TODO: move somewhere else
GBApplication.deviceService().connect(device); GBApplication.deviceService().connect(device);
} }
}
}); });
holder.deviceImageView.setOnLongClickListener(new View.OnLongClickListener() { holder.deviceImageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override @Override
public boolean onLongClick(View v) { public boolean onLongClick(View v) {
//TODO: move somewhere else //TODO: move somewhere else?
GBApplication.deviceService().disconnect(); GBApplication.deviceService().disconnect();
return true; return true;
} }
@ -87,6 +86,7 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter<GBDeviceAdapterv2.Vi
holder.deviceNameLabel.setText(getUniqueDeviceName(device)); holder.deviceNameLabel.setText(getUniqueDeviceName(device));
//TODO: snackbar!
if (device.isBusy()) { if (device.isBusy()) {
holder.deviceStatusLabel.setText(device.getBusyTask()); holder.deviceStatusLabel.setText(device.getBusyTask());
holder.busyIndicator.setVisibility(View.VISIBLE); holder.busyIndicator.setVisibility(View.VISIBLE);
@ -136,6 +136,24 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter<GBDeviceAdapterv2.Vi
} }
); );
//manage apps
holder.manageAppsView.setVisibility((device.isInitialized() && coordinator.supportsAppsManagement()) ? View.VISIBLE : View.GONE);
holder.manageAppsView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v) {
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
Class<? extends Activity> appsManagementActivity = coordinator.getAppsManagementActivity();
if (appsManagementActivity != null) {
Intent startIntent = new Intent(context, appsManagementActivity);
startIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
context.startActivity(startIntent);
}
}
}
);
//set alarms //set alarms
holder.setAlarmsView.setVisibility(coordinator.supportsAlarmConfiguration() ? View.VISIBLE : View.GONE); holder.setAlarmsView.setVisibility(coordinator.supportsAlarmConfiguration() ? View.VISIBLE : View.GONE);
holder.setAlarmsView.setOnClickListener(new View.OnClickListener() holder.setAlarmsView.setOnClickListener(new View.OnClickListener()
@ -218,40 +236,37 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter<GBDeviceAdapterv2.Vi
{ {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
//TODO: the logic is bolted to controlcenter, but I don't think it belongs here new AlertDialog.Builder(context)
.setCancelable(true)
.setTitle(context.getString(R.string.controlcenter_delete_device_name, device.getName()))
.setMessage(R.string.controlcenter_delete_device_dialogmessage)
.setPositiveButton(R.string.Delete, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
if (coordinator != null) {
coordinator.deleteDevice(device);
}
DeviceHelper.getInstance().removeBond(device);
} catch (Exception ex) {
GB.toast(context, "Error deleting device: " + ex.getMessage(), Toast.LENGTH_LONG, GB.ERROR, ex);
} finally {
Intent refreshIntent = new Intent(DeviceManager.ACTION_REFRESH_DEVICELIST);
LocalBroadcastManager.getInstance(context).sendBroadcast(refreshIntent);
}
}
})
.setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// do nothing
}
})
.show();
} }
}); });
switch (device.getType()) {
case PEBBLE:
if (device.isConnected()) {
holder.deviceImageView.setImageResource(R.drawable.ic_device_pebble);
} else {
holder.deviceImageView.setImageResource(R.drawable.ic_device_pebble_disabled);
}
break;
case MIBAND:
case MIBAND2:
if (device.isConnected()) {
holder.deviceImageView.setImageResource(R.drawable.ic_device_miband);
} else {
holder.deviceImageView.setImageResource(R.drawable.ic_device_miband_disabled);
}
break;
case VIBRATISSIMO:
if (device.isConnected()) {
holder.deviceImageView.setImageResource(R.drawable.ic_device_lovetoy);
} else {
holder.deviceImageView.setImageResource(R.drawable.ic_device_lovetoy_disabled);
}
break;
default:
if (device.isConnected()) {
holder.deviceImageView.setImageResource(R.drawable.ic_launcher);
} else {
holder.deviceImageView.setImageResource(R.drawable.ic_device_default_disabled);
}
}
} }
@Override @Override
@ -273,6 +288,7 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter<GBDeviceAdapterv2.Vi
ImageView fetchActivityData; ImageView fetchActivityData;
ProgressBar busyIndicator; ProgressBar busyIndicator;
ImageView takeScreenshotView; ImageView takeScreenshotView;
ImageView manageAppsView;
ImageView setAlarmsView; ImageView setAlarmsView;
ImageView showActivityGraphs; ImageView showActivityGraphs;
@ -297,6 +313,7 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter<GBDeviceAdapterv2.Vi
fetchActivityData = (ImageView) view.findViewById(R.id.device_action_fetch_activity); fetchActivityData = (ImageView) view.findViewById(R.id.device_action_fetch_activity);
busyIndicator = (ProgressBar) view.findViewById(R.id.device_busy_indicator); busyIndicator = (ProgressBar) view.findViewById(R.id.device_busy_indicator);
takeScreenshotView = (ImageView) view.findViewById(R.id.device_action_take_screenshot); takeScreenshotView = (ImageView) view.findViewById(R.id.device_action_take_screenshot);
manageAppsView = (ImageView) view.findViewById(R.id.device_action_manage_apps);
setAlarmsView = (ImageView) view.findViewById(R.id.device_action_set_alarms); setAlarmsView = (ImageView) view.findViewById(R.id.device_action_set_alarms);
showActivityGraphs = (ImageView) view.findViewById(R.id.device_action_show_activity_graphs); showActivityGraphs = (ImageView) view.findViewById(R.id.device_action_show_activity_graphs);
deviceInfoView = (ImageView) view.findViewById(R.id.device_info_image); deviceInfoView = (ImageView) view.findViewById(R.id.device_info_image);

View File

@ -26,7 +26,7 @@ import java.nio.ByteOrder;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.GBEnvironment; import nodomain.freeyourgadget.gadgetbridge.GBEnvironment;
import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenter; import nodomain.freeyourgadget.gadgetbridge.activities.ControlCenterv2;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventScreenshot; import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventScreenshot;
public class GB { public class GB {
@ -49,7 +49,7 @@ public class GB {
if (env().isLocalTest()) { if (env().isLocalTest()) {
return null; return null;
} }
Intent notificationIntent = new Intent(context, ControlCenter.class); Intent notificationIntent = new Intent(context, ControlCenterv2.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK); | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
@ -245,7 +245,7 @@ public class GB {
private static Notification createTransferNotification(String text, boolean ongoing, private static Notification createTransferNotification(String text, boolean ongoing,
int percentage, Context context) { int percentage, Context context) {
Intent notificationIntent = new Intent(context, ControlCenter.class); Intent notificationIntent = new Intent(context, ControlCenterv2.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK); | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
@ -286,7 +286,7 @@ public class GB {
private static Notification createInstallNotification(String text, boolean ongoing, private static Notification createInstallNotification(String text, boolean ongoing,
int percentage, Context context) { int percentage, Context context) {
Intent notificationIntent = new Intent(context, ControlCenter.class); Intent notificationIntent = new Intent(context, ControlCenterv2.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK); | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
@ -316,7 +316,7 @@ public class GB {
} }
private static Notification createBatteryNotification(String text, String bigText, Context context) { private static Notification createBatteryNotification(String text, String bigText, Context context) {
Intent notificationIntent = new Intent(context, ControlCenter.class); Intent notificationIntent = new Intent(context, ControlCenterv2.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK); | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M16,1L4,1c-1.1,0 -2,0.9 -2,2v14h2L4,3h12L16,1zM19,5L8,5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h11c1.1,0 2,-0.9 2,-2L21,7c0,-1.1 -0.9,-2 -2,-2zM19,21L8,21L8,7h11v14z"/>
</vector>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:maxLevel="99" android:drawable="@drawable/ic_device_default_disabled" />
<item android:maxLevel="101" android:drawable="@drawable/ic_device_pebble_disabled" />
<item android:maxLevel="110" android:drawable="@drawable/ic_device_miband_disabled" />
<item android:maxLevel="111" android:drawable="@drawable/ic_device_miband_disabled" />
<item android:maxLevel="120" android:drawable="@drawable/ic_device_lovetoy_disabled" />
<item android:maxLevel="199" android:drawable="@drawable/ic_launcher" />
<item android:maxLevel="201" android:drawable="@drawable/ic_device_pebble" />
<item android:maxLevel="210" android:drawable="@drawable/ic_device_miband" />
<item android:maxLevel="211" android:drawable="@drawable/ic_device_miband" />
<item android:maxLevel="220" android:drawable="@drawable/ic_device_lovetoy" />
</level-list>

View File

@ -23,7 +23,7 @@
<include layout="@layout/activity_controlcenterv2_content_main" /> <include layout="@layout/activity_controlcenterv2_content_main" />
<TextView <!-- <TextView
android:id="@+id/hintTextView" android:id="@+id/hintTextView"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -35,7 +35,7 @@
android:textStyle="italic" android:textStyle="italic"
android:text="@string/tap_connected_device_for_app_mananger" android:text="@string/tap_connected_device_for_app_mananger"
android:elevation="0dp" /> android:elevation="0dp" />
-->
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/fab" android:id="@+id/fab"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@ -129,13 +129,26 @@
card_view:srcCompat="@drawable/ic_screenshot" /> card_view:srcCompat="@drawable/ic_screenshot" />
<ImageView <ImageView
android:id="@+id/device_action_set_alarms" android:id="@+id/device_action_manage_apps"
android:layout_width="36dp" android:layout_width="36dp"
android:layout_height="36dp" android:layout_height="36dp"
android:layout_below="@id/device_image" android:layout_below="@id/device_image"
android:layout_margin="8dp" android:layout_margin="8dp"
android:layout_toRightOf="@id/device_action_take_screenshot" android:layout_toRightOf="@id/device_action_take_screenshot"
android:clickable="true" android:clickable="true"
android:contentDescription="@string/title_activity_appmanager"
android:tint="@color/secondarytext"
android:background="?android:attr/selectableItemBackground"
card_view:srcCompat="@drawable/ic_action_manage_apps" />
<ImageView
android:id="@+id/device_action_set_alarms"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_below="@id/device_image"
android:layout_margin="8dp"
android:layout_toRightOf="@id/device_action_manage_apps"
android:clickable="true"
android:contentDescription="@string/controlcenter_start_configure_alarms" android:contentDescription="@string/controlcenter_start_configure_alarms"
android:tint="@color/secondarytext" android:tint="@color/secondarytext"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"

View File

@ -2,21 +2,29 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item <item
android:id="@+id/controlcenter_fetch_activity_data" android:id="@+id/controlcenter_fetch_activity_data"
android:title="@string/controlcenter_fetch_activity_data"/> android:icon="@drawable/ic_action_fetch_activity_data"
android:title="@string/controlcenter_fetch_activity_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<item <item
android:id="@+id/controlcenter_start_sleepmonitor" android:id="@+id/controlcenter_start_sleepmonitor"
android:icon="@drawable/ic_activity_graphs"
android:title="@string/controlcenter_start_activitymonitor"/> android:title="@string/controlcenter_start_activitymonitor"/>
<item <item
android:id="@+id/controlcenter_configure_alarms" android:id="@+id/controlcenter_configure_alarms"
android:icon="@drawable/ic_device_set_alarms"
android:title="@string/controlcenter_start_configure_alarms"/> android:title="@string/controlcenter_start_configure_alarms"/>
<item <item
android:id="@+id/controlcenter_find_device" android:id="@+id/controlcenter_find_device"
android:icon="@drawable/ic_action_find_lost_device"
android:title="@string/controlcenter_find_device"/> android:title="@string/controlcenter_find_device"/>
<item <item
android:id="@+id/controlcenter_take_screenshot" android:id="@+id/controlcenter_take_screenshot"
android:icon="@drawable/ic_screenshot"
android:title="@string/controlcenter_take_screenshot"/> android:title="@string/controlcenter_take_screenshot"/>
<item <item
android:id="@+id/controlcenter_delete_device" android:id="@+id/controlcenter_delete_device"
android:icon="@drawable/ic_remove_device"
android:title="@string/controlcenter_delete_device"/> android:title="@string/controlcenter_delete_device"/>
<item <item
android:id="@+id/controlcenter_disconnect" android:id="@+id/controlcenter_disconnect"