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 33 public class WidgetConfigure extends Activity { 34 @SuppressWarnings("unused") 35 private static final String TAG = "WidgetConfigure"; 36 37 public static final String KEY_WIDGET_TYPE = "widget-type"; 38 39 private static final int REQUEST_WIDGET_TYPE = 1; 40 private static final int REQUEST_CHOOSE_ALBUM = 2; 41 private static final int REQUEST_CROP_IMAGE = 3; 42 private static final int REQUEST_GET_PHOTO = 4; 43 44 public static final int RESULT_ERROR = RESULT_FIRST_USER; 45 46 // Scale up the widget size since we only specified the minimized 47 // size of the gadget. The real size could be larger. 48 // Note: There is also a limit on the size of data that can be 49 // passed in Binder's transaction. 50 private static float WIDGET_SCALE_FACTOR = 1.5f; 51 private static int MAX_WIDGET_SIDE = 360; 52 53 private int mAppWidgetId = -1; 54 private int mWidgetType = 0; 55 private Uri mPickedItem; 56 57 @Override onCreate(Bundle bundle)58 protected void onCreate(Bundle bundle) { 59 super.onCreate(bundle); 60 mAppWidgetId = getIntent().getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 61 62 if (mAppWidgetId == -1) { 63 setResult(Activity.RESULT_CANCELED); 64 finish(); 65 return; 66 } 67 68 if (mWidgetType == 0) { 69 Intent intent = new Intent(this, WidgetTypeChooser.class); 70 startActivityForResult(intent, REQUEST_WIDGET_TYPE); 71 } 72 } 73 updateWidgetAndFinish(WidgetDatabaseHelper.Entry entry)74 private void updateWidgetAndFinish(WidgetDatabaseHelper.Entry entry) { 75 AppWidgetManager manager = AppWidgetManager.getInstance(this); 76 RemoteViews views = PhotoAppWidgetProvider.buildWidget(this, mAppWidgetId, entry); 77 manager.updateAppWidget(mAppWidgetId, views); 78 setResult(RESULT_OK, new Intent().putExtra( 79 AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId)); 80 finish(); 81 } 82 83 @Override onActivityResult(int requestCode, int resultCode, Intent data)84 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 85 if (resultCode != RESULT_OK) { 86 setResult(resultCode, new Intent().putExtra( 87 AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId)); 88 finish(); 89 return; 90 } 91 92 if (requestCode == REQUEST_WIDGET_TYPE) { 93 setWidgetType(data); 94 } else if (requestCode == REQUEST_CHOOSE_ALBUM) { 95 setChoosenAlbum(data); 96 } else if (requestCode == REQUEST_GET_PHOTO) { 97 setChoosenPhoto(data); 98 } else if (requestCode == REQUEST_CROP_IMAGE) { 99 setPhotoWidget(data); 100 } else { 101 throw new AssertionError("unknown request: " + requestCode); 102 } 103 } 104 setPhotoWidget(Intent data)105 private void setPhotoWidget(Intent data) { 106 // Store the cropped photo in our database 107 Bitmap bitmap = (Bitmap) data.getParcelableExtra("data"); 108 WidgetDatabaseHelper helper = new WidgetDatabaseHelper(this); 109 try { 110 helper.setPhoto(mAppWidgetId, mPickedItem, bitmap); 111 updateWidgetAndFinish(helper.getEntry(mAppWidgetId)); 112 } finally { 113 helper.close(); 114 } 115 } 116 setChoosenPhoto(Intent data)117 private void setChoosenPhoto(Intent data) { 118 Resources res = getResources(); 119 120 float width = res.getDimension(R.dimen.appwidget_width); 121 float height = res.getDimension(R.dimen.appwidget_height); 122 123 // We try to crop a larger image (by scale factor), but there is still 124 // a bound on the binder limit. 125 float scale = Math.min(WIDGET_SCALE_FACTOR, 126 MAX_WIDGET_SIDE / Math.max(width, height)); 127 128 int widgetWidth = Math.round(width * scale); 129 int widgetHeight = Math.round(height * scale); 130 131 mPickedItem = data.getData(); 132 Intent request = new Intent(CropImage.ACTION_CROP, mPickedItem) 133 .putExtra(CropImage.KEY_OUTPUT_X, widgetWidth) 134 .putExtra(CropImage.KEY_OUTPUT_Y, widgetHeight) 135 .putExtra(CropImage.KEY_ASPECT_X, widgetWidth) 136 .putExtra(CropImage.KEY_ASPECT_Y, widgetHeight) 137 .putExtra(CropImage.KEY_SCALE_UP_IF_NEEDED, true) 138 .putExtra(CropImage.KEY_SCALE, true) 139 .putExtra(CropImage.KEY_RETURN_DATA, true); 140 startActivityForResult(request, REQUEST_CROP_IMAGE); 141 } 142 setChoosenAlbum(Intent data)143 private void setChoosenAlbum(Intent data) { 144 String albumPath = data.getStringExtra(AlbumPicker.KEY_ALBUM_PATH); 145 WidgetDatabaseHelper helper = new WidgetDatabaseHelper(this); 146 try { 147 helper.setWidget(mAppWidgetId, 148 WidgetDatabaseHelper.TYPE_ALBUM, albumPath); 149 updateWidgetAndFinish(helper.getEntry(mAppWidgetId)); 150 } finally { 151 helper.close(); 152 } 153 } 154 setWidgetType(Intent data)155 private void setWidgetType(Intent data) { 156 mWidgetType = data.getIntExtra(KEY_WIDGET_TYPE, R.id.widget_type_shuffle); 157 if (mWidgetType == R.id.widget_type_album) { 158 Intent intent = new Intent(this, AlbumPicker.class); 159 startActivityForResult(intent, REQUEST_CHOOSE_ALBUM); 160 } else if (mWidgetType == R.id.widget_type_shuffle) { 161 WidgetDatabaseHelper helper = new WidgetDatabaseHelper(this); 162 try { 163 helper.setWidget(mAppWidgetId, WidgetDatabaseHelper.TYPE_SHUFFLE, null); 164 updateWidgetAndFinish(helper.getEntry(mAppWidgetId)); 165 } finally { 166 helper.close(); 167 } 168 } else { 169 // Explicitly send the intent to the DialogPhotoPicker 170 Intent request = new Intent(this, DialogPicker.class) 171 .setAction(Intent.ACTION_GET_CONTENT) 172 .setType("image/*"); 173 startActivityForResult(request, REQUEST_GET_PHOTO); 174 } 175 } 176 } 177