summaryrefslogtreecommitdiff
path: root/src/com/android/contacts/common/vcard/ImportVCardActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/contacts/common/vcard/ImportVCardActivity.java')
-rw-r--r--src/com/android/contacts/common/vcard/ImportVCardActivity.java43
1 files changed, 39 insertions, 4 deletions
diff --git a/src/com/android/contacts/common/vcard/ImportVCardActivity.java b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
index 9da8c0b7..8f2e8167 100644
--- a/src/com/android/contacts/common/vcard/ImportVCardActivity.java
+++ b/src/com/android/contacts/common/vcard/ImportVCardActivity.java
@@ -74,7 +74,7 @@ import java.util.List;
* any Dialog in the instance. So this code is careless about the management around managed
* dialogs stuffs (like how onCreateDialog() is used).
*/
-public class ImportVCardActivity extends Activity {
+public class ImportVCardActivity extends Activity implements ImportVCardDialogFragment.Listener {
private static final String LOG_TAG = "VCardImport";
private static final int SELECT_ACCOUNT = 0;
@@ -544,8 +544,8 @@ public class ImportVCardActivity extends Activity {
// Reading uris from non-storage needs the permission granted from the source intent,
// instead of permissions from RequestImportVCardPermissionActivity. So skipping requesting
// permissions from RequestImportVCardPermissionActivity for uris from non-storage source.
- if (isStorageUri(sourceUri)
- && RequestImportVCardPermissionsActivity.startPermissionActivity(this)) {
+ if (isStorageUri(sourceUri) && RequestImportVCardPermissionsActivity
+ .startPermissionActivity(this, isCallerSelf(this))) {
return;
}
@@ -569,7 +569,8 @@ public class ImportVCardActivity extends Activity {
}
// Always request required permission for contacts before importing the vcard.
- if (RequestImportVCardPermissionsActivity.startPermissionActivity(this)) {
+ if (RequestImportVCardPermissionsActivity.startPermissionActivity(this,
+ isCallerSelf(this))) {
return;
}
@@ -601,10 +602,44 @@ public class ImportVCardActivity extends Activity {
}
}
+ if (isCallerSelf(this)) {
+ startImport(sourceUri, sourceDisplayName);
+ } else {
+ ImportVCardDialogFragment.show(this, sourceUri, sourceDisplayName);
+ }
+ }
+
+ private static boolean isCallerSelf(Activity activity) {
+ // {@link Activity#getCallingActivity()} is a safer alternative to
+ // {@link Activity#getCallingPackage()} that works around a
+ // framework bug where getCallingPackage() can sometimes return null even when the
+ // current activity *was* in fact launched via a startActivityForResult() call.
+ //
+ // (The bug happens if the task stack needs to be re-created by the framework after
+ // having been killed due to memory pressure or by the "Don't keep activities"
+ // developer option; see bug 7494866 for the full details.)
+ //
+ // Turns out that {@link Activity#getCallingActivity()} *does* return correct info
+ // even in the case where getCallingPackage() is broken, so the workaround is simply
+ // to get the package name from getCallingActivity().getPackageName() instead.
+ final ComponentName callingActivity = activity.getCallingActivity();
+ if (callingActivity == null) return false;
+ final String packageName = callingActivity.getPackageName();
+ if (packageName == null) return false;
+ return packageName.equals(activity.getApplicationContext().getPackageName());
+ }
+
+ @Override
+ public void onImportVCardConfirmed(Uri sourceUri, String sourceDisplayName) {
startImport(sourceUri, sourceDisplayName);
}
@Override
+ public void onImportVCardDenied() {
+ finish();
+ }
+
+ @Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == SELECT_ACCOUNT) {
if (resultCode == Activity.RESULT_OK) {