Home | History | Annotate | Download | only in gadget
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.gallery3d.gadget;
     18 
     19 import android.app.Activity;
     20 import android.appwidget.AppWidgetManager;
     21 import android.content.Intent;
     22 import android.content.res.Resources;
     23 import android.graphics.Bitmap;
     24 import android.net.Uri;
     25 import android.os.Bundle;
     26 import android.widget.RemoteViews;
     27 
     28 import com.android.gallery3d.R;
     29 import com.android.gallery3d.app.AlbumPicker;
     30 import com.android.gallery3d.app.CropImage;
     31 import com.android.gallery3d.app.DialogPicker;
     32 import com.android.gallery3d.common.ApiHelper;
     33 
     34 public class WidgetConfigure extends Activity {
     35     @SuppressWarnings("unused")
     36     private static final String TAG = "WidgetConfigure";
     37 
     38     public static final String KEY_WIDGET_TYPE = "widget-type";
     39     private static final String KEY_PICKED_ITEM = "picked-item";
     40 
     41     private static final int REQUEST_WIDGET_TYPE = 1;
     42     private static final int REQUEST_CHOOSE_ALBUM = 2;
     43     private static final int REQUEST_CROP_IMAGE = 3;
     44     private static final int REQUEST_GET_PHOTO = 4;
     45 
     46     public static final int RESULT_ERROR = RESULT_FIRST_USER;
     47 
     48     // Scale up the widget size since we only specified the minimized
     49     // size of the gadget. The real size could be larger.
     50     // Note: There is also a limit on the size of data that can be
     51     // passed in Binder's transaction.
     52     private static float WIDGET_SCALE_FACTOR = 1.5f;
     53     private static int MAX_WIDGET_SIDE = 360;
     54 
     55     private int mAppWidgetId = -1;
     56     private Uri mPickedItem;
     57 
     58     @Override
     59     protected void onCreate(Bundle savedState) {
     60         super.onCreate(savedState);
     61         mAppWidgetId = getIntent().getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
     62 
     63         if (mAppWidgetId == -1) {
     64             setResult(Activity.RESULT_CANCELED);
     65             finish();
     66             return;
     67         }
     68 
     69         if (savedState == null) {
     70             if (ApiHelper.HAS_REMOTE_VIEWS_SERVICE) {
     71                 Intent intent = new Intent(this, WidgetTypeChooser.class);
     72                 startActivityForResult(intent, REQUEST_WIDGET_TYPE);
     73             } else { // Choose the photo type widget
     74                 setWidgetType(new Intent()
     75                         .putExtra(KEY_WIDGET_TYPE, R.id.widget_type_photo));
     76             }
     77         } else {
     78             mPickedItem = savedState.getParcelable(KEY_PICKED_ITEM);
     79         }
     80     }
     81 
     82     protected void onSaveInstanceStates(Bundle outState) {
     83         super.onSaveInstanceState(outState);
     84         outState.putParcelable(KEY_PICKED_ITEM, mPickedItem);
     85     }
     86 
     87     private void updateWidgetAndFinish(WidgetDatabaseHelper.Entry entry) {
     88         AppWidgetManager manager = AppWidgetManager.getInstance(this);
     89         RemoteViews views = PhotoAppWidgetProvider.buildWidget(this, mAppWidgetId, entry);
     90         manager.updateAppWidget(mAppWidgetId, views);
     91         setResult(RESULT_OK, new Intent().putExtra(
     92                 AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId));
     93         finish();
     94     }
     95 
     96     @Override
     97     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     98         if (resultCode != RESULT_OK) {
     99             setResult(resultCode, new Intent().putExtra(
    100                     AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId));
    101             finish();
    102             return;
    103         }
    104 
    105         if (requestCode == REQUEST_WIDGET_TYPE) {
    106             setWidgetType(data);
    107         } else if (requestCode == REQUEST_CHOOSE_ALBUM) {
    108             setChoosenAlbum(data);
    109         } else if (requestCode == REQUEST_GET_PHOTO) {
    110             setChoosenPhoto(data);
    111         } else if (requestCode == REQUEST_CROP_IMAGE) {
    112             setPhotoWidget(data);
    113         } else {
    114             throw new AssertionError("unknown request: " + requestCode);
    115         }
    116     }
    117 
    118     private void setPhotoWidget(Intent data) {
    119         // Store the cropped photo in our database
    120         Bitmap bitmap = (Bitmap) data.getParcelableExtra("data");
    121         WidgetDatabaseHelper helper = new WidgetDatabaseHelper(this);
    122         try {
    123             helper.setPhoto(mAppWidgetId, mPickedItem, bitmap);
    124             updateWidgetAndFinish(helper.getEntry(mAppWidgetId));
    125         } finally {
    126             helper.close();
    127         }
    128     }
    129 
    130     private void setChoosenPhoto(Intent data) {
    131         Resources res = getResources();
    132 
    133         float width = res.getDimension(R.dimen.appwidget_width);
    134         float height = res.getDimension(R.dimen.appwidget_height);
    135 
    136         // We try to crop a larger image (by scale factor), but there is still
    137         // a bound on the binder limit.
    138         float scale = Math.min(WIDGET_SCALE_FACTOR,
    139                 MAX_WIDGET_SIDE / Math.max(width, height));
    140 
    141         int widgetWidth = Math.round(width * scale);
    142         int widgetHeight = Math.round(height * scale);
    143 
    144         mPickedItem = data.getData();
    145         Intent request = new Intent(CropImage.ACTION_CROP, mPickedItem)
    146                 .putExtra(CropImage.KEY_OUTPUT_X, widgetWidth)
    147                 .putExtra(CropImage.KEY_OUTPUT_Y, widgetHeight)
    148                 .putExtra(CropImage.KEY_ASPECT_X, widgetWidth)
    149                 .putExtra(CropImage.KEY_ASPECT_Y, widgetHeight)
    150                 .putExtra(CropImage.KEY_SCALE_UP_IF_NEEDED, true)
    151                 .putExtra(CropImage.KEY_SCALE, true)
    152                 .putExtra(CropImage.KEY_RETURN_DATA, true);
    153         startActivityForResult(request, REQUEST_CROP_IMAGE);
    154     }
    155 
    156     private void setChoosenAlbum(Intent data) {
    157         String albumPath = data.getStringExtra(AlbumPicker.KEY_ALBUM_PATH);
    158         WidgetDatabaseHelper helper = new WidgetDatabaseHelper(this);
    159         try {
    160             helper.setWidget(mAppWidgetId,
    161                     WidgetDatabaseHelper.TYPE_ALBUM, albumPath);
    162             updateWidgetAndFinish(helper.getEntry(mAppWidgetId));
    163         } finally {
    164             helper.close();
    165         }
    166     }
    167 
    168     private void setWidgetType(Intent data) {
    169         int widgetType = data.getIntExtra(KEY_WIDGET_TYPE, R.id.widget_type_shuffle);
    170         if (widgetType == R.id.widget_type_album) {
    171             Intent intent = new Intent(this, AlbumPicker.class);
    172             startActivityForResult(intent, REQUEST_CHOOSE_ALBUM);
    173         } else if (widgetType == R.id.widget_type_shuffle) {
    174             WidgetDatabaseHelper helper = new WidgetDatabaseHelper(this);
    175             try {
    176                 helper.setWidget(mAppWidgetId, WidgetDatabaseHelper.TYPE_SHUFFLE, null);
    177                 updateWidgetAndFinish(helper.getEntry(mAppWidgetId));
    178             } finally {
    179                 helper.close();
    180             }
    181         } else {
    182             // Explicitly send the intent to the DialogPhotoPicker
    183             Intent request = new Intent(this, DialogPicker.class)
    184                     .setAction(Intent.ACTION_GET_CONTENT)
    185                     .setType("image/*");
    186             startActivityForResult(request, REQUEST_GET_PHOTO);
    187         }
    188     }
    189 }
    190