Auth Notification
Show a notification if a sync fails due to an auth error
Bug: 10930585
Change-Id: I98dea0607cb73d0ce6b1a94b66d34f912172a8d4
diff --git a/res/drawable-hdpi/stat_notify_auth.png b/res/drawable-hdpi/stat_notify_auth.png
new file mode 100644
index 0000000..d40e2fe
--- /dev/null
+++ b/res/drawable-hdpi/stat_notify_auth.png
Binary files differ
diff --git a/res/drawable-xhdpi/stat_notify_auth.png b/res/drawable-xhdpi/stat_notify_auth.png
new file mode 100644
index 0000000..0317760
--- /dev/null
+++ b/res/drawable-xhdpi/stat_notify_auth.png
Binary files differ
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 7146543..974db95 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -198,4 +198,11 @@
<string name="account_manager_type_exchange" translatable="false">com.android.exchange</string>
<string name="authority_email_provider" translatable="false">com.android.email.provider</string>
+
+ <!-- Title for notification warning about an authentication error [CHAR LIMIT=40] -->
+ <string name="auth_error_notification_title">Authentication error</string>
+
+ <!-- text for notification warning about an authentication error [CHAR LIMIT=60] -->
+ <string name="auth_error_notification_text">Tap to change settings for account <xliff:g id="account">%s</xliff:g></string>
+
</resources>
diff --git a/src/com/android/exchange/SettingsRedirector.java b/src/com/android/exchange/SettingsRedirector.java
index bc0d98c..79e31f2 100644
--- a/src/com/android/exchange/SettingsRedirector.java
+++ b/src/com/android/exchange/SettingsRedirector.java
@@ -37,7 +37,8 @@
super.onCreate(savedInstanceState);
Intent redirect = new Intent(
Intent.ACTION_EDIT,
- IntentUtilities.createActivityIntentUrlBuilder("settings").build());
+ IntentUtilities.createActivityIntentUrlBuilder(IntentUtilities.PATH_SETTINGS)
+ .build());
redirect.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(redirect);
finish();
diff --git a/src/com/android/exchange/service/EmailSyncAdapterService.java b/src/com/android/exchange/service/EmailSyncAdapterService.java
index 2a5059b..ccfc75b 100644
--- a/src/com/android/exchange/service/EmailSyncAdapterService.java
+++ b/src/com/android/exchange/service/EmailSyncAdapterService.java
@@ -16,6 +16,10 @@
package com.android.exchange.service;
+import android.app.Notification;
+import android.app.Notification.Builder;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
import android.content.AbstractThreadedSyncAdapter;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
@@ -24,6 +28,7 @@
import android.content.Intent;
import android.content.SyncResult;
import android.database.Cursor;
+import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
@@ -40,8 +45,11 @@
import com.android.emailcommon.service.IEmailServiceCallback;
import com.android.emailcommon.service.SearchParams;
import com.android.emailcommon.service.ServiceProxy;
+import com.android.emailcommon.utility.IntentUtilities;
import com.android.emailcommon.utility.Utility;
import com.android.exchange.Eas;
+import com.android.exchange.R.drawable;
+import com.android.exchange.R.string;
import com.android.exchange.adapter.PingParser;
import com.android.exchange.adapter.Search;
import com.android.exchange.eas.EasFolderSync;
@@ -665,7 +673,44 @@
success = false;
}
updateMailbox(context, mailbox, cv, EmailContent.SYNC_STATUS_NONE);
+
+ if (syncResult.stats.numAuthExceptions > 0) {
+ showAuthNotification(account.mId, account.mEmailAddress);
+ }
return success;
}
}
+ private void showAuthNotification(long accountId, String accountName) {
+ final PendingIntent pendingIntent = PendingIntent.getActivity(
+ this,
+ 0,
+ createAccountSettingsIntent(accountId, accountName),
+ 0);
+
+ final Notification notification = new Builder(this)
+ .setContentTitle(this.getString(string.auth_error_notification_title))
+ .setContentText(this.getString(
+ string.auth_error_notification_text, accountName))
+ .setSmallIcon(drawable.stat_notify_auth)
+ .setContentIntent(pendingIntent)
+ .setAutoCancel(true)
+ .build();
+
+ final NotificationManager nm = (NotificationManager)
+ this.getSystemService(Context.NOTIFICATION_SERVICE);
+ nm.notify("AuthError", 0, notification);
+ }
+
+ /**
+ * Create and return an intent to display (and edit) settings for a specific account, or -1
+ * for any/all accounts. If an account name string is provided, a warning dialog will be
+ * displayed as well.
+ */
+ public static Intent createAccountSettingsIntent(long accountId, String accountName) {
+ final Uri.Builder builder = IntentUtilities.createActivityIntentUrlBuilder(
+ IntentUtilities.PATH_SETTINGS);
+ IntentUtilities.setAccountId(builder, accountId);
+ IntentUtilities.setAccountName(builder, accountName);
+ return new Intent(Intent.ACTION_EDIT, builder.build());
+ }
}