protected void init() {
    setContentView(R.layout.wallpaper_cropper);

    mCropView = (CropView) findViewById(R.id.cropView);

    Intent cropIntent = getIntent();
    final Uri imageUri = cropIntent.getData();

    if (imageUri == null) {
      Log.e(LOGTAG, "No URI passed in intent, exiting WallpaperCropActivity");
      finish();
      return;
    }

    int rotation = getRotationFromExif(this, imageUri);
    mCropView.setTileSource(new BitmapRegionTileSource(this, imageUri, 1024, rotation), null);
    mCropView.setTouchEnabled(true);
    // Action bar
    // Show the custom action bar view
    final ActionBar actionBar = getActionBar();
    actionBar.setCustomView(R.layout.actionbar_set_wallpaper);
    actionBar
        .getCustomView()
        .setOnClickListener(
            new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                boolean finishActivityWhenDone = true;
                cropImageAndSetWallpaper(imageUri, null, finishActivityWhenDone);
              }
            });
  }
 protected void cropImageAndSetWallpaper(
     Resources res, int resId, final boolean finishActivityWhenDone) {
   // crop this image and scale it down to the default wallpaper size for
   // this device
   int rotation = getRotationFromExif(res, resId);
   Point inSize = mCropView.getSourceDimensions();
   Point outSize = getDefaultWallpaperSize(getResources(), getWindowManager());
   RectF crop = getMaxCropRect(inSize.x, inSize.y, outSize.x, outSize.y, false);
   Runnable onEndCrop =
       new Runnable() {
         public void run() {
           // Passing 0, 0 will cause launcher to revert to using the
           // default wallpaper size
           updateWallpaperDimensions(0, 0);
           if (finishActivityWhenDone) {
             setResult(Activity.RESULT_OK);
             finish();
           }
         }
       };
   BitmapCropTask cropTask =
       new BitmapCropTask(
           this, res, resId, crop, rotation, outSize.x, outSize.y, true, false, onEndCrop);
   cropTask.execute();
 }
 @Override
 public void onClick(WallpaperPickerActivity a) {
   BitmapRegionTileSource.ResourceBitmapSource bitmapSource =
       new BitmapRegionTileSource.ResourceBitmapSource(
           mResources, mResId, BitmapRegionTileSource.MAX_PREVIEW_SIZE);
   bitmapSource.loadInBackground();
   BitmapRegionTileSource source = new BitmapRegionTileSource(a, bitmapSource);
   CropView v = a.getCropView();
   v.setTileSource(source, null);
   Point wallpaperSize =
       WallpaperCropActivity.getDefaultWallpaperSize(a.getResources(), a.getWindowManager());
   RectF crop =
       WallpaperCropActivity.getMaxCropRect(
           source.getImageWidth(),
           source.getImageHeight(),
           wallpaperSize.x,
           wallpaperSize.y,
           false);
   v.setScale(wallpaperSize.x / crop.width());
   v.setTouchEnabled(false);
   a.setSystemWallpaperVisiblity(false);
 }
    @Override
    public void onClick(WallpaperPickerActivity a) {
      CropView c = a.getCropView();

      Drawable defaultWallpaper =
          WallpaperManager.getInstance(a)
              .getBuiltInDrawable(c.getWidth(), c.getHeight(), false, 0.5f, 0.5f);

      if (defaultWallpaper == null) {
        Log.w(TAG, "Null default wallpaper encountered.");
        c.setTileSource(null, null);
        return;
      }

      c.setTileSource(
          new DrawableTileSource(a, defaultWallpaper, DrawableTileSource.MAX_PREVIEW_SIZE), null);
      c.setScale(1f);
      c.setTouchEnabled(false);
      a.setSystemWallpaperVisiblity(false);
    }
  protected void cropImageAndSetWallpaper(
      Uri uri,
      OnBitmapCroppedHandler onBitmapCroppedHandler,
      final boolean finishActivityWhenDone) {
    // Get the crop
    boolean ltr = mCropView.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR;

    Point minDims = new Point();
    Point maxDims = new Point();
    Display d = getWindowManager().getDefaultDisplay();
    d.getCurrentSizeRange(minDims, maxDims);

    Point displaySize = new Point();
    d.getSize(displaySize);

    int maxDim = Math.max(maxDims.x, maxDims.y);
    final int minDim = Math.min(minDims.x, minDims.y);
    int defaultWallpaperWidth;
    if (isScreenLarge(getResources())) {
      defaultWallpaperWidth = (int) (maxDim * wallpaperTravelToScreenWidthRatio(maxDim, minDim));
    } else {
      defaultWallpaperWidth = Math.max((int) (minDim * WALLPAPER_SCREENS_SPAN), maxDim);
    }

    boolean isPortrait = displaySize.x < displaySize.y;
    int portraitHeight;
    if (isPortrait) {
      portraitHeight = mCropView.getHeight();
    } else {
      // TODO: how to actually get the proper portrait height?
      // This is not quite right:
      portraitHeight = Math.max(maxDims.x, maxDims.y);
    }
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) {
      Point realSize = new Point();
      d.getRealSize(realSize);
      portraitHeight = Math.max(realSize.x, realSize.y);
    }
    // Get the crop
    RectF cropRect = mCropView.getCrop();
    int cropRotation = mCropView.getImageRotation();
    float cropScale = mCropView.getWidth() / (float) cropRect.width();

    Point inSize = mCropView.getSourceDimensions();
    Matrix rotateMatrix = new Matrix();
    rotateMatrix.setRotate(cropRotation);
    float[] rotatedInSize = new float[] {inSize.x, inSize.y};
    rotateMatrix.mapPoints(rotatedInSize);
    rotatedInSize[0] = Math.abs(rotatedInSize[0]);
    rotatedInSize[1] = Math.abs(rotatedInSize[1]);

    // ADJUST CROP WIDTH
    // Extend the crop all the way to the right, for parallax
    // (or all the way to the left, in RTL)
    float extraSpace = ltr ? rotatedInSize[0] - cropRect.right : cropRect.left;
    // Cap the amount of extra width
    float maxExtraSpace = defaultWallpaperWidth / cropScale - cropRect.width();
    extraSpace = Math.min(extraSpace, maxExtraSpace);

    if (ltr) {
      cropRect.right += extraSpace;
    } else {
      cropRect.left -= extraSpace;
    }

    // ADJUST CROP HEIGHT
    if (isPortrait) {
      cropRect.bottom = cropRect.top + portraitHeight / cropScale;
    } else { // LANDSCAPE
      float extraPortraitHeight = portraitHeight / cropScale - cropRect.height();
      float expandHeight =
          Math.min(
              Math.min(rotatedInSize[1] - cropRect.bottom, cropRect.top), extraPortraitHeight / 2);
      cropRect.top -= expandHeight;
      cropRect.bottom += expandHeight;
    }
    final int outWidth = (int) Math.round(cropRect.width() * cropScale);
    final int outHeight = (int) Math.round(cropRect.height() * cropScale);

    Runnable onEndCrop =
        new Runnable() {
          public void run() {
            updateWallpaperDimensions(outWidth, outHeight);
            if (finishActivityWhenDone) {
              setResult(Activity.RESULT_OK);
              finish();
            }
          }
        };
    BitmapCropTask cropTask =
        new BitmapCropTask(
            this, uri, cropRect, cropRotation, outWidth, outHeight, true, false, onEndCrop);
    if (onBitmapCroppedHandler != null) {
      cropTask.setOnBitmapCropped(onBitmapCroppedHandler);
    }
    cropTask.execute();
  }