1604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik/* 2604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * Copyright (C) 2015 The Android Open Source Project 3604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * 4604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * Licensed under the Apache License, Version 2.0 (the "License"); 5604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * you may not use this file except in compliance with the License. 6604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * You may obtain a copy of the License at 7604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * 8604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * http://www.apache.org/licenses/LICENSE-2.0 9604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * 10604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * Unless required by applicable law or agreed to in writing, software 11604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * distributed under the License is distributed on an "AS IS" BASIS, 12604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * See the License for the specific language governing permissions and 14604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * limitations under the License 15604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik */ 16604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 17604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikpackage com.android.inputmethod.latin.permissions; 18604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 19604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 20604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikimport android.app.Activity; 21604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikimport android.content.Context; 22604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikimport android.content.Intent; 23604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikimport android.os.Bundle; 24604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikimport android.support.annotation.NonNull; 25604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikimport android.support.v4.app.ActivityCompat; 26604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 27604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik/** 28604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * An activity to help request permissions. It's used when no other activity is available, e.g. in 29604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * InputMethodService. This activity assumes that all permissions are not granted yet. 30604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik */ 31604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheikpublic final class PermissionsActivity 32604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { 33604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 34604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik /** 35604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * Key to retrieve requested permissions from the intent. 36604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik */ 37604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik public static final String EXTRA_PERMISSION_REQUESTED_PERMISSIONS = "requested_permissions"; 38604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 39604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik /** 40604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * Key to retrieve request code from the intent. 41604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik */ 42604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik public static final String EXTRA_PERMISSION_REQUEST_CODE = "request_code"; 43604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 44604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik private static final int INVALID_REQUEST_CODE = -1; 45604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 46604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik private int mPendingRequestCode = INVALID_REQUEST_CODE; 47604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 48604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik /** 49604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik * Starts a PermissionsActivity and checks/requests supplied permissions. 50604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik */ 51604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik public static void run( 52604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik @NonNull Context context, int requestCode, @NonNull String... permissionStrings) { 53604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik Intent intent = new Intent(context.getApplicationContext(), PermissionsActivity.class); 54604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik intent.putExtra(EXTRA_PERMISSION_REQUESTED_PERMISSIONS, permissionStrings); 55604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik intent.putExtra(EXTRA_PERMISSION_REQUEST_CODE, requestCode); 56604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 57604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik context.startActivity(intent); 58604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik } 59604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 60604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik @Override 61604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik protected void onCreate(Bundle savedInstanceState) { 62604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik super.onCreate(savedInstanceState); 63604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik mPendingRequestCode = (savedInstanceState != null) 64604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik ? savedInstanceState.getInt(EXTRA_PERMISSION_REQUEST_CODE, INVALID_REQUEST_CODE) 65604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik : INVALID_REQUEST_CODE; 66604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik } 67604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 68604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik @Override 69604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik protected void onSaveInstanceState(Bundle outState) { 70604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik super.onSaveInstanceState(outState); 71604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik outState.putInt(EXTRA_PERMISSION_REQUEST_CODE, mPendingRequestCode); 72604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik } 73604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 74604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik @Override 75604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik protected void onResume() { 76604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik super.onResume(); 77604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik // Only do request when there is no pending request to avoid duplicated requests. 78604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik if (mPendingRequestCode == INVALID_REQUEST_CODE) { 79604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik final Bundle extras = getIntent().getExtras(); 80604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik final String[] permissionsToRequest = 81604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik extras.getStringArray(EXTRA_PERMISSION_REQUESTED_PERMISSIONS); 82604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik mPendingRequestCode = extras.getInt(EXTRA_PERMISSION_REQUEST_CODE); 83604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik // Assuming that all supplied permissions are not granted yet, so that we don't need to 84604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik // check them again. 85604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik PermissionsUtil.requestPermissions(this, mPendingRequestCode, permissionsToRequest); 86604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik } 87604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik } 88604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik 89604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik @Override 90604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik public void onRequestPermissionsResult( 91604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 92604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik mPendingRequestCode = INVALID_REQUEST_CODE; 93604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik PermissionsManager.get(this).onRequestPermissionsResult( 94604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik requestCode, permissions, grantResults); 95604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik finish(); 96604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik } 97604158669b407a40cd0f23538fad4dce5d738f24Mohammadinamul Sheik} 98