OSDN Git Service

Merge "Import translations. DO NOT MERGE" into gb-ub-photos-arches
[android-x86/packages-apps-Gallery2.git] / src / com / android / gallery3d / gadget / WidgetConfigure.java
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 }