OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.chrome.browser.infobar; |
| 6 |
| 7 import android.app.Activity; |
| 8 import android.content.Intent; |
| 9 import android.content.pm.PackageManager; |
| 10 import android.net.Uri; |
| 11 import android.provider.Settings; |
| 12 |
| 13 import org.chromium.base.ActivityState; |
| 14 import org.chromium.base.ApplicationStatus; |
| 15 import org.chromium.base.ApplicationStatus.ActivityStateListener; |
| 16 import org.chromium.base.CalledByNative; |
| 17 import org.chromium.chrome.browser.preferences.PrefServiceBridge; |
| 18 import org.chromium.content.browser.ContentViewCore; |
| 19 import org.chromium.content_public.browser.WebContents; |
| 20 import org.chromium.ui.base.WindowAndroid; |
| 21 |
| 22 import java.util.ArrayList; |
| 23 import java.util.List; |
| 24 |
| 25 /** |
| 26 * Handles requesting the android runtime permissions for the permission update
infobar. |
| 27 */ |
| 28 class PermissionUpdateInfoBarDelegate implements WindowAndroid.PermissionCallbac
k { |
| 29 |
| 30 private final WindowAndroid mWindowAndroid; |
| 31 private final String[] mAndroidPermisisons; |
| 32 private long mNativePtr; |
| 33 private ActivityStateListener mActivityStateListener; |
| 34 |
| 35 @CalledByNative |
| 36 private static PermissionUpdateInfoBarDelegate create( |
| 37 long nativePtr, WebContents webContents, int[] contentSettings) { |
| 38 return new PermissionUpdateInfoBarDelegate(nativePtr, webContents, conte
ntSettings); |
| 39 } |
| 40 |
| 41 private PermissionUpdateInfoBarDelegate( |
| 42 long nativePtr, WebContents webContents, int[] contentSettings) { |
| 43 mNativePtr = nativePtr; |
| 44 |
| 45 List<String> permissions = new ArrayList<String>(); |
| 46 for (int i = 0; i < contentSettings.length; i++) { |
| 47 String androidPermission = |
| 48 PrefServiceBridge.getAndroidPermissionForContentSetting(cont
entSettings[i]); |
| 49 if (androidPermission != null) permissions.add(androidPermission); |
| 50 } |
| 51 mAndroidPermisisons = permissions.toArray(new String[permissions.size()]
); |
| 52 mWindowAndroid = ContentViewCore.fromWebContents(webContents).getWindowA
ndroid(); |
| 53 } |
| 54 |
| 55 @CalledByNative |
| 56 private void onNativeDestroyed() { |
| 57 mNativePtr = 0; |
| 58 if (mActivityStateListener != null) { |
| 59 ApplicationStatus.unregisterActivityStateListener(mActivityStateList
ener); |
| 60 mActivityStateListener = null; |
| 61 } |
| 62 } |
| 63 |
| 64 @CalledByNative |
| 65 private void requestPermissions() { |
| 66 boolean canRequestAllPermissions = true; |
| 67 for (int i = 0; i < mAndroidPermisisons.length; i++) { |
| 68 canRequestAllPermissions &= |
| 69 mWindowAndroid.canRequestPermission(mAndroidPermisisons[i]); |
| 70 } |
| 71 |
| 72 if (canRequestAllPermissions) { |
| 73 mWindowAndroid.requestPermissions(mAndroidPermisisons, this); |
| 74 } else { |
| 75 Activity activity = mWindowAndroid.getActivity().get(); |
| 76 if (activity == null) { |
| 77 nativeOnPermissionResult(mNativePtr, false); |
| 78 return; |
| 79 } |
| 80 |
| 81 mActivityStateListener = new ActivityStateListener() { |
| 82 @Override |
| 83 public void onActivityStateChange(Activity activity, int newStat
e) { |
| 84 if (newState == ActivityState.DESTROYED) { |
| 85 ApplicationStatus.unregisterActivityStateListener(this); |
| 86 mActivityStateListener = null; |
| 87 |
| 88 nativeOnPermissionResult(mNativePtr, false); |
| 89 } else if (newState == ActivityState.RESUMED) { |
| 90 ApplicationStatus.unregisterActivityStateListener(this); |
| 91 mActivityStateListener = null; |
| 92 |
| 93 boolean hasAllPermissions = true; |
| 94 for (int i = 0; i < mAndroidPermisisons.length; i++) { |
| 95 hasAllPermissions &= |
| 96 mWindowAndroid.hasPermission(mAndroidPermisi
sons[i]); |
| 97 } |
| 98 nativeOnPermissionResult(mNativePtr, hasAllPermissions); |
| 99 } |
| 100 } |
| 101 }; |
| 102 ApplicationStatus.registerStateListenerForActivity(mActivityStateLis
tener, activity); |
| 103 |
| 104 Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAI
LS_SETTINGS); |
| 105 settingsIntent.setData(Uri.parse( |
| 106 "package:" + mWindowAndroid.getApplicationContext().getPacka
geName())); |
| 107 settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
| 108 activity.startActivity(settingsIntent); |
| 109 } |
| 110 } |
| 111 |
| 112 @Override |
| 113 public void onRequestPermissionsResult(String[] permissions, int[] grantResu
lts) { |
| 114 boolean allPermissionsGranted = true; |
| 115 for (int i = 0; i < grantResults.length; i++) { |
| 116 allPermissionsGranted &= grantResults[i] == PackageManager.PERMISSIO
N_GRANTED; |
| 117 } |
| 118 |
| 119 if (mNativePtr != 0) nativeOnPermissionResult(mNativePtr, allPermissions
Granted); |
| 120 } |
| 121 |
| 122 private native void nativeOnPermissionResult( |
| 123 long nativePermissionUpdateInfoBarDelegate, boolean allPermissionsGr
anted); |
| 124 } |
OLD | NEW |