1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-07-23 15:22:12 +02:00

Remove activity transfer toast, add title to the transfer notification

Also create a separate channel that allows "muting" transfer notifications
on android oreo and above.
This commit is contained in:
Daniele Gobbetti 2018-06-19 22:03:49 +02:00
parent 36aae1e81c
commit f99895da0c
5 changed files with 55 additions and 29 deletions

View File

@ -21,7 +21,6 @@ import android.bluetooth.BluetoothGattCharacteristic;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.support.annotation.CallSuper; import android.support.annotation.CallSuper;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.widget.Toast;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -118,6 +117,7 @@ public abstract class AbstractFetchOperation extends AbstractMiBand2Operation {
@CallSuper @CallSuper
protected void handleActivityFetchFinish(boolean success) { protected void handleActivityFetchFinish(boolean success) {
GB.updateTransferNotification(null,"",false,100,getContext());
operationFinished(); operationFinished();
unsetBusy(); unsetBusy();
} }
@ -148,8 +148,9 @@ public abstract class AbstractFetchOperation extends AbstractMiBand2Operation {
Calendar startTimestamp = getSupport().fromTimeBytes(Arrays.copyOfRange(value, 7, value.length)); Calendar startTimestamp = getSupport().fromTimeBytes(Arrays.copyOfRange(value, 7, value.length));
setStartTimestamp(startTimestamp); setStartTimestamp(startTimestamp);
GB.toast(getContext().getString(R.string.FetchActivityOperation_about_to_transfer_since, GB.updateTransferNotification(getContext().getString(R.string.busy_task_fetch_activity_data),
DateFormat.getDateTimeInstance().format(startTimestamp.getTime())), Toast.LENGTH_LONG, GB.INFO); getContext().getString(R.string.FetchActivityOperation_about_to_transfer_since,
DateFormat.getDateTimeInstance().format(startTimestamp.getTime())), true, 0, getContext());;
} else { } else {
LOG.warn("Unexpected activity metadata: " + Logging.formatBytes(value)); LOG.warn("Unexpected activity metadata: " + Logging.formatBytes(value));
handleActivityFetchFinish(false); handleActivityFetchFinish(false);

View File

@ -236,12 +236,12 @@ public class FetchActivityOperation extends AbstractMiBand1Operation {
// avoid too many notifications overloading the system // avoid too many notifications overloading the system
if (progress - activityStruct.lastNotifiedProgress >= 8) { if (progress - activityStruct.lastNotifiedProgress >= 8) {
activityStruct.lastNotifiedProgress = progress; activityStruct.lastNotifiedProgress = progress;
GB.updateTransferNotification(getContext().getString(R.string.busy_task_fetch_activity_data), true, progress, getContext()); GB.updateTransferNotification(null, getContext().getString(R.string.busy_task_fetch_activity_data), true, progress, getContext());
} }
if (activityStruct.isBlockFinished()) { if (activityStruct.isBlockFinished()) {
sendAckDataTransfer(activityStruct.activityDataTimestampToAck, activityStruct.activityDataUntilNextHeader); sendAckDataTransfer(activityStruct.activityDataTimestampToAck, activityStruct.activityDataUntilNextHeader);
GB.updateTransferNotification("", false, 100, getContext()); GB.updateTransferNotification(null, "", false, 100, getContext());
} }
} }
@ -271,9 +271,10 @@ public class FetchActivityOperation extends AbstractMiBand1Operation {
// as we just did // as we just did
if (activityStruct.isFirstChunk() && dataUntilNextHeader != 0) { if (activityStruct.isFirstChunk() && dataUntilNextHeader != 0) {
GB.toast(getContext().getString(R.string.user_feedback_miband_activity_data_transfer,
GB.updateTransferNotification(getContext().getString(R.string.busy_task_fetch_activity_data), getContext().getString(R.string.user_feedback_miband_activity_data_transfer,
DateTimeUtils.formatDurationHoursMinutes((totalDataToRead / getBytesPerMinuteOfActivityData()), TimeUnit.MINUTES), DateTimeUtils.formatDurationHoursMinutes((totalDataToRead / getBytesPerMinuteOfActivityData()), TimeUnit.MINUTES),
DateFormat.getDateTimeInstance().format(timestamp.getTime())), Toast.LENGTH_LONG, GB.INFO); DateFormat.getDateTimeInstance().format(timestamp.getTime())), true, 0, getContext());
} }
LOG.info("total data to read: " + totalDataToRead + " len: " + (totalDataToRead / getBytesPerMinuteOfActivityData()) + " minute(s)"); LOG.info("total data to read: " + totalDataToRead + " len: " + (totalDataToRead / getBytesPerMinuteOfActivityData()) + " minute(s)");
LOG.info("data to read until next header: " + dataUntilNextHeader + " len: " + (dataUntilNextHeader / getBytesPerMinuteOfActivityData()) + " minute(s)"); LOG.info("data to read until next header: " + dataUntilNextHeader + " len: " + (dataUntilNextHeader / getBytesPerMinuteOfActivityData()) + " minute(s)");
@ -326,7 +327,7 @@ public class FetchActivityOperation extends AbstractMiBand1Operation {
TransactionBuilder builder = performInitialized("send stop sync data"); TransactionBuilder builder = performInitialized("send stop sync data");
builder.write(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT), new byte[]{MiBandService.COMMAND_STOP_SYNC_DATA}); builder.write(getCharacteristic(MiBandService.UUID_CHARACTERISTIC_CONTROL_POINT), new byte[]{MiBandService.COMMAND_STOP_SYNC_DATA});
builder.queue(getQueue()); builder.queue(getQueue());
GB.updateTransferNotification("Data transfer failed", false, 0, getContext()); GB.updateTransferNotification(null,"Data transfer failed", false, 0, getContext());
handleActivityFetchFinish(); handleActivityFetchFinish();
} catch (IOException e) { } catch (IOException e) {

View File

@ -582,7 +582,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
LOG.info("CRC received: " + (data[2] & 0xff) + ", calculated: " + (crc & 0xff)); LOG.info("CRC received: " + (data[2] & 0xff) + ", calculated: " + (crc & 0xff));
if (data[2] != crc) { if (data[2] != crc) {
GB.toast(getContext(), "Incorrect CRC. Try fetching data again.", Toast.LENGTH_LONG, GB.ERROR); GB.toast(getContext(), "Incorrect CRC. Try fetching data again.", Toast.LENGTH_LONG, GB.ERROR);
GB.updateTransferNotification("Data transfer failed", false, 0, getContext()); GB.updateTransferNotification(null,"Data transfer failed", false, 0, getContext());
if (getDevice().isBusy()) { if (getDevice().isBusy()) {
getDevice().unsetBusyTask(); getDevice().unsetBusyTask();
getDevice().sendDeviceUpdateIntent(getContext()); getDevice().sendDeviceUpdateIntent(getContext());
@ -612,7 +612,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
} else if (data[0] == No1F1Constants.CMD_FETCH_SLEEP) { } else if (data[0] == No1F1Constants.CMD_FETCH_SLEEP) {
sendFetchCommand(No1F1Constants.CMD_FETCH_HEARTRATE); sendFetchCommand(No1F1Constants.CMD_FETCH_HEARTRATE);
} else { } else {
GB.updateTransferNotification("", false, 100, getContext()); GB.updateTransferNotification(null,"", false, 100, getContext());
if (getDevice().isBusy()) { if (getDevice().isBusy()) {
getDevice().unsetBusyTask(); getDevice().unsetBusyTask();
getDevice().sendDeviceUpdateIntent(getContext()); getDevice().sendDeviceUpdateIntent(getContext());
@ -620,7 +620,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
} }
} catch (Exception ex) { } catch (Exception ex) {
GB.toast(getContext(), "Error saving activity data: " + ex.getLocalizedMessage(), Toast.LENGTH_LONG, GB.ERROR); GB.toast(getContext(), "Error saving activity data: " + ex.getLocalizedMessage(), Toast.LENGTH_LONG, GB.ERROR);
GB.updateTransferNotification("Data transfer failed", false, 0, getContext()); GB.updateTransferNotification(null,"Data transfer failed", false, 0, getContext());
} }
} }
} else { } else {
@ -657,7 +657,7 @@ public class No1F1Support extends AbstractBTLEDeviceSupport {
firstTimestamp = sample.getTimestamp(); firstTimestamp = sample.getTimestamp();
int progress = startProgress + 33 * (sample.getTimestamp() - firstTimestamp) / int progress = startProgress + 33 * (sample.getTimestamp() - firstTimestamp) /
((int) (Calendar.getInstance().getTimeInMillis() / 1000L) - firstTimestamp); ((int) (Calendar.getInstance().getTimeInMillis() / 1000L) - firstTimestamp);
GB.updateTransferNotification(getContext().getString(R.string.busy_task_fetch_activity_data), true, progress, getContext()); GB.updateTransferNotification(null, getContext().getString(R.string.busy_task_fetch_activity_data), true, progress, getContext());
} }
} }

