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());
+    }
 }