/*
 * Copyright (C) 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.applications;

import android.Manifest;
import android.app.AppOpsManager;
import android.content.Context;

import com.android.settingslib.applications.ApplicationsState;

/**
 * Retrieves information from {@link AppOpsManager} and {@link android.content.pm.PackageManager}
 * regarding {@link AppOpsManager#OP_MANAGE_EXTERNAL_STORAGE} and
 * {@link Manifest.permission#MANAGE_EXTERNAL_STORAGE}.
 */
public class AppStateManageExternalStorageBridge extends AppStateAppOpsBridge {
    private static final int APP_OPS_OP_CODE = AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE;
    private static final String[] PERMISSIONS = {
            Manifest.permission.MANAGE_EXTERNAL_STORAGE
    };

    public AppStateManageExternalStorageBridge(Context context, ApplicationsState appState,
            Callback callback) {
        super(context, appState, callback, APP_OPS_OP_CODE, PERMISSIONS);
    }

    @Override
    protected void updateExtraInfo(ApplicationsState.AppEntry app, String pkg, int uid) {
        app.extraInfo = getManageExternalStoragePermState(pkg, uid);
    }

    /**
     * Returns the MANAGE_EXTERNAL_STORAGE {@link AppStateAppOpsBridge.PermissionState} object
     * associated with the given package and user.
     */
    public PermissionState getManageExternalStoragePermState(String pkg, int uid) {
        return getPermissionInfo(pkg, uid);
    }

    /**
     * Used by {@link com.android.settings.applications.manageapplications.AppFilterRegistry} to
     * determine which apps get to appear on the Special App Access list.
     */
    public static final ApplicationsState.AppFilter FILTER_MANAGE_EXTERNAL_STORAGE =
            new ApplicationsState.AppFilter() {
        @Override
        public void init() {
        }

        @Override
        public boolean filterApp(ApplicationsState.AppEntry info) {
            // If extraInfo != null, it means that the app has declared
            // Manifest.permission.MANAGE_EXTERNAL_STORAGE and therefore it should appear on our
            // list
            return info.extraInfo != null;
        }
    };
}