View File

@ -3,6 +3,10 @@ package nodomain.freeyourgadget.gadgetbridge.service.receivers;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List; import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.GBApplication;
@ -13,14 +17,17 @@ import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper;
public class GBAutoFetchReceiver extends BroadcastReceiver { public class GBAutoFetchReceiver extends BroadcastReceiver {
private static final Logger LOG = LoggerFactory.getLogger(GBAutoFetchReceiver.class);
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
//LOG.info("User is present!");
GBApplication application = (GBApplication) context; GBApplication application = (GBApplication) context;
List<GBDevice> devices = application.getDeviceManager().getDevices(); List<GBDevice> devices = application.getDeviceManager().getDevices();
for (int i = 0; i < devices.size(); i++) { for (int i = 0; i < devices.size(); i++) {
GBDevice device = devices.get(i); GBDevice device = devices.get(i);
// Will show that the device is not connected even when the device is connected // Will show that the device is not connected even when the device is connected
if (device.isConnected() && device.isInitialized()) { if (device.isInitialized()) {
DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device); DeviceCoordinator coordinator = DeviceHelper.getInstance().getCoordinator(device);
if (coordinator.supportsActivityDataFetching() && !device.isBusy()) { if (coordinator.supportsActivityDataFetching() && !device.isBusy()) {
application.deviceService().onFetchRecordedData(RecordedDataTypes.TYPE_ACTIVITY); application.deviceService().onFetchRecordedData(RecordedDataTypes.TYPE_ACTIVITY);
@ -28,5 +35,5 @@ public class GBAutoFetchReceiver extends BroadcastReceiver {
} }
} }
} }
} }

