| /* |
| * Copyright (C) 2009 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.gallery3d.app; |
| |
| import android.app.Dialog; |
| import android.content.ContentResolver; |
| import android.content.ContentValues; |
| import android.content.DialogInterface; |
| import android.content.DialogInterface.OnCancelListener; |
| import android.content.Intent; |
| import android.database.Cursor; |
| import android.drm.DrmManagerClient; |
| import android.drm.DrmManagerClientWrapper; |
| import android.drm.DrmStore.Action; |
| import android.drm.DrmStore.DrmDeliveryType; |
| import android.drm.DrmStore.RightsStatus; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.provider.MediaStore.Video.VideoColumns; |
| import android.view.InputDevice; |
| import android.view.MotionEvent; |
| import android.view.View; |
| import android.view.Window; |
| import android.view.WindowManager; |
| import android.widget.Toast; |
| |
| import com.android.gallery3d.R; |
| import com.android.gallery3d.common.Utils; |
| import com.android.gallery3d.data.DataManager; |
| import com.android.gallery3d.data.MediaItem; |
| import com.android.gallery3d.data.MediaObject; |
| import com.android.gallery3d.data.MediaSet; |
| import com.android.gallery3d.data.Path; |
| import com.android.gallery3d.picasasource.PicasaSource; |
| import com.android.gallery3d.util.GalleryUtils; |
| |
| public final class GalleryActivity extends AbstractGalleryActivity implements OnCancelListener { |
| public static final String BUY_LICENSE = "android.drmservice.intent.action.BUY_LICENSE"; |
| public static final String EXTRA_SLIDESHOW = "slideshow"; |
| public static final String EXTRA_DREAM = "dream"; |
| public static final String EXTRA_CROP = "crop"; |
| |
| public static final String ACTION_REVIEW = "com.android.camera.action.REVIEW"; |
| public static final String KEY_GET_CONTENT = "get-content"; |
| public static final String KEY_GET_ALBUM = "get-album"; |
| public static final String KEY_TYPE_BITS = "type-bits"; |
| public static final String KEY_MEDIA_TYPES = "mediaTypes"; |
| public static final String KEY_DISMISS_KEYGUARD = "dismiss-keyguard"; |
| public static final String KEY_FROM_SNAPCAM = "from-snapcam"; |
| |
| private static final String TAG = "GalleryActivity"; |
| private Dialog mVersionCheckDialog; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| requestWindowFeature(Window.FEATURE_ACTION_BAR); |
| requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); |
| |
| if (getIntent().getBooleanExtra(KEY_DISMISS_KEYGUARD, false)) { |
| getWindow().addFlags( |
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); |
| } |
| |
| setContentView(R.layout.main); |
| |
| if (savedInstanceState != null) { |
| getStateManager().restoreFromState(savedInstanceState); |
| } else { |
| initializeByIntent(); |
| } |
| } |
| |
| private void initializeByIntent() { |
| Intent intent = getIntent(); |
| String action = intent.getAction(); |
| |
| if (Intent.ACTION_GET_CONTENT.equalsIgnoreCase(action)) { |
| startGetContent(intent); |
| } else if (Intent.ACTION_PICK.equalsIgnoreCase(action)) { |
| // We do NOT really support the PICK intent. Handle it as |
| // the GET_CONTENT. However, we need to translate the type |
| // in the intent here. |
| Log.w(TAG, "action PICK is not supported"); |
| String type = Utils.ensureNotNull(intent.getType()); |
| if (type.startsWith("vnd.android.cursor.dir/")) { |
| if (type.endsWith("/image")) intent.setType("image/*"); |
| if (type.endsWith("/video")) intent.setType("video/*"); |
| } |
| startGetContent(intent); |
| } else if (Intent.ACTION_VIEW.equalsIgnoreCase(action) |
| || ACTION_REVIEW.equalsIgnoreCase(action)){ |
| startViewAction(intent); |
| } else { |
| startDefaultPage(); |
| } |
| } |
| |
| public void startDefaultPage() { |
| PicasaSource.showSignInReminder(this); |
| Bundle data = new Bundle(); |
| data.putString(AlbumSetPage.KEY_MEDIA_PATH, |
| getDataManager().getTopSetPath(DataManager.INCLUDE_ALL)); |
| getStateManager().startState(AlbumSetPage.class, data); |
| mVersionCheckDialog = PicasaSource.getVersionCheckDialog(this); |
| if (mVersionCheckDialog != null) { |
| mVersionCheckDialog.setOnCancelListener(this); |
| } |
| } |
| |
| private void startGetContent(Intent intent) { |
| Bundle data = intent.getExtras() != null |
| ? new Bundle(intent.getExtras()) |
| : new Bundle(); |
| data.putBoolean(KEY_GET_CONTENT, true); |
| int typeBits = GalleryUtils.determineTypeBits(this, intent); |
| data.putInt(KEY_TYPE_BITS, typeBits); |
| data.putString(AlbumSetPage.KEY_MEDIA_PATH, |
| getDataManager().getTopSetPath(typeBits)); |
| getStateManager().startState(AlbumSetPage.class, data); |
| } |
| |
| private String getContentType(Intent intent) { |
| String type = intent.getType(); |
| if (type != null) { |
| return GalleryUtils.MIME_TYPE_PANORAMA360.equals(type) |
| ? MediaItem.MIME_TYPE_JPEG : type; |
| } |
| |
| Uri uri = intent.getData(); |
| try { |
| return getContentResolver().getType(uri); |
| } catch (Throwable t) { |
| Log.w(TAG, "get type fail", t); |
| return null; |
| } |
| } |
| |
| private void startViewAction(Intent intent) { |
| Boolean slideshow = intent.getBooleanExtra(EXTRA_SLIDESHOW, false); |
| if (slideshow) { |
| getActionBar().hide(); |
| DataManager manager = getDataManager(); |
| Path path = manager.findPathByUri(intent.getData(), intent.getType()); |
| if (path == null || manager.getMediaObject(path) |
| instanceof MediaItem) { |
| path = Path.fromString( |
| manager.getTopSetPath(DataManager.INCLUDE_IMAGE)); |
| } |
| Bundle data = new Bundle(); |
| data.putString(SlideshowPage.KEY_SET_PATH, path.toString()); |
| data.putBoolean(SlideshowPage.KEY_RANDOM_ORDER, true); |
| data.putBoolean(SlideshowPage.KEY_REPEAT, true); |
| if (intent.getBooleanExtra(EXTRA_DREAM, false)) { |
| data.putBoolean(SlideshowPage.KEY_DREAM, true); |
| } |
| getStateManager().startState(SlideshowPage.class, data); |
| } else { |
| Bundle data = new Bundle(); |
| DataManager dm = getDataManager(); |
| Uri uri = intent.getData(); |
| String contentType = getContentType(intent); |
| if (contentType == null) { |
| Toast.makeText(this, |
| R.string.no_such_item, Toast.LENGTH_LONG).show(); |
| finish(); |
| return; |
| } |
| if (uri == null) { |
| int typeBits = GalleryUtils.determineTypeBits(this, intent); |
| data.putInt(KEY_TYPE_BITS, typeBits); |
| data.putString(AlbumSetPage.KEY_MEDIA_PATH, |
| getDataManager().getTopSetPath(typeBits)); |
| getStateManager().startState(AlbumSetPage.class, data); |
| } else if (contentType.startsWith( |
| ContentResolver.CURSOR_DIR_BASE_TYPE)) { |
| int mediaType = intent.getIntExtra(KEY_MEDIA_TYPES, 0); |
| if (mediaType != 0) { |
| uri = uri.buildUpon().appendQueryParameter( |
| KEY_MEDIA_TYPES, String.valueOf(mediaType)) |
| .build(); |
| } |
| Path setPath = dm.findPathByUri(uri, null); |
| MediaSet mediaSet = null; |
| if (setPath != null) { |
| mediaSet = (MediaSet) dm.getMediaObject(setPath); |
| } |
| if (mediaSet != null) { |
| if (mediaSet.isLeafAlbum()) { |
| data.putString(AlbumPage.KEY_MEDIA_PATH, setPath.toString()); |
| data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, |
| dm.getTopSetPath(DataManager.INCLUDE_ALL)); |
| getStateManager().startState(AlbumPage.class, data); |
| } else { |
| data.putString(AlbumSetPage.KEY_MEDIA_PATH, setPath.toString()); |
| getStateManager().startState(AlbumSetPage.class, data); |
| } |
| } else { |
| startDefaultPage(); |
| } |
| } else { |
| Path itemPath = null; |
| String imagePath = null; |
| String scheme = uri.getScheme(); |
| if ("file".equals(scheme)) { |
| imagePath = uri.getPath(); |
| } else { |
| Cursor cursor = null; |
| try { |
| cursor = this.getContentResolver().query(uri, |
| new String[] {VideoColumns.DATA}, null, null, null); |
| if (cursor != null && cursor.moveToNext()) { |
| imagePath = cursor.getString(0); |
| } |
| } catch (Throwable t) { |
| Log.d(TAG, "cannot get path from: " + uri); |
| } finally { |
| if (cursor != null) cursor.close(); |
| } |
| } |
| String mime_Type = intent.getType(); |
| if (imagePath != null |
| && (imagePath.endsWith(".dcf") || imagePath.endsWith(".dm")) |
| && "*/*".equals(mime_Type)) { |
| imagePath = imagePath.replace("/storage/emulated/0", "/storage/emulated/legacy"); |
| DrmManagerClient drmClient = new DrmManagerClient(this); |
| mime_Type = drmClient.getOriginalMimeType(imagePath); |
| if (drmClient != null) drmClient.release(); |
| } |
| |
| Log.d(TAG, "DRM mime_Type==" + mime_Type); |
| itemPath = getDataManager().findPathByUri(uri, mime_Type); |
| Log.d(TAG, "itemPath=" + itemPath); |
| // If item path not correct, just finish starting the gallery |
| if (itemPath == null) { |
| finish(); |
| return; |
| } |
| |
| Log.d(TAG,"imagePath=" + imagePath); |
| if (intent.getBooleanExtra("WidgetClick", false) == true) { |
| DrmManagerClientWrapper drmClient = new DrmManagerClientWrapper(this); |
| int status = drmClient.checkRightsStatus(imagePath, Action.DISPLAY); |
| if (RightsStatus.RIGHTS_VALID != status) { |
| ContentValues values = drmClient.getMetadata(imagePath); |
| String address = values.getAsString("Rights-Issuer"); |
| Intent buyIntent = new Intent(BUY_LICENSE); |
| buyIntent.putExtra("DRM_FILE_PATH", address); |
| sendBroadcast(buyIntent); |
| Log.d(TAG, "startViewAction:WidgetClick, intent sent"); |
| } |
| if (drmClient != null) drmClient.release(); |
| } |
| |
| if (imagePath != null |
| && (imagePath.endsWith(".dcf") || imagePath.endsWith(".dm"))) { |
| DrmManagerClientWrapper drmClient = new DrmManagerClientWrapper(this); |
| imagePath = imagePath.replace("/storage/emulated/0", "/storage/emulated/legacy"); |
| ContentValues values = drmClient.getMetadata(imagePath); |
| int drmType = values.getAsInteger("DRM-TYPE"); |
| if (drmType > DrmDeliveryType.FORWARD_LOCK) { |
| MediaItem mediaItem = (MediaItem) getDataManager() |
| .getMediaObject(itemPath); |
| if (mediaItem.getMediaType() == MediaObject.MEDIA_TYPE_IMAGE) { |
| mediaItem.setConsumeRights(true); |
| } |
| Toast.makeText(this, R.string.action_consumes_rights, |
| Toast.LENGTH_LONG).show(); |
| } |
| if (drmClient != null) drmClient.release(); |
| } |
| |
| Path albumPath = dm.getDefaultSetOf(itemPath); |
| |
| data.putString(PhotoPage.KEY_MEDIA_ITEM_PATH, itemPath.toString()); |
| if (!intent.getBooleanExtra(KEY_FROM_SNAPCAM, false)) { |
| data.putBoolean(PhotoPage.KEY_READONLY, true); |
| } |
| |
| // TODO: Make the parameter "SingleItemOnly" public so other |
| // activities can reference it. |
| boolean singleItemOnly = (albumPath == null) |
| || intent.getBooleanExtra("SingleItemOnly", false); |
| if (!singleItemOnly) { |
| data.putString(PhotoPage.KEY_MEDIA_SET_PATH, albumPath.toString()); |
| // when FLAG_ACTIVITY_NEW_TASK is set, (e.g. when intent is fired |
| // from notification), back button should behave the same as up button |
| // rather than taking users back to the home screen |
| if (intent.getBooleanExtra(PhotoPage.KEY_TREAT_BACK_AS_UP, false) |
| || ((intent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0)) { |
| data.putBoolean(PhotoPage.KEY_TREAT_BACK_AS_UP, true); |
| } |
| } |
| |
| getStateManager().startState(SinglePhotoPage.class, data); |
| } |
| } |
| } |
| |
| @Override |
| protected void onResume() { |
| Utils.assertTrue(getStateManager().getStateCount() > 0); |
| super.onResume(); |
| if (mVersionCheckDialog != null) { |
| mVersionCheckDialog.show(); |
| } |
| } |
| |
| @Override |
| protected void onPause() { |
| super.onPause(); |
| if (mVersionCheckDialog != null) { |
| mVersionCheckDialog.dismiss(); |
| } |
| } |
| |
| @Override |
| public void onCancel(DialogInterface dialog) { |
| if (dialog == mVersionCheckDialog) { |
| mVersionCheckDialog = null; |
| } |
| } |
| |
| @Override |
| public boolean onGenericMotionEvent(MotionEvent event) { |
| final boolean isTouchPad = (event.getSource() |
| & InputDevice.SOURCE_CLASS_POSITION) != 0; |
| if (isTouchPad) { |
| float maxX = event.getDevice().getMotionRange(MotionEvent.AXIS_X).getMax(); |
| float maxY = event.getDevice().getMotionRange(MotionEvent.AXIS_Y).getMax(); |
| View decor = getWindow().getDecorView(); |
| float scaleX = decor.getWidth() / maxX; |
| float scaleY = decor.getHeight() / maxY; |
| float x = event.getX() * scaleX; |
| //x = decor.getWidth() - x; // invert x |
| float y = event.getY() * scaleY; |
| //y = decor.getHeight() - y; // invert y |
| MotionEvent touchEvent = MotionEvent.obtain(event.getDownTime(), |
| event.getEventTime(), event.getAction(), x, y, event.getMetaState()); |
| return dispatchTouchEvent(touchEvent); |
| } |
| return super.onGenericMotionEvent(event); |
| } |
| } |