make error notification dismissable. fixes #1815

This commit is contained in:
Daniel Gultsch 2016-10-04 11:16:59 +02:00
parent 5ac0e9267d
commit 082c06a486
3 changed files with 47 additions and 40 deletions

View File

@ -91,6 +91,17 @@ public class Account extends AbstractEntity {
return pgpDecryptionService != null && pgpDecryptionService.isConnected(); return pgpDecryptionService != null && pgpDecryptionService.isConnected();
} }
public boolean setShowErrorNotification(boolean newValue) {
boolean oldValue = showErrorNotification();
setKey("show_error",Boolean.toString(newValue));
return newValue != oldValue;
}
public boolean showErrorNotification() {
String key = getKey("show_error");
return key == null || Boolean.parseBoolean(key);
}
public enum State { public enum State {
DISABLED, DISABLED,
OFFLINE, OFFLINE,

View File

@ -2,7 +2,6 @@ package eu.siacs.conversations.services;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.Bitmap; import android.graphics.Bitmap;
@ -14,18 +13,13 @@ import android.support.v4.app.NotificationCompat.BigPictureStyle;
import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.app.NotificationCompat.Builder;
import android.support.v4.app.NotificationManagerCompat; import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.RemoteInput; import android.support.v4.app.RemoteInput;
import android.support.v4.app.TaskStackBuilder;
import android.text.Html; import android.text.Html;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Log; import android.util.Log;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -496,11 +490,10 @@ public class NotificationService {
return PendingIntent.getService(mXmppConnectionService, 45, intent, 0); return PendingIntent.getService(mXmppConnectionService, 45, intent, 0);
} }
private PendingIntent createDisableAccountIntent(final Account account) { private PendingIntent createDismissErrorIntent() {
final Intent intent = new Intent(mXmppConnectionService, XmppConnectionService.class); final Intent intent = new Intent(mXmppConnectionService, XmppConnectionService.class);
intent.setAction(XmppConnectionService.ACTION_DISABLE_ACCOUNT); intent.setAction(XmppConnectionService.ACTION_DISMISS_ERROR_NOTIFICATIONS);
intent.putExtra("account", account.getJid().toBareJid().toString()); return PendingIntent.getService(mXmppConnectionService, 69, intent, 0);
return PendingIntent.getService(mXmppConnectionService, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
} }
private boolean wasHighlightedOrPrivate(final Message message) { private boolean wasHighlightedOrPrivate(final Message message) {
@ -594,7 +587,7 @@ public class NotificationService {
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mXmppConnectionService); final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mXmppConnectionService);
final List<Account> errors = new ArrayList<>(); final List<Account> errors = new ArrayList<>();
for (final Account account : mXmppConnectionService.getAccounts()) { for (final Account account : mXmppConnectionService.getAccounts()) {
if (account.hasErrorStatus()) { if (account.hasErrorStatus() && account.showErrorNotification()) {
errors.add(account); errors.add(account);
} }
} }
@ -615,27 +608,17 @@ public class NotificationService {
mBuilder.addAction(R.drawable.ic_autorenew_white_24dp, mBuilder.addAction(R.drawable.ic_autorenew_white_24dp,
mXmppConnectionService.getString(R.string.try_again), mXmppConnectionService.getString(R.string.try_again),
createTryAgainIntent()); createTryAgainIntent());
if (errors.size() == 1) { mBuilder.setDeleteIntent(createDismissErrorIntent());
mBuilder.addAction(R.drawable.ic_block_white_24dp, mBuilder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
mXmppConnectionService.getString(R.string.disable_account),
createDisableAccountIntent(errors.get(0)));
}
mBuilder.setOngoing(true);
//mBuilder.setLights(0xffffffff, 2000, 4000);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mBuilder.setSmallIcon(R.drawable.ic_warning_white_24dp); mBuilder.setSmallIcon(R.drawable.ic_warning_white_24dp);
} else { } else {
mBuilder.setSmallIcon(R.drawable.ic_stat_alert_warning); mBuilder.setSmallIcon(R.drawable.ic_stat_alert_warning);
} }
final TaskStackBuilder stackBuilder = TaskStackBuilder.create(mXmppConnectionService); mBuilder.setContentIntent(PendingIntent.getActivity(mXmppConnectionService,
stackBuilder.addParentStack(ConversationActivity.class); 145,
new Intent(mXmppConnectionService,ManageAccountActivity.class),
final Intent manageAccountsIntent = new Intent(mXmppConnectionService, ManageAccountActivity.class); PendingIntent.FLAG_UPDATE_CURRENT));
stackBuilder.addNextIntent(manageAccountsIntent);
final PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
notificationManager.notify(ERROR_NOTIFICATION_ID, mBuilder.build()); notificationManager.notify(ERROR_NOTIFICATION_ID, mBuilder.build());
} }
} }

View File

