Bug 1407046 - Migrate FxAccountDeletedService to JobIntentService. r=jchen
authorPetru Lingurar <petru.lingurar@softvision.ro>
Tue, 26 Jun 2018 17:38:30 +0300
changeset 818914 b2b84b2e18b564e3ab96108c4b05bfbc15224667
parent 818913 162d4eb92cdb6ba843b127a034f2f9df4d203a83
child 818915 2c81eca0956444351b8e787820e0b2ccb11f12cb
push id116388
push userrwood@mozilla.com
push dateMon, 16 Jul 2018 19:48:57 +0000
reviewersjchen
bugs1407046
milestone63.0a1
Bug 1407046 - Migrate FxAccountDeletedService to JobIntentService. r=jchen MozReview-Commit-ID: 5ksrTc1Stre
mobile/android/base/java/org/mozilla/gecko/JobIdsConstants.java
mobile/android/services/manifests/FxAccountAndroidManifest_services.xml.in
mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/AndroidFxAccount.java
mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/FxAccountAuthenticator.java
mobile/android/services/src/main/java/org/mozilla/gecko/fxa/receivers/FxAccountDeletedService.java
--- a/mobile/android/base/java/org/mozilla/gecko/JobIdsConstants.java
+++ b/mobile/android/base/java/org/mozilla/gecko/JobIdsConstants.java
@@ -25,16 +25,17 @@ public class JobIdsConstants {
     private static final int JOB_ID_DLC_STUDY = 1000;
     private static final int JOB_ID_DLC_DOWNLOAD = 1001;
     private static final int JOB_ID_DLC_SYNCHRONIZE = 1002;
     private static final int JOB_ID_DLC_CLEANUP = 1003;
 
     private static final int JOB_ID_TAB_RECEIVED = 1004;
 
     private static final int JOB_ID_PROFILE_FETCH = 1005;
+    private static final int JOB_ID_PROFILE_DELETE = 1006;
 
     public static int getIdForDlcStudyJob() {
         return getIdWithOffset(JOB_ID_DLC_STUDY);
     }
 
     public static int getIdForDlcDownloadJob() {
         return getIdWithOffset(JOB_ID_DLC_DOWNLOAD);
     }
@@ -50,16 +51,20 @@ public class JobIdsConstants {
     public static int getIdForTabReceivedJob() {
         return getIdWithOffset(JOB_ID_TAB_RECEIVED);
     }
 
     public static int getIdForProfileFetchJob() {
         return getIdWithOffset(JOB_ID_PROFILE_FETCH);
     }
 
+    public static int getIdForProfileDeleteJob() {
+        return getIdWithOffset(JOB_ID_PROFILE_DELETE);
+    }
+
     private static boolean isReleaseBuild() {
         return AppConstants.RELEASE_OR_BETA;
     }
 
     private static int getIdWithOffset(final int jobIdUsedInRelease) {
         return isReleaseBuild() ? jobIdUsedInRelease : jobIdUsedInRelease + BETA_OFFSET;
     }
 }
--- a/mobile/android/services/manifests/FxAccountAndroidManifest_services.xml.in
+++ b/mobile/android/services/manifests/FxAccountAndroidManifest_services.xml.in
@@ -7,17 +7,18 @@
 
             <meta-data
                 android:name="android.accounts.AccountAuthenticator"
                 android:resource="@xml/fxaccount_authenticator" />
         </service>
 
         <service
             android:exported="false"
-            android:name="org.mozilla.gecko.fxa.receivers.FxAccountDeletedService" >
+            android:name="org.mozilla.gecko.fxa.receivers.FxAccountDeletedService"
+            android:permission="android.permission.BIND_JOB_SERVICE" >
         </service>
 
         <service
             android:exported="false"
             android:name="org.mozilla.gecko.fxa.sync.FxAccountProfileService"
             android:permission="android.permission.BIND_JOB_SERVICE" >
         </service>
 
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/AndroidFxAccount.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/AndroidFxAccount.java
@@ -811,22 +811,22 @@ public class AndroidFxAccount {
    *
    * @return local email address, obfuscated.
    */
   public String getObfuscatedEmail() {
     return Utils.obfuscateEmail(account.name);
   }
 
   /**
-   * Populate an intent used for starting FxAccountDeletedService service.
+   * Populate and return an intent used for starting FxAccountDeletedService service.
    *
-   * @param intent Intent to populate with necessary extras
    * @return <code>Intent</code> with a deleted action and account/OAuth information extras
    */
-  /* package-private */ Intent populateDeletedAccountIntent(final Intent intent) {
+  /* package-private */ Intent getIntentToDeleteAccount() {
+    final Intent intent = new Intent();
     final List<String> tokens = new ArrayList<>();
 
     intent.putExtra(FxAccountConstants.ACCOUNT_DELETED_INTENT_VERSION_KEY,
         Long.valueOf(FxAccountConstants.ACCOUNT_DELETED_INTENT_VERSION));
     intent.putExtra(FxAccountConstants.ACCOUNT_DELETED_INTENT_ACCOUNT_KEY, account.name);
     intent.putExtra(FxAccountConstants.ACCOUNT_DELETED_INTENT_ACCOUNT_PROFILE, getProfile());
 
     // Get the tokens from AccountManager. Note: currently, only reading list service supports OAuth. The following logic will
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/FxAccountAuthenticator.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/authenticator/FxAccountAuthenticator.java
@@ -361,22 +361,20 @@ public class FxAccountAuthenticator exte
     final AndroidFxAccount androidFxAccount = new AndroidFxAccount(context, account);
 
     // Deleting the pickle file in a blocking manner will avoid race conditions that might happen when
     // an account is unpickled while an FxAccount is being deleted.
     // Also we have an assumption that this method is always called from a background thread, so we delete
     // the pickle file directly without being afraid from a StrictMode violation.
     ThreadUtils.assertNotOnUiThread();
 
-    final Intent serviceIntent = androidFxAccount.populateDeletedAccountIntent(
-            new Intent(context, FxAccountDeletedService.class)
-    );
+    final Intent deleteProfileIntent = androidFxAccount.getIntentToDeleteAccount();
     Logger.info(LOG_TAG, "Account named " + account.name + " being removed; " +
-        "starting FxAccountDeletedService with action: " + serviceIntent.getAction() + ".");
-    context.startService(serviceIntent);
+        "starting FxAccountDeletedService with action: " + deleteProfileIntent.getAction() + ".");
+    FxAccountDeletedService.enqueueWork(context, deleteProfileIntent);
 
     Logger.info(LOG_TAG, "Firefox account named " + account.name + " being removed; " +
             "deleting saved pickle file '" + FxAccountConstants.ACCOUNT_PICKLE_FILENAME + "'.");
     deletePickle();
 
     return result;
   }
 
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/receivers/FxAccountDeletedService.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/receivers/FxAccountDeletedService.java
@@ -1,31 +1,32 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.fxa.receivers;
 
-import android.app.IntentService;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.JobIntentService;
 import android.text.TextUtils;
 
+import org.mozilla.gecko.JobIdsConstants;
 import org.mozilla.gecko.background.common.log.Logger;
 import org.mozilla.gecko.background.fxa.FxAccountClient20;
 import org.mozilla.gecko.background.fxa.FxAccountClientException;
 import org.mozilla.gecko.background.fxa.oauth.FxAccountAbstractClient;
 import org.mozilla.gecko.background.fxa.oauth.FxAccountAbstractClientException.FxAccountAbstractClientRemoteException;
 import org.mozilla.gecko.background.fxa.oauth.FxAccountOAuthClient10;
 import org.mozilla.gecko.db.BrowserContract;
 import org.mozilla.gecko.fxa.FxAccountConstants;
-import org.mozilla.gecko.fxa.authenticator.AndroidFxAccount;
 import org.mozilla.gecko.fxa.sync.FxAccountNotificationManager;
 import org.mozilla.gecko.fxa.sync.FxAccountSyncAdapter;
 import org.mozilla.gecko.sync.ExtendedJSONObject;
 import org.mozilla.gecko.sync.repositories.android.BrowserContractHelpers;
 import org.mozilla.gecko.sync.repositories.android.ClientsDatabase;
 import org.mozilla.gecko.sync.repositories.android.FennecTabsRepository;
 
 import java.util.concurrent.Executor;
@@ -35,31 +36,25 @@ import java.util.concurrent.Executors;
 /**
  * A background service to clean up after a Firefox Account is deleted.
  * <p>
  * Note that we specifically handle deleting the pickle file using a Service and a
  * BroadcastReceiver, rather than a background thread, to allow channels sharing a Firefox account
  * to delete their respective pickle files (since, if one remains, the account will be restored
  * when that channel is used).
  */
-public class FxAccountDeletedService extends IntentService {
+public class FxAccountDeletedService extends JobIntentService {
   public static final String LOG_TAG = FxAccountDeletedService.class.getSimpleName();
 
-  public FxAccountDeletedService() {
-    super(LOG_TAG);
+  public static void enqueueWork(@NonNull final Context context, @NonNull final Intent workIntent) {
+    enqueueWork(context, FxAccountDeletedService.class, JobIdsConstants.getIdForProfileDeleteJob(), workIntent);
   }
 
   @Override
-  protected void onHandleIntent(final Intent intent) {
-    // Intent can, in theory, be null. Bug 1025937.
-    if (intent == null) {
-      Logger.debug(LOG_TAG, "Short-circuiting on null intent.");
-      return;
-    }
-
+  protected void onHandleWork(@NonNull Intent intent) {
     final Context context = this;
 
     long intentVersion = intent.getLongExtra(
         FxAccountConstants.ACCOUNT_DELETED_INTENT_VERSION_KEY, 0);
     long expectedVersion = FxAccountConstants.ACCOUNT_DELETED_INTENT_VERSION;
     if (intentVersion != expectedVersion) {
       Logger.warn(LOG_TAG, "Intent malformed: version " + intentVersion + " given but " +
           "version " + expectedVersion + "expected. Not cleaning up after deleted Account.");