summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Shvadskiy <ashvadskiy@cyngn.com>2016-05-23 14:54:22 -0700
committerArtem Shvadskiy <ashvadskiy@cyngn.com>2016-05-23 14:54:22 -0700
commit5391aedac2e13155f95e667918ae0956f4d12261 (patch)
treec6b8dd6a80469125bd3ec426f32a79c8e44e851d
parent91aeaede23c9bb332e9442977dd7159dfab7a112 (diff)
downloadpackages_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
-rw-r--r--src/com/android/contacts/activities/CompactContactEditorActivity.java12
-rw-r--r--src/com/android/contacts/activities/ContactEditorActivity.java12
-rw-r--r--src/com/android/contacts/detail/PhotoSelectionHandler.java59
-rw-r--r--src/com/android/contacts/editor/CompactContactEditorFragment.java13
-rw-r--r--src/com/android/contacts/editor/ContactEditorFragment.java15
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();