@ -132,8 +132,8 @@ public class XmppConnectionService extends Service {
public static final String ACTION_REPLY_TO_CONVERSATION = "reply_to_conversations"; public static final String ACTION_REPLY_TO_CONVERSATION = "reply_to_conversations";
public static final String ACTION_CLEAR_NOTIFICATION = "clear_notification"; public static final String ACTION_CLEAR_NOTIFICATION = "clear_notification";
public static final String ACTION_DISABLE_FOREGROUND = "disable_foreground"; public static final String ACTION_DISABLE_FOREGROUND = "disable_foreground";
public static final String ACTION_DISMISS_ERROR_NOTIFICATIONS = "dismiss_error";
public static final String ACTION_TRY_AGAIN = "try_again"; public static final String ACTION_TRY_AGAIN = "try_again";
public static final String ACTION_DISABLE_ACCOUNT = "disable_account";
public static final String ACTION_IDLE_PING = "idle_ping"; public static final String ACTION_IDLE_PING = "idle_ping";
private static final String ACTION_MERGE_PHONE_CONTACTS = "merge_phone_contacts"; private static final String ACTION_MERGE_PHONE_CONTACTS = "merge_phone_contacts";
public static final String ACTION_GCM_TOKEN_REFRESH = "gcm_token_refresh"; public static final String ACTION_GCM_TOKEN_REFRESH = "gcm_token_refresh";
@ -294,6 +294,9 @@ public class XmppConnectionService extends Service {
mOnAccountUpdate.onAccountUpdate(); mOnAccountUpdate.onAccountUpdate();
} }
if (account.getStatus() == Account.State.ONLINE) { if (account.getStatus() == Account.State.ONLINE) {
if (account.setShowErrorNotification(true)) {
databaseBackend.updateAccount(account);
}
mMessageArchiveService.executePendingQueries(account); mMessageArchiveService.executePendingQueries(account);
if (connection != null && connection.getFeatures().csi()) { if (connection != null && connection.getFeatures().csi()) {
if (checkListeners()) { if (checkListeners()) {
@ -554,22 +557,13 @@ public class XmppConnectionService extends Service {
getPreferences().edit().putBoolean("keep_foreground_service", false).commit(); getPreferences().edit().putBoolean("keep_foreground_service", false).commit();
toggleForegroundService(); toggleForegroundService();
break; break;
case ACTION_DISMISS_ERROR_NOTIFICATIONS:
dismissErrorNotifications();
break;
case ACTION_TRY_AGAIN: case ACTION_TRY_AGAIN:
resetAllAttemptCounts(false); resetAllAttemptCounts(false);
interactive = true; interactive = true;
break; break;
case ACTION_DISABLE_ACCOUNT:
try {
String jid = intent.getStringExtra("account");
Account account = jid == null ? null : findAccountByJid(Jid.fromString(jid));
if (account != null) {
account.setOption(Account.OPTION_DISABLED, true);
updateAccount(account);
}
} catch (final InvalidJidException ignored) {
break;
}
break;
case ACTION_REPLY_TO_CONVERSATION: case ACTION_REPLY_TO_CONVERSATION:
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null && c != null) { if (remoteInput != null && c != null) {
@ -811,6 +805,20 @@ public class XmppConnectionService extends Service {
connection.resetAttemptCount(); connection.resetAttemptCount();
} }
} }
if (account.setShowErrorNotification(true)) {
databaseBackend.updateAccount(account);
}
}
}
private void dismissErrorNotifications() {
for (final Account account : this.accounts) {
if (account.hasErrorStatus()) {
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": dismissing error notification");
if (account.setShowErrorNotification(false)) {
databaseBackend.updateAccount(account);
}
}
} }
} }
@ -1027,6 +1035,10 @@ public class XmppConnectionService extends Service {
private void sendMessage(final Message message, final boolean resend, final boolean delay) { private void sendMessage(final Message message, final boolean resend, final boolean delay) {
final Account account = message.getConversation().getAccount(); final Account account = message.getConversation().getAccount();
if (account.setShowErrorNotification(true)) {
databaseBackend.updateAccount(account);
mNotificationService.updateErrorNotification();
}
final Conversation conversation = message.getConversation(); final Conversation conversation = message.getConversation();
account.deactivateGracePeriod(); account.deactivateGracePeriod();
MessagePacket packet = null; MessagePacket packet = null;
@ -1651,6 +1663,7 @@ public class XmppConnectionService extends Service {
public boolean updateAccount(final Account account) { public boolean updateAccount(final Account account) {
if (databaseBackend.updateAccount(account)) { if (databaseBackend.updateAccount(account)) {
account.setShowErrorNotification(true);
this.statusListener.onStatusChanged(account); this.statusListener.onStatusChanged(account);
databaseBackend.updateAccount(account); databaseBackend.updateAccount(account);
reconnectAccountInBackground(account); reconnectAccountInBackground(account);