16ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka/*
26ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * Copyright (C) 2016 The Android Open Source Project
36ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka *
46ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * Licensed under the Apache License, Version 2.0 (the "License");
56ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * you may not use this file except in compliance with the License.
66ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * You may obtain a copy of the License at
76ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka *
86ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka *      http://www.apache.org/licenses/LICENSE-2.0
96ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka *
106ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * Unless required by applicable law or agreed to in writing, software
116ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * distributed under the License is distributed on an "AS IS" BASIS,
126ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * See the License for the specific language governing permissions and
146ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka * limitations under the License.
156ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka */
166ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
17ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich#include <unistd.h>
18ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich#include <fcntl.h>
19ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich
206ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka#include <binder/IActivityManager.h>
216ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
226ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka#include <binder/Parcel.h>
236ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
246ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shankanamespace android {
256ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
266ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka// ------------------------------------------------------------------------------------
276ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
286ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shankaclass BpActivityManager : public BpInterface<IActivityManager>
296ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka{
306ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shankapublic:
316ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka    explicit BpActivityManager(const sp<IBinder>& impl)
326ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        : BpInterface<IActivityManager>(impl)
336ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka    {
346ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka    }
356ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
366ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka    virtual int openContentUri(const String16& stringUri)
376ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka    {
386ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        Parcel data, reply;
39ff81a09e19017ae1c26eecda6423e20c5a8333f6Sudheer Shanka        data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
406ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        data.writeString16(stringUri);
416ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        status_t ret = remote()->transact(OPEN_CONTENT_URI_TRANSACTION, data, & reply);
426ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        int fd = -1;
436ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        if (ret == NO_ERROR) {
446ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka            int32_t exceptionCode = reply.readExceptionCode();
456ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka            if (!exceptionCode) {
466ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka                // Success is indicated here by a nonzero int followed by the fd;
476ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka                // failure by a zero int with no data following.
486ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka                if (reply.readInt32() != 0) {
49ec9ec7d55c63f791ab3ed9221e68d6215f7b928aNick Kralevich                    fd = fcntl(reply.readParcelFileDescriptor(), F_DUPFD_CLOEXEC, 0);
506ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka                }
516ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka            } else {
526ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka                // An exception was thrown back; fall through to return failure
536ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka                ALOGD("openContentUri(%s) caught exception %d\n",
546ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka                        String8(stringUri).string(), exceptionCode);
556ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka            }
566ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        }
576ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka        return fd;
586ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka    }
594d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
604d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    virtual void registerUidObserver(const sp<IUidObserver>& observer,
614d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran                                     const int32_t event,
624d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran                                     const int32_t cutpoint,
634d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran                                     const String16& callingPackage)
644d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    {
654d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         Parcel data, reply;
664d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
674d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         data.writeStrongBinder(IInterface::asBinder(observer));
684d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         data.writeInt32(event);
694d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         data.writeInt32(cutpoint);
704d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         data.writeString16(callingPackage);
714d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         remote()->transact(REGISTER_UID_OBSERVER_TRANSACTION, data, &reply);
724d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    }
734d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
744d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    virtual void unregisterUidObserver(const sp<IUidObserver>& observer)
754d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    {
764d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         Parcel data, reply;
774d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
784d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         data.writeStrongBinder(IInterface::asBinder(observer));
794d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran         remote()->transact(UNREGISTER_UID_OBSERVER_TRANSACTION, data, &reply);
804d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    }
81fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov
82fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov    virtual bool isUidActive(const uid_t uid, const String16& callingPackage)
83fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov    {
84fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         Parcel data, reply;
85fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
86fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         data.writeInt32(uid);
87fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         data.writeString16(callingPackage);
88fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         remote()->transact(IS_UID_ACTIVE_TRANSACTION, data, &reply);
89fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         // fail on exception
90fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         if (reply.readExceptionCode() != 0) return false;
91fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov         return reply.readInt32() == 1;
92fa851800cf97d1a3d30a7a147877005dc48721ffSvet Ganov    }
936ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka};
946ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
956ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka// ------------------------------------------------------------------------------------
966ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
976ef26f129ce86b50d12ff4e46fae566baf54336dSudheer ShankaIMPLEMENT_META_INTERFACE(ActivityManager, "android.app.IActivityManager");
986ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka
996ef26f129ce86b50d12ff4e46fae566baf54336dSudheer Shanka}; // namespace android
100