1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <mutex>
18*38e8c45fSAndroid Build Coastguard Worker #include <unistd.h>
19*38e8c45fSAndroid Build Coastguard Worker
20*38e8c45fSAndroid Build Coastguard Worker #include <android/permission_manager.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/ActivityManager.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/Binder.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <binder/ProcessState.h>
25*38e8c45fSAndroid Build Coastguard Worker
26*38e8c45fSAndroid Build Coastguard Worker namespace android {
27*38e8c45fSAndroid Build Coastguard Worker
28*38e8c45fSAndroid Build Coastguard Worker using namespace std::chrono_literals;
29*38e8c45fSAndroid Build Coastguard Worker
ActivityManager()30*38e8c45fSAndroid Build Coastguard Worker ActivityManager::ActivityManager()
31*38e8c45fSAndroid Build Coastguard Worker {
32*38e8c45fSAndroid Build Coastguard Worker }
33*38e8c45fSAndroid Build Coastguard Worker
getService()34*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> ActivityManager::getService()
35*38e8c45fSAndroid Build Coastguard Worker {
36*38e8c45fSAndroid Build Coastguard Worker std::lock_guard<Mutex> scoped_lock(mLock);
37*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = mService;
38*38e8c45fSAndroid Build Coastguard Worker if (ProcessState::self()->isThreadPoolStarted()) {
39*38e8c45fSAndroid Build Coastguard Worker if (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) {
40*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = defaultServiceManager()->waitForService(String16("activity"));
41*38e8c45fSAndroid Build Coastguard Worker service = interface_cast<IActivityManager>(binder);
42*38e8c45fSAndroid Build Coastguard Worker mService = service;
43*38e8c45fSAndroid Build Coastguard Worker }
44*38e8c45fSAndroid Build Coastguard Worker } else {
45*38e8c45fSAndroid Build Coastguard Worker ALOGI("Thread pool not started. Polling for activity service.");
46*38e8c45fSAndroid Build Coastguard Worker auto startTime = std::chrono::steady_clock::now().min();
47*38e8c45fSAndroid Build Coastguard Worker while (service == nullptr || !IInterface::asBinder(service)->isBinderAlive()) {
48*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> binder = defaultServiceManager()->checkService(String16("activity"));
49*38e8c45fSAndroid Build Coastguard Worker if (binder == nullptr) {
50*38e8c45fSAndroid Build Coastguard Worker // Wait for the activity service to come back...
51*38e8c45fSAndroid Build Coastguard Worker if (startTime == startTime.min()) {
52*38e8c45fSAndroid Build Coastguard Worker startTime = std::chrono::steady_clock::now();
53*38e8c45fSAndroid Build Coastguard Worker ALOGI("Waiting for activity service");
54*38e8c45fSAndroid Build Coastguard Worker } else if (std::chrono::steady_clock::now() - startTime > 1000s) {
55*38e8c45fSAndroid Build Coastguard Worker // TODO(b/342453147): timeout of 1000s = 16min and 40s doesn't seem intended
56*38e8c45fSAndroid Build Coastguard Worker ALOGW("Waiting too long for activity service, giving up");
57*38e8c45fSAndroid Build Coastguard Worker service = nullptr;
58*38e8c45fSAndroid Build Coastguard Worker break;
59*38e8c45fSAndroid Build Coastguard Worker }
60*38e8c45fSAndroid Build Coastguard Worker usleep(25000);
61*38e8c45fSAndroid Build Coastguard Worker } else {
62*38e8c45fSAndroid Build Coastguard Worker service = interface_cast<IActivityManager>(binder);
63*38e8c45fSAndroid Build Coastguard Worker mService = service;
64*38e8c45fSAndroid Build Coastguard Worker }
65*38e8c45fSAndroid Build Coastguard Worker }
66*38e8c45fSAndroid Build Coastguard Worker }
67*38e8c45fSAndroid Build Coastguard Worker return mService;
68*38e8c45fSAndroid Build Coastguard Worker }
69*38e8c45fSAndroid Build Coastguard Worker
openContentUri(const String16 & stringUri)70*38e8c45fSAndroid Build Coastguard Worker int ActivityManager::openContentUri(const String16& stringUri)
71*38e8c45fSAndroid Build Coastguard Worker {
72*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
73*38e8c45fSAndroid Build Coastguard Worker return service != nullptr ? service->openContentUri(stringUri) : -1;
74*38e8c45fSAndroid Build Coastguard Worker }
75*38e8c45fSAndroid Build Coastguard Worker
registerUidObserver(const sp<IUidObserver> & observer,const int32_t event,const int32_t cutpoint,const String16 & callingPackage)76*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::registerUidObserver(const sp<IUidObserver>& observer,
77*38e8c45fSAndroid Build Coastguard Worker const int32_t event,
78*38e8c45fSAndroid Build Coastguard Worker const int32_t cutpoint,
79*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage)
80*38e8c45fSAndroid Build Coastguard Worker {
81*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
82*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
83*38e8c45fSAndroid Build Coastguard Worker return service->registerUidObserver(observer, event, cutpoint, callingPackage);
84*38e8c45fSAndroid Build Coastguard Worker }
85*38e8c45fSAndroid Build Coastguard Worker // ActivityManagerService appears dead. Return usual error code for dead service.
86*38e8c45fSAndroid Build Coastguard Worker return DEAD_OBJECT;
87*38e8c45fSAndroid Build Coastguard Worker }
88*38e8c45fSAndroid Build Coastguard Worker
registerUidObserverForUids(const sp<IUidObserver> & observer,const int32_t event,const int32_t cutpoint,const String16 & callingPackage,const int32_t uids[],size_t nUids,sp<IBinder> & observerToken)89*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::registerUidObserverForUids(const sp<IUidObserver>& observer,
90*38e8c45fSAndroid Build Coastguard Worker const int32_t event, const int32_t cutpoint,
91*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage,
92*38e8c45fSAndroid Build Coastguard Worker const int32_t uids[], size_t nUids,
93*38e8c45fSAndroid Build Coastguard Worker /*out*/ sp<IBinder>& observerToken) {
94*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
95*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
96*38e8c45fSAndroid Build Coastguard Worker return service->registerUidObserverForUids(observer, event, cutpoint, callingPackage, uids,
97*38e8c45fSAndroid Build Coastguard Worker nUids, observerToken);
98*38e8c45fSAndroid Build Coastguard Worker }
99*38e8c45fSAndroid Build Coastguard Worker // ActivityManagerService appears dead. Return usual error code for dead service.
100*38e8c45fSAndroid Build Coastguard Worker return DEAD_OBJECT;
101*38e8c45fSAndroid Build Coastguard Worker }
102*38e8c45fSAndroid Build Coastguard Worker
unregisterUidObserver(const sp<IUidObserver> & observer)103*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::unregisterUidObserver(const sp<IUidObserver>& observer)
104*38e8c45fSAndroid Build Coastguard Worker {
105*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
106*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
107*38e8c45fSAndroid Build Coastguard Worker return service->unregisterUidObserver(observer);
108*38e8c45fSAndroid Build Coastguard Worker }
109*38e8c45fSAndroid Build Coastguard Worker // ActivityManagerService appears dead. Return usual error code for dead service.
110*38e8c45fSAndroid Build Coastguard Worker return DEAD_OBJECT;
111*38e8c45fSAndroid Build Coastguard Worker }
112*38e8c45fSAndroid Build Coastguard Worker
addUidToObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)113*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::addUidToObserver(const sp<IBinder>& observerToken,
114*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage, int32_t uid) {
115*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
116*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
117*38e8c45fSAndroid Build Coastguard Worker return service->addUidToObserver(observerToken, callingPackage, uid);
118*38e8c45fSAndroid Build Coastguard Worker }
119*38e8c45fSAndroid Build Coastguard Worker // ActivityManagerService appears dead. Return usual error code for dead service.
120*38e8c45fSAndroid Build Coastguard Worker return DEAD_OBJECT;
121*38e8c45fSAndroid Build Coastguard Worker }
122*38e8c45fSAndroid Build Coastguard Worker
removeUidFromObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)123*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::removeUidFromObserver(const sp<IBinder>& observerToken,
124*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage, int32_t uid) {
125*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
126*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
127*38e8c45fSAndroid Build Coastguard Worker return service->removeUidFromObserver(observerToken, callingPackage, uid);
128*38e8c45fSAndroid Build Coastguard Worker }
129*38e8c45fSAndroid Build Coastguard Worker // ActivityManagerService appears dead. Return usual error code for dead service.
130*38e8c45fSAndroid Build Coastguard Worker return DEAD_OBJECT;
131*38e8c45fSAndroid Build Coastguard Worker }
132*38e8c45fSAndroid Build Coastguard Worker
isUidActive(const uid_t uid,const String16 & callingPackage)133*38e8c45fSAndroid Build Coastguard Worker bool ActivityManager::isUidActive(const uid_t uid, const String16& callingPackage)
134*38e8c45fSAndroid Build Coastguard Worker {
135*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
136*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
137*38e8c45fSAndroid Build Coastguard Worker return service->isUidActive(uid, callingPackage);
138*38e8c45fSAndroid Build Coastguard Worker }
139*38e8c45fSAndroid Build Coastguard Worker return false;
140*38e8c45fSAndroid Build Coastguard Worker }
141*38e8c45fSAndroid Build Coastguard Worker
getUidProcessState(const uid_t uid,const String16 & callingPackage)142*38e8c45fSAndroid Build Coastguard Worker int32_t ActivityManager::getUidProcessState(const uid_t uid, const String16& callingPackage)
143*38e8c45fSAndroid Build Coastguard Worker {
144*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
145*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
146*38e8c45fSAndroid Build Coastguard Worker return service->getUidProcessState(uid, callingPackage);
147*38e8c45fSAndroid Build Coastguard Worker }
148*38e8c45fSAndroid Build Coastguard Worker return PROCESS_STATE_UNKNOWN;
149*38e8c45fSAndroid Build Coastguard Worker }
150*38e8c45fSAndroid Build Coastguard Worker
checkPermission(const String16 & permission,const pid_t pid,const uid_t uid,int32_t * outResult)151*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::checkPermission(const String16& permission,
152*38e8c45fSAndroid Build Coastguard Worker const pid_t pid,
153*38e8c45fSAndroid Build Coastguard Worker const uid_t uid,
154*38e8c45fSAndroid Build Coastguard Worker int32_t* outResult) {
155*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
156*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
157*38e8c45fSAndroid Build Coastguard Worker return service->checkPermission(permission, pid, uid, outResult);
158*38e8c45fSAndroid Build Coastguard Worker }
159*38e8c45fSAndroid Build Coastguard Worker // ActivityManagerService appears dead. Return usual error code for dead service.
160*38e8c45fSAndroid Build Coastguard Worker return DEAD_OBJECT;
161*38e8c45fSAndroid Build Coastguard Worker }
162*38e8c45fSAndroid Build Coastguard Worker
linkToDeath(const sp<IBinder::DeathRecipient> & recipient)163*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::linkToDeath(const sp<IBinder::DeathRecipient>& recipient) {
164*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
165*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
166*38e8c45fSAndroid Build Coastguard Worker return IInterface::asBinder(service)->linkToDeath(recipient);
167*38e8c45fSAndroid Build Coastguard Worker }
168*38e8c45fSAndroid Build Coastguard Worker return INVALID_OPERATION;
169*38e8c45fSAndroid Build Coastguard Worker }
170*38e8c45fSAndroid Build Coastguard Worker
unlinkToDeath(const sp<IBinder::DeathRecipient> & recipient)171*38e8c45fSAndroid Build Coastguard Worker status_t ActivityManager::unlinkToDeath(const sp<IBinder::DeathRecipient>& recipient) {
172*38e8c45fSAndroid Build Coastguard Worker sp<IActivityManager> service = getService();
173*38e8c45fSAndroid Build Coastguard Worker if (service != nullptr) {
174*38e8c45fSAndroid Build Coastguard Worker return IInterface::asBinder(service)->unlinkToDeath(recipient);
175*38e8c45fSAndroid Build Coastguard Worker }
176*38e8c45fSAndroid Build Coastguard Worker return INVALID_OPERATION;
177*38e8c45fSAndroid Build Coastguard Worker }
178*38e8c45fSAndroid Build Coastguard Worker
179*38e8c45fSAndroid Build Coastguard Worker } // namespace android
180