• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 Google Inc.
3  * Licensed to The Android Open Source Project.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package com.android.ex.photo;
19 
20 import android.app.Activity;
21 import android.content.ContentProvider;
22 import android.content.Context;
23 import android.content.Intent;
24 
25 import com.android.ex.photo.fragments.PhotoViewFragment;
26 
27 /**
28  * Build intents to start app activities
29  */
30 
31 public class Intents {
32     // Intent extras
33     public static final String EXTRA_PHOTO_INDEX = "photo_index";
34     public static final String EXTRA_INITIAL_PHOTO_URI = "initial_photo_uri";
35     public static final String EXTRA_PHOTOS_URI = "photos_uri";
36     public static final String EXTRA_RESOLVED_PHOTO_URI = "resolved_photo_uri";
37     public static final String EXTRA_PROJECTION = "projection";
38     public static final String EXTRA_THUMBNAIL_URI = "thumbnail_uri";
39     public static final String EXTRA_MAX_INITIAL_SCALE = "max_scale";
40     public static final String EXTRA_WATCH_NETWORK = "watch_network";
41 
42 
43     // Parameters affecting the intro/exit animation
44     public static final String EXTRA_SCALE_UP_ANIMATION = "scale_up_animation";
45     public static final String EXTRA_ANIMATION_START_X = "start_x_extra";
46     public static final String EXTRA_ANIMATION_START_Y = "start_y_extra";
47     public static final String EXTRA_ANIMATION_START_WIDTH = "start_width_extra";
48     public static final String EXTRA_ANIMATION_START_HEIGHT = "start_height_extra";
49 
50     // Parameters affecting the display and features
51     public static final String EXTRA_ACTION_BAR_HIDDEN_INITIALLY = "action_bar_hidden_initially";
52     public static final String EXTRA_DISPLAY_THUMBS_FULLSCREEN = "display_thumbs_fullscreen";
53 
54     /**
55      * Gets a photo view intent builder to display the photos from phone activity.
56      *
57      * @param context The context
58      * @return The intent builder
59      */
newPhotoViewActivityIntentBuilder(Context context)60     public static PhotoViewIntentBuilder newPhotoViewActivityIntentBuilder(Context context) {
61         return new PhotoViewIntentBuilder(context, PhotoViewActivity.class);
62     }
63 
64     /**
65      * Gets a photo view intent builder to display the photo view fragment
66      *
67      * @param context The context
68      * @return The intent builder
69      */
newPhotoViewFragmentIntentBuilder(Context context)70     public static PhotoViewIntentBuilder newPhotoViewFragmentIntentBuilder(Context context) {
71         return new PhotoViewIntentBuilder(context, PhotoViewFragment.class);
72     }
73 
74     /** Gets a new photo view intent builder */
newPhotoViewIntentBuilder( Context context, Class<? extends Activity> cls)75     public static PhotoViewIntentBuilder newPhotoViewIntentBuilder(
76             Context context, Class<? extends Activity> cls) {
77         return new PhotoViewIntentBuilder(context, cls);
78     }
79 
80     /** Builder to create a photo view intent */
81     public static class PhotoViewIntentBuilder {
82         private final Intent mIntent;
83 
84         /** The index of the photo to show */
85         private Integer mPhotoIndex;
86         /** The URI of the initial photo to show */
87         private String mInitialPhotoUri;
88         /** The URI of the initial thumbnail to show */
89         private String mInitialThumbnailUri;
90         /** The URI of the group of photos to display */
91         private String mPhotosUri;
92         /** The URL of the photo to display */
93         private String mResolvedPhotoUri;
94         /** The projection for the query to use; optional */
95         private String[] mProjection;
96         /** The URI of a thumbnail of the photo to display */
97         private String mThumbnailUri;
98         /** The maximum scale to display images at before  */
99         private Float mMaxInitialScale;
100         /**
101          * True if the PhotoViewFragments should watch for network changes to restart their loaders
102          */
103         private boolean mWatchNetwork;
104         /** true we want to run the image scale animation */
105         private boolean mScaleAnimation;
106         /** The parameters for performing the scale up/scale down animations
107          * upon enter and exit. StartX and StartY represent the screen coordinates
108          * of the upper left corner of the start rectangle, startWidth and startHeight
109          * represent the width and height of the start rectangle.
110          */
111         private int mStartX;
112         private int mStartY;
113         private int mStartWidth;
114         private int mStartHeight;
115 
116         private boolean mActionBarHiddenInitially;
117         private boolean mDisplayFullScreenThumbs;
118 
PhotoViewIntentBuilder(Context context, Class<?> cls)119         private PhotoViewIntentBuilder(Context context, Class<?> cls) {
120             mIntent = new Intent(context, cls);
121             mScaleAnimation = false;
122             mActionBarHiddenInitially = false;
123             mDisplayFullScreenThumbs = false;
124         }
125 
126         /** Sets the photo index */
setPhotoIndex(Integer photoIndex)127         public PhotoViewIntentBuilder setPhotoIndex(Integer photoIndex) {
128             mPhotoIndex = photoIndex;
129             return this;
130         }
131 
132         /** Sets the initial photo URI */
setInitialPhotoUri(String initialPhotoUri)133         public PhotoViewIntentBuilder setInitialPhotoUri(String initialPhotoUri) {
134             mInitialPhotoUri = initialPhotoUri;
135             return this;
136         }
137 
138         /** Sets the photos URI */
setPhotosUri(String photosUri)139         public PhotoViewIntentBuilder setPhotosUri(String photosUri) {
140             mPhotosUri = photosUri;
141             return this;
142         }
143 
144         /** Sets the query projection */
setProjection(String[] projection)145         public PhotoViewIntentBuilder setProjection(String[] projection) {
146             mProjection = projection;
147             return this;
148         }
149 
150         /** Sets the resolved photo URI. This method is for the case
151          *  where the URI given to {@link PhotoViewActivity} points directly
152          *  to a single image and does not need to be resolved via a query
153          *  to the {@link ContentProvider}. If this value is set, it supersedes
154          *  {@link #setPhotosUri(String)}. */
setResolvedPhotoUri(String resolvedPhotoUri)155         public PhotoViewIntentBuilder setResolvedPhotoUri(String resolvedPhotoUri) {
156             mResolvedPhotoUri = resolvedPhotoUri;
157             return this;
158         }
159 
160         /**
161          * Sets the URI for a thumbnail preview of the photo.
162          */
setThumbnailUri(String thumbnailUri)163         public PhotoViewIntentBuilder setThumbnailUri(String thumbnailUri) {
164             mThumbnailUri = thumbnailUri;
165             return this;
166         }
167 
168         /**
169          * Sets the maximum scale which an image is initially displayed at
170          */
setMaxInitialScale(float maxScale)171         public PhotoViewIntentBuilder setMaxInitialScale(float maxScale) {
172             mMaxInitialScale = maxScale;
173             return this;
174         }
175 
176         /**
177          * Enable watching the network for connectivity changes.
178          *
179          * When a change is detected, bitmap loaders will be restarted if required.
180          */
watchNetworkConnectivityChanges()181         public PhotoViewIntentBuilder watchNetworkConnectivityChanges() {
182             mWatchNetwork = true;
183             return this;
184         }
185 
setScaleAnimation(int startX, int startY, int startWidth, int startHeight)186         public PhotoViewIntentBuilder setScaleAnimation(int startX, int startY,
187                 int startWidth, int startHeight) {
188             mScaleAnimation = true;
189             mStartX = startX;
190             mStartY = startY;
191             mStartWidth = startWidth;
192             mStartHeight = startHeight;
193             return this;
194         }
195 
196         // If this option is turned on, then the photoViewer will be initially
197         // displayed with the action bar hidden. This is as opposed to the default
198         // behavior, where the actionBar is initially shown.
setActionBarHiddenInitially( boolean actionBarHiddenInitially)199         public PhotoViewIntentBuilder setActionBarHiddenInitially(
200                 boolean actionBarHiddenInitially) {
201             mActionBarHiddenInitially = actionBarHiddenInitially;
202             return this;
203         }
204 
205         // If this option is turned on, then the small, lo-res thumbnail will
206         // be scaled up to the maximum size to cover as much of the screen as
207         // possible while still maintaining the correct aspect ratio. This means
208         // that the image may appear blurry until the the full-res image is
209         // loaded.
210         // This is as opposed to the default behavior, where only part of the
211         // thumbnail is displayed in a small view in the center of the screen,
212         // and a loading spinner is displayed until the full-res image is loaded.
setDisplayThumbsFullScreen( boolean displayFullScreenThumbs)213         public PhotoViewIntentBuilder setDisplayThumbsFullScreen(
214                 boolean displayFullScreenThumbs) {
215             mDisplayFullScreenThumbs = displayFullScreenThumbs;
216             return this;
217         }
218 
219         /** Build the intent */
build()220         public Intent build() {
221             mIntent.setAction(Intent.ACTION_VIEW);
222 
223             mIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
224 
225             if (mPhotoIndex != null) {
226                 mIntent.putExtra(EXTRA_PHOTO_INDEX, (int) mPhotoIndex);
227             }
228 
229             if (mInitialPhotoUri != null) {
230                 mIntent.putExtra(EXTRA_INITIAL_PHOTO_URI, mInitialPhotoUri);
231             }
232 
233             if (mInitialPhotoUri != null && mPhotoIndex != null) {
234                 throw new IllegalStateException(
235                         "specified both photo index and photo uri");
236             }
237 
238             if (mPhotosUri != null) {
239                 mIntent.putExtra(EXTRA_PHOTOS_URI, mPhotosUri);
240             }
241 
242             if (mResolvedPhotoUri != null) {
243                 mIntent.putExtra(EXTRA_RESOLVED_PHOTO_URI, mResolvedPhotoUri);
244             }
245 
246             if (mProjection != null) {
247                 mIntent.putExtra(EXTRA_PROJECTION, mProjection);
248             }
249 
250             if (mThumbnailUri != null) {
251                 mIntent.putExtra(EXTRA_THUMBNAIL_URI, mThumbnailUri);
252             }
253 
254             if (mMaxInitialScale != null) {
255                 mIntent.putExtra(EXTRA_MAX_INITIAL_SCALE, mMaxInitialScale);
256             }
257 
258             if (mWatchNetwork == true) {
259                 mIntent.putExtra(EXTRA_WATCH_NETWORK, true);
260             }
261 
262             mIntent.putExtra(EXTRA_SCALE_UP_ANIMATION, mScaleAnimation);
263             if (mScaleAnimation) {
264                 mIntent.putExtra(EXTRA_ANIMATION_START_X, mStartX);
265                 mIntent.putExtra(EXTRA_ANIMATION_START_Y, mStartY);
266                 mIntent.putExtra(EXTRA_ANIMATION_START_WIDTH, mStartWidth);
267                 mIntent.putExtra(EXTRA_ANIMATION_START_HEIGHT, mStartHeight);
268             }
269 
270             mIntent.putExtra(EXTRA_ACTION_BAR_HIDDEN_INITIALLY, mActionBarHiddenInitially);
271             mIntent.putExtra(EXTRA_DISPLAY_THUMBS_FULLSCREEN, mDisplayFullScreenThumbs);
272 
273             return mIntent;
274         }
275     }
276 }
277