package org.deviceconnect.android.activity; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.ResultReceiver; import android.support.annotation.NonNull; /** * An Activity with interfaces to make a request for permissions and return the * result. * * @author NTT DOCOMO, INC. */ public class PermissionRequestActivity extends Activity { static final String EXTRA_PERMISSIONS = "EXTRA_PERMISSIONS"; static final String EXTRA_GRANT_RESULTS = "EXTRA_GRANT_RESULTS"; private static final String EXTRA_CALLBACK = "EXTRA_CALLBACK"; private static final int REQUEST_CODE = 123456789; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState == null) { Intent callingIntent = getIntent(); if (callingIntent == null || callingIntent.getExtras() == null || !callingIntent.hasExtra(EXTRA_PERMISSIONS) || !callingIntent.hasExtra(EXTRA_CALLBACK)) { finish(); return; } Bundle extras = callingIntent.getExtras(); String[] permissions = extras.getStringArray(EXTRA_PERMISSIONS); if (permissions == null) { finish(); return; } requestPermissions(permissions, REQUEST_CODE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { Intent callingIntent = getIntent(); if (callingIntent == null || callingIntent.getExtras() == null || !callingIntent.hasExtra(EXTRA_CALLBACK)) { finish(); return; } Bundle extras = callingIntent.getExtras(); ResultReceiver callback = extras.getParcelable(EXTRA_CALLBACK); if (callback == null) { finish(); return; } Bundle resultData = new Bundle(); resultData.putStringArray(EXTRA_PERMISSIONS, permissions); resultData.putIntArray(EXTRA_GRANT_RESULTS, grantResults); callback.send(Activity.RESULT_OK, resultData); finish(); } public static void requestPermissions(@NonNull Context context, @NonNull String[] permissions, @NonNull ResultReceiver resultReceiver) { Intent callIntent = new Intent(context, PermissionRequestActivity.class); callIntent.putExtra(EXTRA_PERMISSIONS, permissions); callIntent.putExtra(EXTRA_CALLBACK, resultReceiver); // NOTE: FLAG_ACTIVITY_SINGLE_TASK causes Activity#onActivityResult() // being called prematurely. FLAG_ACTIVITY_SINGLE_TOP, on the other // hand, does not cause that. callIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(callIntent); } }