Merge "AOSP/Email - Added WidgetService#isWidgetSupported to check if widgets are supported on the device and avoid calling AppWidgetManager#getInstance if not supported to avoid NullPointerException."
diff --git a/emailcommon/AndroidManifest.xml b/emailcommon/AndroidManifest.xml
index 4659bbb..c1fcdb4 100644
--- a/emailcommon/AndroidManifest.xml
+++ b/emailcommon/AndroidManifest.xml
@@ -2,5 +2,5 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.android.emailcommon"
           android:versionCode="1">
-    <uses-sdk android:targetSdkVersion="19" android:minSdkVersion="14" />
+    <uses-sdk android:targetSdkVersion="21" android:minSdkVersion="14" />
 </manifest>
diff --git a/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java b/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java
index e0db427..492816b 100644
--- a/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java
+++ b/emailcommon/src/com/android/emailcommon/utility/EmailAsyncTask.java
@@ -263,14 +263,17 @@
         return mInnerTask.get();
     }
 
+    @VisibleForTesting
     /* package */ final Result callDoInBackgroundForTest(Params... params) {
         return mInnerTask.doInBackground(params);
     }
 
+    @VisibleForTesting
     /* package */ final void callOnCancelledForTest(Result result) {
         mInnerTask.onCancelled(result);
     }
 
+    @VisibleForTesting
     /* package */ final void callOnPostExecuteForTest(Result result) {
         mInnerTask.onPostExecute(result);
     }
diff --git a/proguard-test.flags b/proguard-test.flags
index 26d7dea..3daa0be 100644
--- a/proguard-test.flags
+++ b/proguard-test.flags
@@ -91,8 +91,12 @@
   *** tempFileExistsForTest();
 }
 
+-keepclasseswithmembers class com.android.emailcommon.utility.EmailAsyncTask {
+  *** callDoInBackgroundForTest(Params...);
+}
 -keepclasseswithmembers class com.android.emailcommon.utility.EmailAsyncTask$Tracker {
   <init>();
   *** getTaskCountForTest();
   *** containsTaskForTest(com.android.emailcommon.utility.EmailAsyncTask);
 }
+-keep class com.android.emailcommon.utility.DelayedOperations
diff --git a/proguard.flags b/proguard.flags
index ce50245..0a9c2f1 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -5,4 +5,4 @@
 }
 
 -keep class com.android.email.activity.setup.AccountSetupFinal
--keep class com.android.email.activity.setup.AccountSettingsFragment
\ No newline at end of file
+-keep class com.android.email.activity.setup.AccountSettingsFragment
diff --git a/provider_src/com/android/email/provider/EmailProvider.java b/provider_src/com/android/email/provider/EmailProvider.java
index 4bd9d4d..00d608f 100644
--- a/provider_src/com/android/email/provider/EmailProvider.java
+++ b/provider_src/com/android/email/provider/EmailProvider.java
@@ -129,6 +129,7 @@
 import com.android.mail.utils.MimeType;
 import com.android.mail.utils.Utils;
 import com.android.mail.widget.BaseWidgetProvider;
+import com.android.mail.widget.WidgetService;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
@@ -6139,6 +6140,9 @@
         Context context = getContext();
         // Lazily initialize these
         if (mAppWidgetManager == null) {
+            if (!WidgetService.isWidgetSupported(context)) {
+                return;
+            }
             mAppWidgetManager = AppWidgetManager.getInstance(context);
             mEmailComponent = new ComponentName(context, WidgetProvider.getProviderName(context));
         }
diff --git a/tests/src/com/android/email/ThrottleTest.java b/tests/src/com/android/email/ThrottleTest.java
index 49adea7..e31c513 100644
--- a/tests/src/com/android/email/ThrottleTest.java
+++ b/tests/src/com/android/email/ThrottleTest.java
@@ -17,6 +17,7 @@
 package com.android.email;
 
 import android.os.Handler;
+import android.os.Looper;
 import android.os.Message;
 import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -37,7 +38,8 @@
     private final CountingRunnable mRunnable = new CountingRunnable();
     private final MockClock mClock = new MockClock();
     private final MockTimer mTimer = new MockTimer(mClock);
-    private final Throttle mTarget = new Throttle("test", mRunnable, new CallItNowHandler(),
+    private final Throttle mTarget = new Throttle("test", mRunnable,
+            new CallItNowHandler(Looper.getMainLooper()),
             MIN_TIMEOUT, MAX_TIMEOUT, mClock, mTimer);
 
     /**
@@ -155,9 +157,13 @@
 
     /**
      * Dummy {@link Handler} that executes {@link Runnable}s passed to {@link Handler#post}
-     * immediately on the current thread.
+     * immediately via the provided {@link Looper}.
      */
     private static class CallItNowHandler extends Handler {
+        public CallItNowHandler(Looper looper) {
+            super(looper);
+        }
+
         @Override
         public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
             msg.getCallback().run();