Snap for 5698743 from e24a947615b28cc3e81170ccd90f2c24688df96e to qt-release

Change-Id: I61f9e6b623d62d7b641f4e82fbe930e81848d0bc
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4fc82cb..71648e8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -486,9 +486,7 @@
             </intent-filter>
         </receiver>
         <service
-            android:name=".service.EmailBroadcastProcessorService"
-            android:permission="android.permission.BIND_JOB_SERVICE"
-            android:exported="true" />
+            android:name=".service.EmailBroadcastProcessorService" />
 
         <!-- Support for DeviceAdmin / DevicePolicyManager.  See SecurityPolicy class for impl. -->
         <receiver
@@ -508,7 +506,6 @@
         <service
             android:name=".service.AttachmentService"
             android:enabled="false"
-            android:permission="android.permission.BIND_JOB_SERVICE"
             >
         </service>
 
@@ -728,7 +725,6 @@
         </service>
 
         <service android:name="com.android.email.EmailIntentService"
-                 android:permission="android.permission.BIND_JOB_SERVICE"
                  android:exported="false">
             <intent-filter>
                 <action android:name="com.android.mail.action.RESEND_NOTIFICATIONS" />
diff --git a/provider_src/com/android/email/EmailIntentService.java b/provider_src/com/android/email/EmailIntentService.java
index 5924c90..0c6d761 100644
--- a/provider_src/com/android/email/EmailIntentService.java
+++ b/provider_src/com/android/email/EmailIntentService.java
@@ -29,12 +29,12 @@
     private static final String LOG_TAG = LogTag.getLogTag();
 
     public EmailIntentService() {
-        super();
+        super("EmailIntentService");
     }
 
     @Override
-    protected void onHandleWork(final Intent intent) {
-        super.onHandleWork(intent);
+    protected void onHandleIntent(final Intent intent) {
+        super.onHandleIntent(intent);
 
         if (UIProvider.ACTION_UPDATE_NOTIFICATION.equals(intent.getAction())) {
             final NotificationController nc =
diff --git a/provider_src/com/android/email/provider/EmailProvider.java b/provider_src/com/android/email/provider/EmailProvider.java
index 1f0956b..00d608f 100644
--- a/provider_src/com/android/email/provider/EmailProvider.java
+++ b/provider_src/com/android/email/provider/EmailProvider.java
@@ -6357,7 +6357,7 @@
         // Start/stop the various services depending on whether there are any accounts
         // TODO: Make sure that the AttachmentService responds to this request as it
         // expects a particular set of data in the intents that it receives or it ignores.
-        startOrStopService(enabled, context);
+        startOrStopService(enabled, context, new Intent(context, AttachmentService.class));
         final NotificationController controller =
                 NotificationControllerCreatorHolder.getInstance(context);
 
@@ -6367,16 +6367,16 @@
     }
 
     /**
-     * Starts or stops the attachment service as necessary.
-     *
+     * Starts or stops the service as necessary.
      * @param enabled If {@code true}, the service will be started. Otherwise, it will be stopped.
      * @param context The context to manage the service with.
+     * @param intent The intent of the service to be managed.
      */
-    private static void startOrStopService(boolean enabled, Context context) {
+    private static void startOrStopService(boolean enabled, Context context, Intent intent) {
         if (enabled) {
-            AttachmentService.startWithoutSpecificAttachmentChange(context);
+            context.startService(intent);
         } else {
-            AttachmentService.stop(context);
+            context.stopService(intent);
         }
     }
 
diff --git a/provider_src/com/android/email/service/AttachmentService.java b/provider_src/com/android/email/service/AttachmentService.java
index 50ee429..6321049 100644
--- a/provider_src/com/android/email/service/AttachmentService.java
+++ b/provider_src/com/android/email/service/AttachmentService.java
@@ -27,20 +27,15 @@
 import android.database.Cursor;
 import android.net.ConnectivityManager;
 import android.net.Uri;
-import android.os.Build.VERSION_CODES;
 import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.text.format.DateUtils;
 
-import androidx.core.os.BuildCompat;
-
 import com.android.email.AttachmentInfo;
 import com.android.email.EmailConnectivityManager;
-import com.android.email.EmailNotificationController;
 import com.android.email.NotificationControllerCreatorHolder;
 import com.android.email.NotificationController;
-import com.android.email.R;
 import com.android.emailcommon.provider.Account;
 import com.android.emailcommon.provider.EmailContent;
 import com.android.emailcommon.provider.EmailContent.Attachment;
@@ -126,10 +121,6 @@
     // Signify that we are being shut down & destroyed.
     private volatile boolean mStop = false;
 
-    // Indicates whether this service is currently running. Currently, only used for Android O+ to
-    // decide whether to call startForegroundService or startService in start method.
-    private static volatile boolean isRunning = false;
-
     EmailConnectivityManager mConnectivityManager;
 
     // Helper class that keeps track of in progress downloads to make sure that they
@@ -595,35 +586,7 @@
         debugTrace("Calling startService with extras %d & %d", id, flags);
         intent.putExtra(EXTRA_ATTACHMENT_ID, id);
         intent.putExtra(EXTRA_ATTACHMENT_FLAGS, flags);
-        start(context, intent);
-    }
-
-    public static void startWithoutSpecificAttachmentChange(Context context) {
-        LogUtils.d(LOG_TAG, "Going to start AttachmentService without specifying an attachment.");
-
-        Intent intent = new Intent(context, AttachmentService.class);
-        start(context, intent);
-    }
-
-    /**
-     * Starts running attachment service.
-     *
-     * @param intent an intent set to run AttachmentService class
-     */
-    public static void start(Context context, Intent intent) {
-        if (context.getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O &&
-                !isRunning) {
-            LogUtils.i(LOG_TAG, "startForegroundService");
-            context.startForegroundService(intent);
-        } else {
-            LogUtils.i(LOG_TAG, "startService");
-            context.startService(intent);
-        }
-    }
-
-    public static void stop(Context context) {
-        Intent intent = new Intent(context, AttachmentService.class);
-        context.stopService(intent);
+        context.startService(intent);
     }
 
     /**
@@ -659,16 +622,6 @@
      */
     @Override
     public void onCreate() {
-        isRunning = true;
-        if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
-            LogUtils.i(LOG_TAG, "startForeground");
-            startForeground(
-                    EmailNotificationController.NOTIFICATION_ID_ONGOING_ATTACHMENT,
-                    EmailNotificationController.getOngoingDownloadNotification(
-                            getApplicationContext(),
-                            getApplicationContext().getString(
-                                    R.string.notification_downloading_attachments_title)));
-        }
         // Start up our service thread.
         new Thread(this, "AttachmentService").start();
     }
@@ -696,7 +649,6 @@
             mConnectivityManager.stopWait();
             mConnectivityManager = null;
         }
