diff options
Diffstat (limited to 'src/com/android/contacts/common/vcard/ImportVCardActivity.java')
-rw-r--r-- | src/com/android/contacts/common/vcard/ImportVCardActivity.java | 43 |
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) { |