View File

@ -19,6 +19,8 @@ package nodomain.freeyourgadget.gadgetbridge.util;
import android.app.Activity; import android.app.Activity;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothAdapter;
import android.content.Context; import android.content.Context;
@ -50,9 +52,12 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService; import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService; import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
import static nodomain.freeyourgadget.gadgetbridge.GBApplication.isRunningOreoOrLater;
public class GB { public class GB {
public static final String NOTIFICATION_CHANNEL_ID = "gadgetbridge"; public static final String NOTIFICATION_CHANNEL_ID = "gadgetbridge";
public static final String NOTIFICATION_CHANNEL_ID_TRANSFER = "gadgetbridge transfer";
public static final int NOTIFICATION_ID = 1; public static final int NOTIFICATION_ID = 1;
public static final int NOTIFICATION_ID_INSTALL = 2; public static final int NOTIFICATION_ID_INSTALL = 2;
@ -323,17 +328,29 @@ public class GB {
} }
} }
private static Notification createTransferNotification(String text, boolean ongoing, private static Notification createTransferNotification(String title, String text, boolean ongoing,
int percentage, Context context) { int percentage, Context context) {
Intent notificationIntent = new Intent(context, ControlCenterv2.class); Intent notificationIntent = new Intent(context, ControlCenterv2.class);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if(isRunningOreoOrLater()) {
NotificationChannel channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID_TRANSFER);
if(channel == null) {
channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID_TRANSFER,
context.getString(R.string.notification_channel_name),
NotificationManager.IMPORTANCE_LOW);
notificationManager.createNotificationChannel(channel);
}
}
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,
notificationIntent, 0); notificationIntent, 0);
NotificationCompat.Builder nb = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) NotificationCompat.Builder nb = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID_TRANSFER)
.setTicker((title == null) ? context.getString(R.string.app_name) : title)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setContentTitle(context.getString(R.string.app_name)) .setContentTitle((title == null) ? context.getString(R.string.app_name) : title)
.setStyle(new NotificationCompat.BigTextStyle().bigText(text))
.setContentText(text) .setContentText(text)
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
.setOngoing(ongoing); .setOngoing(ongoing);
@ -355,11 +372,11 @@ public class GB {
removeNotification(NOTIFICATION_ID_LOW_BATTERY, context); removeNotification(NOTIFICATION_ID_LOW_BATTERY, context);
} }
public static void updateTransferNotification(String text, boolean ongoing, int percentage, Context context) { public static void updateTransferNotification(String title, String text, boolean ongoing, int percentage, Context context) {
if (percentage == 100) { if (percentage == 100) {
removeNotification(NOTIFICATION_ID_TRANSFER, context); removeNotification(NOTIFICATION_ID_TRANSFER, context);
} else { } else {
Notification notification = createTransferNotification(text, ongoing, percentage, context); Notification notification = createTransferNotification(title, text, ongoing, percentage, context);
updateNotification(notification, NOTIFICATION_ID_TRANSFER, context); updateNotification(notification, NOTIFICATION_ID_TRANSFER, context);
} }
} }