blob: 18ea8cfc13866114a4561d60109170397a772929 [file] [log] [blame]
/*
* Copyright (C) 2022 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.server.appop;
import static android.app.ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_BOUND_TOP;
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_PERSISTENT_UI;
import static android.app.ActivityManager.PROCESS_STATE_RECEIVER;
import static android.app.ActivityManager.PROCESS_STATE_TOP;
import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN;
import static android.app.AppOpsManager.UID_STATE_BACKGROUND;
import static android.app.AppOpsManager.UID_STATE_CACHED;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND;
import static android.app.AppOpsManager.UID_STATE_FOREGROUND_SERVICE;
import static android.app.AppOpsManager.UID_STATE_PERSISTENT;
import static android.app.AppOpsManager.UID_STATE_TOP;
import android.annotation.CallbackExecutor;
import android.util.SparseArray;
import java.io.PrintWriter;
import java.util.concurrent.Executor;
interface AppOpsUidStateTracker {
// Map from process states to the uid states we track.
static int processStateToUidState(int procState) {
if (procState == PROCESS_STATE_UNKNOWN) {
return UID_STATE_CACHED;
}
if (procState <= PROCESS_STATE_PERSISTENT_UI) {
return UID_STATE_PERSISTENT;
}
if (procState <= PROCESS_STATE_TOP) {
return UID_STATE_TOP;
}
if (procState <= PROCESS_STATE_BOUND_TOP) {
return UID_STATE_FOREGROUND;
}
if (procState <= PROCESS_STATE_FOREGROUND_SERVICE) {
return UID_STATE_FOREGROUND_SERVICE;
}
if (procState <= PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
return UID_STATE_FOREGROUND;
}
if (procState <= PROCESS_STATE_RECEIVER) {
return UID_STATE_BACKGROUND;
}
return UID_STATE_CACHED;
}
/*
* begin data pushed from appopsservice
*/
void updateUidProcState(int uid, int procState, int capability);
void updateAppWidgetVisibility(SparseArray<String> uidPackageNames, boolean visible);
/*
* end data pushed from appopsservice
*/
/**
* Gets the {@link android.app.AppOpsManager.UidState} that the uid current is in.
*/
int getUidState(int uid);
/**
* Determines if the uid is in foreground.
*/
boolean isUidInForeground(int uid);
/**
* Given a uid, code, and mode, resolve any foregroundness to MODE_IGNORED or MODE_ALLOWED
*/
int evalMode(int uid, int code, int mode);
/**
* Listen to changes in {@link android.app.AppOpsManager.UidState}
*/
void addUidStateChangedCallback(@CallbackExecutor Executor executor,
UidStateChangedCallback callback);
/**
* Remove a {@link UidStateChangedCallback}
*/
void removeUidStateChangedCallback(UidStateChangedCallback callback);
interface UidStateChangedCallback {
/**
* Invoked when a UID's {@link android.app.AppOpsManager.UidState} changes.
* @param uid The uid that changed.
* @param uidState The state that was changed to.
* @param foregroundModeMayChange True if there may be a op in MODE_FOREGROUND whose
* evaluated result may have changed.
*/
void onUidStateChanged(int uid, int uidState, boolean foregroundModeMayChange);
}
void dumpUidState(PrintWriter pw, int uid, long nowElapsed);
void dumpEvents(PrintWriter pw);
}