1 package com.android.wallpaperpicker.tileinfo; 2 3 import android.graphics.Bitmap; 4 import android.graphics.drawable.BitmapDrawable; 5 import android.net.Uri; 6 import android.os.AsyncTask; 7 import android.util.Log; 8 import android.view.View; 9 import android.view.ViewGroup; 10 import android.widget.Toast; 11 12 import com.android.wallpaperpicker.common.CropAndSetWallpaperTask; 13 import com.android.photos.BitmapRegionTileSource; 14 import com.android.photos.BitmapRegionTileSource.BitmapSource; 15 import com.android.wallpaperpicker.R; 16 import com.android.wallpaperpicker.WallpaperPickerActivity; 17 import com.android.wallpaperpicker.common.InputStreamProvider; 18 19 public class UriWallpaperInfo extends DrawableThumbWallpaperInfo { 20 21 private static final String TAG = "UriWallpaperInfo"; 22 23 public final Uri mUri; 24 UriWallpaperInfo(Uri uri)25 public UriWallpaperInfo(Uri uri) { 26 super(null); 27 mUri = uri; 28 } 29 30 @Override onClick(final WallpaperPickerActivity a)31 public void onClick(final WallpaperPickerActivity a) { 32 a.setWallpaperButtonEnabled(false); 33 final BitmapRegionTileSource.InputStreamSource bitmapSource = 34 new BitmapRegionTileSource.InputStreamSource(a, mUri); 35 a.setCropViewTileSource(bitmapSource, true, false, null, new Runnable() { 36 37 @Override 38 public void run() { 39 if (bitmapSource.getLoadingState() == BitmapSource.State.LOADED) { 40 a.selectTile(mView); 41 a.setWallpaperButtonEnabled(true); 42 } else { 43 ViewGroup parent = (ViewGroup) mView.getParent(); 44 if (parent != null) { 45 parent.removeView(mView); 46 Toast.makeText(a, R.string.image_load_fail, 47 Toast.LENGTH_SHORT).show(); 48 } 49 } 50 } 51 }); 52 } 53 54 @Override onSave(final WallpaperPickerActivity a)55 public void onSave(final WallpaperPickerActivity a) { 56 CropAndSetWallpaperTask.OnBitmapCroppedHandler h = 57 new CropAndSetWallpaperTask.OnBitmapCroppedHandler() { 58 public void onBitmapCropped(byte[] imageBytes) { 59 // rotation is set to 0 since imageBytes has already been correctly rotated 60 Bitmap thumb = createThumbnail( 61 InputStreamProvider.fromBytes(imageBytes), a, 0, true); 62 a.getSavedImages().writeImage(thumb, imageBytes); 63 } 64 }; 65 boolean shouldFadeOutOnFinish = a.getWallpaperParallaxOffset() == 0f; 66 a.cropImageAndSetWallpaper(mUri, h, shouldFadeOutOnFinish); 67 } 68 69 @Override isSelectable()70 public boolean isSelectable() { 71 return true; 72 } 73 74 @Override isNamelessWallpaper()75 public boolean isNamelessWallpaper() { 76 return true; 77 } 78 loadThumbnaleAsync(final WallpaperPickerActivity activity)79 public void loadThumbnaleAsync(final WallpaperPickerActivity activity) { 80 mView.setVisibility(View.GONE); 81 new AsyncTask<Void, Void, Bitmap>() { 82 protected Bitmap doInBackground(Void...args) { 83 try { 84 InputStreamProvider isp = InputStreamProvider.fromUri(activity, mUri); 85 int rotation = isp.getRotationFromExif(activity); 86 return createThumbnail(isp, activity, rotation, false); 87 } catch (SecurityException securityException) { 88 if (activity.isActivityDestroyed()) { 89 // Temporarily granted permissions are revoked when the activity 90 // finishes, potentially resulting in a SecurityException here. 91 // Even though {@link #isDestroyed} might also return true in different 92 // situations where the configuration changes, we are fine with 93 // catching these cases here as well. 94 cancel(false); 95 } else { 96 // otherwise it had a different cause and we throw it further 97 throw securityException; 98 } 99 return null; 100 } 101 } 102 protected void onPostExecute(Bitmap thumb) { 103 if (!isCancelled() && thumb != null) { 104 setThumb(new BitmapDrawable(activity.getResources(), thumb)); 105 mView.setVisibility(View.VISIBLE); 106 } else { 107 Log.e(TAG, "Error loading thumbnail for uri=" + mUri); 108 } 109 } 110 }.execute(); 111 } 112 }