From 59e1e6425861a91d82e9f8dbc2d840e7cea07169 Mon Sep 17 00:00:00 2001 From: Tsung-Mao Fang Date: Wed, 12 Feb 2020 18:10:45 +0800 Subject: [PATCH] Handle null case in AppStateAppOpsBridge AppStateAppOpsBridge#getEntries returns null if no app is requesting AppStateAppOpsBridge#mPermissions, which would cause the settings app to crash in AppStateAppOpsBridge#loadAllExtraInfo or AppStateAppOpsBridge#loadAppOpsStates. Try to skip null case here and set null for extraInfo when we get null from AppStateAppOpsBridge#getEntries. Change-Id: Iac03ec11869eeac62fa055da26b4b7a10dc65bb8 Fix: 147479269 Test: Open All files access and no crash. --- ...anage_external_storage_permission_details.xml | 11 +++++++---- .../applications/AppStateAppOpsBridge.java | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/res/xml/manage_external_storage_permission_details.xml b/res/xml/manage_external_storage_permission_details.xml index b540ff6687c..29ff297b8c2 100644 --- a/res/xml/manage_external_storage_permission_details.xml +++ b/res/xml/manage_external_storage_permission_details.xml @@ -14,7 +14,9 @@ limitations under the License. --> - @@ -22,8 +24,9 @@ android:key="app_ops_settings_switch" android:title="@string/permit_manage_external_storage"/> - + diff --git a/src/com/android/settings/applications/AppStateAppOpsBridge.java b/src/com/android/settings/applications/AppStateAppOpsBridge.java index 8c001d841f1..b4f6e483711 100755 --- a/src/com/android/settings/applications/AppStateAppOpsBridge.java +++ b/src/com/android/settings/applications/AppStateAppOpsBridge.java @@ -61,6 +61,7 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge { this(context, appState, callback, appOpsOpCode, permissions, AppGlobals.getPackageManager()); } + AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback, int[] appOpsOpCodes, String[] permissions) { this(context, appState, callback, appOpsOpCodes, permissions, @@ -70,9 +71,10 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge { @VisibleForTesting AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback, int appOpsOpCode, String[] permissions, IPackageManager packageManager) { - this(context, appState, callback, new int[] {appOpsOpCode}, permissions, + this(context, appState, callback, new int[]{appOpsOpCode}, permissions, packageManager); } + AppStateAppOpsBridge(Context context, ApplicationsState appState, Callback callback, int[] appOpsOpCodes, String[] permissions, IPackageManager packageManager) { super(appState, callback); @@ -155,8 +157,12 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge { for (int i = 0; i < N; i++) { AppEntry app = apps.get(i); int userId = UserHandle.getUserId(app.info.uid); - ArrayMap userMap = entries.get(userId); - app.extraInfo = userMap != null ? userMap.get(app.info.packageName) : null; + if (entries != null) { + ArrayMap userMap = entries.get(userId); + app.extraInfo = userMap != null ? userMap.get(app.info.packageName) : null; + } else { + app.extraInfo = null; + } } } @@ -247,6 +253,10 @@ public abstract class AppStateAppOpsBridge extends AppStateBaseBridge { * a particular package. */ private void loadAppOpsStates(SparseArray> entries) { + if (entries == null) { + return; + } + // Find out which packages have been granted permission from AppOps. final List packageOps = mAppOpsManager.getPackagesForOps( mAppOpsOpCodes);