185e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren/* 285e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * Copyright (C) 2016 The Android Open Source Project 385e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * 485e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * Licensed under the Apache License, Version 2.0 (the "License"); 585e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * you may not use this file except in compliance with the License. 685e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * You may obtain a copy of the License at 785e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * 885e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * http://www.apache.org/licenses/LICENSE-2.0 985e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * 1085e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * Unless required by applicable law or agreed to in writing, software 1185e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * distributed under the License is distributed on an "AS IS" BASIS, 1285e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1385e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * See the License for the specific language governing permissions and 1485e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren * limitations under the License. 1585e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren */ 1685e038ee7cac169b3a9878cba881dc7eb401de2aChris Wrenpackage android.support.v4.app; 1785e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren 1885e038ee7cac169b3a9878cba881dc7eb401de2aChris Wrenimport android.app.AppOpsManager; 1985e038ee7cac169b3a9878cba881dc7eb401de2aChris Wrenimport android.content.Context; 2085e038ee7cac169b3a9878cba881dc7eb401de2aChris Wrenimport android.content.pm.ApplicationInfo; 2185e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren 2285e038ee7cac169b3a9878cba881dc7eb401de2aChris Wrenimport java.lang.reflect.Field; 2385e038ee7cac169b3a9878cba881dc7eb401de2aChris Wrenimport java.lang.reflect.InvocationTargetException; 2485e038ee7cac169b3a9878cba881dc7eb401de2aChris Wrenimport java.lang.reflect.Method; 2585e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren 268a5e1cc21b9571f88c4ab51cb7c74c248145079aChris Wrenclass NotificationManagerCompatKitKat { 2785e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren private static final String CHECK_OP_NO_THROW = "checkOpNoThrow"; 2885e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION"; 2985e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren 3085e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren public static boolean areNotificationsEnabled(Context context) { 3185e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); 3285e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren ApplicationInfo appInfo = context.getApplicationInfo(); 3385e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren String pkg = context.getApplicationContext().getPackageName(); 3485e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren int uid = appInfo.uid; 3585e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren try { 3685e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren Class<?> appOpsClass = Class.forName(AppOpsManager.class.getName()); 3785e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE, 3885e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren Integer.TYPE, String.class); 3985e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION); 4085e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren int value = (int) opPostNotificationValue.get(Integer.class); 4185e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren return ((int) checkOpNoThrowMethod.invoke(appOps, value, uid, pkg) 4285e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren == AppOpsManager.MODE_ALLOWED); 4385e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren } catch (ClassNotFoundException | NoSuchMethodException | NoSuchFieldException | 4485e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren InvocationTargetException | IllegalAccessException | RuntimeException e) { 4585e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren return true; 4685e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren } 4785e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren } 4885e038ee7cac169b3a9878cba881dc7eb401de2aChris Wren} 49