/* * Copyright (C) 2015 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.messaging.ui.photoviewer; import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.FragmentManager; import android.support.v4.content.Loader; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.widget.ShareActionProvider; import android.widget.Toast; import com.android.ex.photo.PhotoViewController; import com.android.ex.photo.adapters.PhotoPagerAdapter; import com.android.ex.photo.loaders.PhotoBitmapLoaderInterface.BitmapResult; import com.android.messaging.R; import com.android.messaging.datamodel.ConversationImagePartsView.PhotoViewQuery; import com.android.messaging.datamodel.MediaScratchFileProvider; import com.android.messaging.ui.conversation.ConversationFragment; import com.android.messaging.util.Dates; import com.android.messaging.util.LogUtil; import com.android.messaging.util.OsUtil; /** * Customizations for the photoviewer to display conversation images in full screen. */ public class BuglePhotoViewController extends PhotoViewController { private ShareActionProvider mShareActionProvider; private MenuItem mShareItem; private MenuItem mSaveItem; public BuglePhotoViewController(final ActivityInterface activity) { super(activity); } @Override public Loader onCreateBitmapLoader( final int id, final Bundle args, final String uri) { switch (id) { case BITMAP_LOADER_AVATAR: case BITMAP_LOADER_THUMBNAIL: case BITMAP_LOADER_PHOTO: return new BuglePhotoBitmapLoader(getActivity().getContext(), uri); default: LogUtil.e(LogUtil.BUGLE_TAG, "Photoviewer unable to open bitmap loader with unknown id: " + id); return null; } } @Override public void updateActionBar() { final Cursor cursor = getCursorAtProperPosition(); if (mSaveItem == null || cursor == null) { // Load not finished, called from framework code before ready return; } // Show the name as the title mActionBarTitle = cursor.getString(PhotoViewQuery.INDEX_SENDER_FULL_NAME); if (TextUtils.isEmpty(mActionBarTitle)) { // If the name is not known, fall back to the phone number mActionBarTitle = cursor.getString(PhotoViewQuery.INDEX_DISPLAY_DESTINATION); } // Show the timestamp as the subtitle final long receivedTimestamp = cursor.getLong(PhotoViewQuery.INDEX_RECEIVED_TIMESTAMP); mActionBarSubtitle = Dates.getMessageTimeString(receivedTimestamp).toString(); setActionBarTitles(getActivity().getActionBarInterface()); mSaveItem.setVisible(!isTempFile()); updateShareActionProvider(); } private void updateShareActionProvider() { final PhotoPagerAdapter adapter = getAdapter(); final Cursor cursor = getCursorAtProperPosition(); if (mShareActionProvider == null || mShareItem == null || adapter == null || cursor == null) { // Not enough stuff loaded to update the share action return; } final String photoUri = adapter.getPhotoUri(cursor); if (isTempFile()) { mShareItem.setVisible(false); return; } final String contentType = adapter.getContentType(cursor); final Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setType(contentType); shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(photoUri)); mShareActionProvider.setShareIntent(shareIntent); mShareItem.setVisible(true); } /** * Checks whether the current photo is a temp file. A temp file can be deleted at any time, so * we need to disable share and save options because the file may no longer be there. */ private boolean isTempFile() { final Cursor cursor = getCursorAtProperPosition(); final Uri photoUri = Uri.parse(getAdapter().getPhotoUri(cursor)); return MediaScratchFileProvider.isMediaScratchSpaceUri(photoUri); } @Override public boolean onCreateOptionsMenu(final Menu menu) { ((Activity) getActivity()).getMenuInflater().inflate(R.menu.photo_view_menu, menu); // Get the ShareActionProvider mShareItem = menu.findItem(R.id.action_share); mShareActionProvider = (ShareActionProvider) mShareItem.getActionProvider(); updateShareActionProvider(); mSaveItem = menu.findItem(R.id.action_save); return true; } @Override public boolean onPrepareOptionsMenu(final Menu menu) { return !mIsEmpty; } @Override public boolean onOptionsItemSelected(final MenuItem item) { if (item.getItemId() == R.id.action_save) { if (OsUtil.hasStoragePermission()) { final PhotoPagerAdapter adapter = getAdapter(); final Cursor cursor = getCursorAtProperPosition(); if (cursor == null) { final Context context = getActivity().getContext(); final String error = context.getResources().getQuantityString( R.plurals.attachment_save_error, 1, 1); Toast.makeText(context, error, Toast.LENGTH_SHORT).show(); return true; } final String photoUri = adapter.getPhotoUri(cursor); new ConversationFragment.SaveAttachmentTask(((Activity) getActivity()), Uri.parse(photoUri), adapter.getContentType(cursor)).executeOnThreadPool(); } else { ((Activity)getActivity()).requestPermissions( new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0); } return true; } else { return super.onOptionsItemSelected(item); } } @Override public PhotoPagerAdapter createPhotoPagerAdapter(final Context context, final FragmentManager fm, final Cursor c, final float maxScale) { return new BuglePhotoPageAdapter(context, fm, c, maxScale, mDisplayThumbsFullScreen); } }