make error notification dismissable. fixes #1815
This commit is contained in:
parent
5ac0e9267d
commit
082c06a486
|
@ -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,
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue