diff options
author | Artem Shvadskiy <ashvadskiy@cyngn.com> | 2016-05-23 14:54:22 -0700 |
---|---|---|
committer | Artem Shvadskiy <ashvadskiy@cyngn.com> | 2016-05-23 14:54:22 -0700 |
commit | 5391aedac2e13155f95e667918ae0956f4d12261 (patch) | |
tree | c6b8dd6a80469125bd3ec426f32a79c8e44e851d | |
parent | 91aeaede23c9bb332e9442977dd7159dfab7a112 (diff) | |
download | packages_apps_Contacts-5391aedac2e13155f95e667918ae0956f4d12261.tar.gz packages_apps_Contacts-5391aedac2e13155f95e667918ae0956f4d12261.tar.bz2 packages_apps_Contacts-5391aedac2e13155f95e667918ae0956f4d12261.zip |
Request storage permission for gallery access
Change-Id: Icd95df068e27096eab4759b99f73fa4ce4ca1dde
issue-id: FEIJ-238
5 files changed, 88 insertions, 23 deletions
diff --git a/src/com/android/contacts/activities/CompactContactEditorActivity.java b/src/com/android/contacts/activities/CompactContactEditorActivity.java index 082bb74f3..2c56e7e1c 100644 --- a/src/com/android/contacts/activities/CompactContactEditorActivity.java +++ b/src/com/android/contacts/activities/CompactContactEditorActivity.java @@ -16,6 +16,7 @@ package com.android.contacts.activities; +import android.app.Fragment; import com.android.contacts.R; import com.android.contacts.editor.CompactContactEditorFragment; import com.android.contacts.common.activity.RequestPermissionsActivity; @@ -63,4 +64,15 @@ public class CompactContactEditorActivity extends ContactEditorBaseActivity { mFragment.revert(); } } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + if (mFragment != null) { + ((Fragment) mFragment).onRequestPermissionsResult( + requestCode, permissions, grantResults); + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } } diff --git a/src/com/android/contacts/activities/ContactEditorActivity.java b/src/com/android/contacts/activities/ContactEditorActivity.java index 800a26756..63839373f 100644 --- a/src/com/android/contacts/activities/ContactEditorActivity.java +++ b/src/com/android/contacts/activities/ContactEditorActivity.java @@ -16,6 +16,7 @@ package com.android.contacts.activities; +import android.app.Fragment; import com.android.contacts.R; import com.android.contacts.common.activity.RequestPermissionsActivity; import com.android.contacts.editor.ContactEditorFragment; @@ -57,4 +58,15 @@ public class ContactEditorActivity extends ContactEditorBaseActivity mFragment.save(ContactEditor.SaveMode.COMPACT, /* backPressed =*/ true); } } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults) { + if (mFragment != null) { + ((Fragment) mFragment).onRequestPermissionsResult( + requestCode, permissions, grantResults); + } else { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } } diff --git a/src/com/android/contacts/detail/PhotoSelectionHandler.java b/src/com/android/contacts/detail/PhotoSelectionHandler.java index 405bbfc64..a96a6eeca 100644 --- a/src/com/android/contacts/detail/PhotoSelectionHandler.java +++ b/src/com/android/contacts/detail/PhotoSelectionHandler.java @@ -16,10 +16,10 @@ package com.android.contacts.detail; +import android.Manifest; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.ContentValues; -import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; @@ -61,13 +61,14 @@ public abstract class PhotoSelectionHandler implements OnClickListener { private static final int REQUEST_CODE_CAMERA_WITH_DATA = 1001; private static final int REQUEST_CODE_PHOTO_PICKED_WITH_DATA = 1002; private static final int REQUEST_CROP_PHOTO = 1003; + private static final int REQUEST_CODE_STORAGE_PERMISSION = 1004; // Height and width (in pixels) to request for the photo - queried from the provider. private static int mPhotoDim; // Default photo dimension to use if unable to query the provider. private static final int mDefaultPhotoDim = 720; - protected final Context mContext; + protected final Activity mActivity; private final View mChangeAnchorView; private final int mPhotoMode; private final int mPhotoPickSize; @@ -77,13 +78,13 @@ public abstract class PhotoSelectionHandler implements OnClickListener { private final boolean mIsDirectoryContact; private ListPopupWindow mPopup; - public PhotoSelectionHandler(Context context, View changeAnchorView, int photoMode, + public PhotoSelectionHandler(Activity activity, View changeAnchorView, int photoMode, boolean isDirectoryContact, RawContactDeltaList state) { - mContext = context; + mActivity = activity; mChangeAnchorView = changeAnchorView; mPhotoMode = photoMode; - mTempPhotoUri = ContactPhotoUtils.generateTempImageUri(context); - mCroppedPhotoUri = ContactPhotoUtils.generateTempCroppedImageUri(mContext); + mTempPhotoUri = ContactPhotoUtils.generateTempImageUri(mActivity); + mCroppedPhotoUri = ContactPhotoUtils.generateTempCroppedImageUri(mActivity); mIsDirectoryContact = isDirectoryContact; mState = state; mPhotoPickSize = getPhotoPickSize(); @@ -101,7 +102,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { if (listener != null) { if (getWritableEntityIndex() != -1) { mPopup = PhotoActionPopup.createPopupMenu( - mContext, mChangeAnchorView, listener, mPhotoMode); + mActivity, mChangeAnchorView, listener, mPhotoMode); mPopup.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { @@ -136,7 +137,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { try { // delete the original temporary photo if it exists - mContext.getContentResolver().delete(mTempPhotoUri, null, null); + mActivity.getContentResolver().delete(mTempPhotoUri, null, null); listener.onPhotoSelected(uri); return true; } catch (FileNotFoundException e) { @@ -164,7 +165,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { } else { toCrop = mTempPhotoUri; try { - if (!ContactPhotoUtils.savePhotoFromUriToUri(mContext, uri, + if (!ContactPhotoUtils.savePhotoFromUriToUri(mActivity, uri, toCrop, false)) { return false; } @@ -182,13 +183,28 @@ public abstract class PhotoSelectionHandler implements OnClickListener { } /** + * Implements {@link Activity#onRequestPermissionsResult(int, String[], int[])} + */ + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { + switch (requestCode) { + case REQUEST_CODE_STORAGE_PERMISSION: + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + startPickFromGalleryActivity(mTempPhotoUri); + } + break; + } + } + + /** * Return the index of the first entity in the contact data that belongs to a contact-writable * account, or -1 if no such entity exists. */ private int getWritableEntityIndex() { // Directory entries are non-writable. if (mIsDirectoryContact) return -1; - return mState.indexOfFirstWritableRawContact(mContext); + return mState.indexOfFirstWritableRawContact(mActivity); } /** @@ -220,7 +236,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { final ContentValues entityValues = delta.getValues().getCompleteValues(); final String type = entityValues.getAsString(RawContacts.ACCOUNT_TYPE); final String dataSet = entityValues.getAsString(RawContacts.DATA_SET); - final AccountType accountType = AccountTypeManager.getInstance(mContext).getAccountType( + final AccountType accountType = AccountTypeManager.getInstance(mActivity).getAccountType( type, dataSet); final ValuesDelta child = RawContactModifier.ensureKindExists( @@ -246,7 +262,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { getListener().onPhotoSelected(inputUri); } catch (FileNotFoundException e) { Log.e(TAG, "Cannot save uncropped photo", e); - Toast.makeText(mContext, R.string.contactPhotoSavedErrorToast, + Toast.makeText(mActivity, R.string.contactPhotoSavedErrorToast, Toast.LENGTH_LONG).show(); } return; @@ -256,7 +272,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { startPhotoActivity(intent, REQUEST_CROP_PHOTO, inputUri); } catch (Exception e) { Log.e(TAG, "Cannot crop image", e); - Toast.makeText(mContext, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); + Toast.makeText(mActivity, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); } } @@ -288,7 +304,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { } // Note that this URI is safe to call on the UI thread. - Cursor c = mContext.getContentResolver().query(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI, + Cursor c = mActivity.getContentResolver().query(DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI, new String[]{DisplayPhoto.DISPLAY_MAX_DIM}, null, null, null); if (c != null) { try { @@ -322,7 +338,7 @@ public abstract class PhotoSelectionHandler implements OnClickListener { } private boolean hasIntentHandler(Intent intent) { - final List<ResolveInfo> resolveInfo = mContext.getPackageManager() + final List<ResolveInfo> resolveInfo = mActivity.getPackageManager() .queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return resolveInfo != null && resolveInfo.size() > 0; } @@ -351,18 +367,27 @@ public abstract class PhotoSelectionHandler implements OnClickListener { startTakePhotoActivity(mTempPhotoUri); } catch (ActivityNotFoundException e) { Toast.makeText( - mContext, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); + mActivity, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); } } @Override public void onPickFromGalleryChosen() { + // Get storage permission first. + if (mActivity.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + mActivity.requestPermissions( + new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE }, + REQUEST_CODE_STORAGE_PERMISSION); + return; + } + try { // Launch picker to choose photo for selected contact startPickFromGalleryActivity(mTempPhotoUri); } catch (ActivityNotFoundException e) { Toast.makeText( - mContext, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); + mActivity, R.string.photoPickerNotFoundText, Toast.LENGTH_LONG).show(); } } diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java index 28bf0789a..9288668fd 100644 --- a/src/com/android/contacts/editor/CompactContactEditorFragment.java +++ b/src/com/android/contacts/editor/CompactContactEditorFragment.java @@ -30,7 +30,6 @@ import com.android.contacts.incall.InCallMetricsHelper; import com.android.contacts.util.ContactPhotoUtils; import android.app.Activity; -import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; @@ -110,11 +109,11 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl private PhotoListener mPhotoListener; private int mPhotoMode; - public PhotoHandler(Context context, int photoMode, RawContactDeltaList state) { + public PhotoHandler(Activity activity, int photoMode, RawContactDeltaList state) { // We pass a null changeAnchorView since we are overriding onClick so that we // can show the photo options in a dialog instead of a ListPopupWindow (which would // be anchored at changeAnchorView). - super(context, /* changeAnchorView =*/ null, photoMode, /* isDirectoryContact =*/ false, + super(activity, /* changeAnchorView =*/ null, photoMode, /* isDirectoryContact =*/ false, state); mPhotoListener = new PhotoListener(); mPhotoMode = photoMode; @@ -183,6 +182,14 @@ public class CompactContactEditorFragment extends ContactEditorBaseFragment impl } @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { + if (mPhotoHandler != null) { + mPhotoHandler.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + + @Override public void onStop() { super.onStop(); diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java index bd15b6247..de846c921 100644 --- a/src/com/android/contacts/editor/ContactEditorFragment.java +++ b/src/com/android/contacts/editor/ContactEditorFragment.java @@ -435,7 +435,7 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements editor.getPhotoEditor().setShowPrimary(false); return; } - final PhotoHandler photoHandler = new PhotoHandler(mContext, editor, mode, state); + final PhotoHandler photoHandler = new PhotoHandler(getActivity(), editor, mode, state); editor.getPhotoEditor().setEditorListener( (PhotoHandler.PhotoEditorListener) photoHandler.getListener()); editor.getPhotoEditor().setShowPrimary(showIsPrimaryOption); @@ -531,6 +531,15 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements } @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], + int[] grantResults) { + if (mCurrentPhotoHandler != null) { + mCurrentPhotoHandler.onRequestPermissionsResult( + requestCode, permissions, grantResults); + } + } + + @Override protected void joinAggregate(final long contactId) { final Intent intent = ContactSaveService.createJoinContactsIntent( mContext, mContactIdForJoin, contactId, ContactEditorActivity.class, @@ -641,9 +650,9 @@ public class ContactEditorFragment extends ContactEditorBaseFragment implements private final BaseRawContactEditorView mEditor; private final PhotoActionListener mPhotoEditorListener; - public PhotoHandler(Context context, BaseRawContactEditorView editor, int photoMode, + public PhotoHandler(Activity activity, BaseRawContactEditorView editor, int photoMode, RawContactDeltaList state) { - super(context, editor.getPhotoEditor().getChangeAnchorView(), photoMode, false, state); + super(activity, editor.getPhotoEditor().getChangeAnchorView(), photoMode, false, state); mEditor = editor; mRawContactId = editor.getRawContactId(); mPhotoEditorListener = new PhotoEditorListener(); |