Merge "Fixing issue with popup arrow direction in RTL." into ub-launcher3-burnaby
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 03e9bbf..873ca32 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -83,6 +83,7 @@
             android:windowSoftInputMode="adjustPan"
             android:screenOrientation="nosensor"
             android:resumeWhilePausing="true"
+            android:taskAffinity=""
             android:enabled="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java b/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
index d9bfc30..88dc3e2 100644
--- a/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
+++ b/WallpaperPicker/src/com/android/launcher3/WallpaperPickerActivity.java
@@ -16,6 +16,7 @@
 
 package com.android.launcher3;
 
+import android.Manifest.permission;
 import android.animation.LayoutTransition;
 import android.annotation.TargetApi;
 import android.app.ActionBar;
@@ -37,10 +38,12 @@
 import android.graphics.RectF;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
+import android.Manifest;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
+import android.os.Process;
 import android.provider.MediaStore;
 import android.util.Log;
 import android.util.Pair;
@@ -680,6 +683,16 @@
     }
 
     protected Bitmap getThumbnailOfLastPhoto() {
+        boolean canReadExternalStorage = getActivity().checkPermission(
+                Manifest.permission.READ_EXTERNAL_STORAGE, Process.myPid(), Process.myUid()) ==
+                PackageManager.PERMISSION_GRANTED;
+
+        if (!canReadExternalStorage) {
+            // MediaStore.Images.Media.EXTERNAL_CONTENT_URI requires
+            // the READ_EXTERNAL_STORAGE permission
+            return null;
+        }
+
         Cursor cursor = MediaStore.Images.Media.query(getContext().getContentResolver(),
                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                 new String[] { MediaStore.Images.ImageColumns._ID,
diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java
index 399ef97..b8916a7 100644
--- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java
+++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java
@@ -192,9 +192,6 @@
 
     @Thunk final ZoomInInterpolator mZoomInInterpolator = new ZoomInInterpolator();
 
-    // These properties refer to the background protection gradient used for AllApps and Widget tray.
-    @Thunk ValueAnimator mBackgroundFadeOutAnimation;
-
     @Thunk float mSpringLoadedShrinkFactor;
     @Thunk float mOverviewModeShrinkFactor;
     @Thunk float mWorkspaceScrimAlpha;
@@ -548,25 +545,29 @@
      * @param animated whether or not to set the background alpha immediately
      * @duration duration of the animation
      */
-    private void animateBackgroundGradient(TransitionStates states, boolean animated, int duration) {
+    private void animateBackgroundGradient(TransitionStates states,
+            boolean animated, int duration) {
+
         final DragLayer dragLayer = mLauncher.getDragLayer();
         final float startAlpha = dragLayer.getBackgroundAlpha();
         float finalAlpha = states.stateIsNormal ? 0 : mWorkspaceScrimAlpha;
 
         if (finalAlpha != startAlpha) {
             if (animated) {
-                mBackgroundFadeOutAnimation =
+                // These properties refer to the background protection gradient used for AllApps
+                // and Widget tray.
+                ValueAnimator bgFadeOutAnimation =
                         LauncherAnimUtils.ofFloat(mWorkspace, startAlpha, finalAlpha);
-                mBackgroundFadeOutAnimation.addUpdateListener(
-                        new ValueAnimator.AnimatorUpdateListener() {
+                bgFadeOutAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+                    @Override
                     public void onAnimationUpdate(ValueAnimator animation) {
                         dragLayer.setBackgroundAlpha(
                                 ((Float)animation.getAnimatedValue()).floatValue());
                     }
                 });
-                mBackgroundFadeOutAnimation.setInterpolator(new DecelerateInterpolator(1.5f));
-                mBackgroundFadeOutAnimation.setDuration(duration);
-                mStateAnimator.play(mBackgroundFadeOutAnimation);
+                bgFadeOutAnimation.setInterpolator(new DecelerateInterpolator(1.5f));
+                bgFadeOutAnimation.setDuration(duration);
+                mStateAnimator.play(bgFadeOutAnimation);
             } else {
                 dragLayer.setBackgroundAlpha(finalAlpha);
             }
@@ -577,17 +578,10 @@
      * Cancels the current animation.
      */
     private void cancelAnimation() {
-        cancelAnimator(mStateAnimator);
-        mStateAnimator = null;
-    }
-
-    /**
-     * Cancels the specified animation.
-     */
-    private void cancelAnimator(Animator animator) {
-        if (animator != null) {
-            animator.setDuration(0);
-            animator.cancel();
+        if (mStateAnimator != null) {
+            mStateAnimator.setDuration(0);
+            mStateAnimator.cancel();
         }
+        mStateAnimator = null;
     }
 }
\ No newline at end of file