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