-        isRunning = false;
     }
 
     /**
diff --git a/provider_src/com/android/email/service/EmailBroadcastProcessorService.java b/provider_src/com/android/email/service/EmailBroadcastProcessorService.java
index 5d264f0..7aa5467 100644
--- a/provider_src/com/android/email/service/EmailBroadcastProcessorService.java
+++ b/provider_src/com/android/email/service/EmailBroadcastProcessorService.java
@@ -17,6 +17,7 @@
 package com.android.email.service;
 
 import android.accounts.AccountManager;
+import android.app.IntentService;
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.ContentUris;
@@ -33,8 +34,6 @@
 import android.text.TextUtils;
 import android.text.format.DateUtils;
 
-import androidx.core.app.JobIntentService;
-
 import com.android.email.EmailIntentService;
 import com.android.email.Preferences;
 import com.android.email.R;
@@ -70,9 +69,7 @@
  * This also handles the DeviceAdminReceiver in SecurityPolicy, because it is also
  * a BroadcastReceiver and requires the same processing semantics.
  */
-public class EmailBroadcastProcessorService extends JobIntentService {
-    public static final int JOB_ID = 200;
-
+public class EmailBroadcastProcessorService extends IntentService {
     // Action used for BroadcastReceiver entry point
     private static final String ACTION_BROADCAST = "broadcast_receiver";
 
@@ -84,11 +81,11 @@
     private static final String ACTION_UPGRADE_BROADCAST = "upgrade_broadcast_receiver";
 
     public EmailBroadcastProcessorService() {
-        super();
-    }
+        // Class name will be the thread name.
+        super(EmailBroadcastProcessorService.class.getName());
 
-    public static void enqueueWork(Context context, Intent work) {
-        enqueueWork(context, EmailBroadcastProcessorService.class, JOB_ID, work);
+        // Intent should be redelivered if the process gets killed before completing the job.
+        setIntentRedelivery(true);
     }
 
     /**
@@ -98,13 +95,13 @@
         Intent i = new Intent(context, EmailBroadcastProcessorService.class);
         i.setAction(ACTION_BROADCAST);
         i.putExtra(Intent.EXTRA_INTENT, broadcastIntent);
-        EmailBroadcastProcessorService.enqueueWork(context, i);
+        context.startService(i);
     }
 
     public static void processUpgradeBroadcastIntent(final Context context) {
         final Intent i = new Intent(context, EmailBroadcastProcessorService.class);
         i.setAction(ACTION_UPGRADE_BROADCAST);
-        EmailBroadcastProcessorService.enqueueWork(context, i);
+        context.startService(i);
     }
 
     /**
@@ -116,11 +113,11 @@
         Intent i = new Intent(context, EmailBroadcastProcessorService.class);
         i.setAction(ACTION_DEVICE_POLICY_ADMIN);
         i.putExtra(EXTRA_DEVICE_POLICY_ADMIN, message);
-        EmailBroadcastProcessorService.enqueueWork(context, i);
+        context.startService(i);
     }
 
     @Override
-    protected void onHandleWork(Intent intent) {
+    protected void onHandleIntent(Intent intent) {
         // This method is called on a worker thread.
 
         // Dispatch from entry point
diff --git a/res/values/strings.xml b/res/values/strings.xml
index dd1d5c1..2f39425 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -110,9 +110,6 @@
     <!-- Notification title when a forwarded attachment couldn't be sent [CHAR LIMIT=30]-->
     <string name="forward_download_failed_title">Attachment not forwarded</string>
 
-    <!-- Notification title when an attachment is being downloaded on Android O and later [CHAR LIMIT=30] -->
-    <string name="notification_downloading_attachments_title">Syncing mail&#8230;</string>
-
     <!-- Notification ticker when email account authentication fails [CHAR LIMIT=none] -->
     <string name="login_failed_ticker">
         <xliff:g id="account_name">%s</xliff:g> signin unsuccessful.</string>
diff --git a/src/com/android/email/EmailNotificationController.java b/src/com/android/email/EmailNotificationController.java
index c9254ad..6773f1b 100644
--- a/src/com/android/email/EmailNotificationController.java
+++ b/src/com/android/email/EmailNotificationController.java
@@ -68,10 +68,6 @@
     private static final int NOTIFICATION_ID_ATTACHMENT_WARNING = 3;
     private static final int NOTIFICATION_ID_PASSWORD_EXPIRING = 4;
     private static final int NOTIFICATION_ID_PASSWORD_EXPIRED = 5;
-    private static final int NOTIFICATION_ID_PERMISSIONS_NEEDED = 6;
-    public static final int NOTIFICATION_ID_ONGOING_ATTACHMENT = 7;
-
-    public static final String NOTIFICATION_CHANNEL_ID_ATTACHMENTS = "^nc_~_z_attachments";
 
     private static final int NOTIFICATION_ID_BASE_MASK = 0xF0000000;
     private static final int NOTIFICATION_ID_BASE_LOGIN_WARNING = 0x20000000;
@@ -405,31 +401,6 @@
     }
 
     /**
-     * Creates a notification to be used with {@link com.android.email.service.AttachmentService},
-     * which should be launched as a foreground service on Android O+.
-     *
-     * <p>The notification is sent with the lowest priority and contains an indefinite loading bar,
-     * hence "ongoing".
-     *
-     * @param title The text that will be displayed on the ongoing notification.
-     */
-    public static Notification getOngoingDownloadNotification(Context context, String title) {
-        NotificationCompat.Builder builder =
-                new NotificationCompat.Builder(context)
-                        .setContentTitle(title)
-                        .setVisibility(Notification.VISIBILITY_SECRET)
-                        .setProgress(0, 0, true)
-                        .setSmallIcon(R.drawable.ic_notification_mail_24dp)
-                        .setOngoing(true);
-
-        if (context.getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.O) {
-            builder.setChannelId(NOTIFICATION_CHANNEL_ID_ATTACHMENTS);
-        }
-
-        return builder.build();
-    }
-
-    /**
      * Returns a notification ID for login failed notifications for the given account account.
      */
     private static int getLoginFailedNotificationId(long accountId) {
diff --git a/src/com/android/email/activity/ComposeActivityEmailExternal.java b/src/com/android/email/activity/ComposeActivityEmailExternal.java
index a5cbe9d..a94313a 100644
--- a/src/com/android/email/activity/ComposeActivityEmailExternal.java
+++ b/src/com/android/email/activity/ComposeActivityEmailExternal.java
@@ -49,6 +49,9 @@
     Intent sanitizedIntent = getIntent();
     if (sanitizedIntent != null) {
       Bundle originalExtras = sanitizedIntent.getExtras();
+       if (originalExtras == null) {
+        originalExtras = new Bundle();
+      }
       sanitizedIntent.replaceExtras(new Bundle());
       copyStringExtraIfExists(ComposeActivity.EXTRA_SUBJECT, originalExtras, sanitizedIntent);
       copyStringExtraIfExists(ComposeActivity.EXTRA_TO, originalExtras, sanitizedIntent);