135d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang/*
235d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * Copyright (C) 2015 The Android Open Source Project
335d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang *
435d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * Licensed under the Apache License, Version 2.0 (the "License");
535d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * you may not use this file except in compliance with the License.
635d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * You may obtain a copy of the License at
735d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang *
835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang *      http://www.apache.org/licenses/LICENSE-2.0
935d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang *
1035d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * Unless required by applicable law or agreed to in writing, software
1135d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * distributed under the License is distributed on an "AS IS" BASIS,
1235d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1335d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * See the License for the specific language governing permissions and
1435d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang * limitations under the License.
1535d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang */
1635d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
1735d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang#ifndef A_WAKELOCK_H_
1835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang#define A_WAKELOCK_H_
1935d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
2035d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang#include <media/stagefright/foundation/ABase.h>
2135d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang#include <powermanager/IPowerManager.h>
2235d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang#include <utils/RefBase.h>
2335d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
2435d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiangnamespace android {
2535d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
2635d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiangclass AWakeLock : public RefBase {
2735d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
2835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiangpublic:
2935d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    AWakeLock();
3035d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
3135d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    // NOTE: acquire and release are not thread safe
3235d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
3335d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    // returns true if wakelock was acquired
3435d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    bool acquire();
3535d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    void release(bool force = false);
3635d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
3735d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    virtual ~AWakeLock();
3835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
3935d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiangprivate:
4035d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    sp<IPowerManager> mPowerManager;
4135d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    sp<IBinder>       mWakeLockToken;
4235d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    uint32_t          mWakeLockCount;
4335d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
4435d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    class PMDeathRecipient : public IBinder::DeathRecipient {
4535d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    public:
4640d8899f60c5212af9d727ba0ffaaecf676ebd1dChih-Hung Hsieh        explicit PMDeathRecipient(AWakeLock *wakeLock) : mWakeLock(wakeLock) {}
4735d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang        virtual ~PMDeathRecipient() {}
4835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
4935d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang        // IBinder::DeathRecipient
5035d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang        virtual void binderDied(const wp<IBinder> &who);
5135d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
5235d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    private:
5335d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang        PMDeathRecipient(const PMDeathRecipient&);
5435d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang        PMDeathRecipient& operator= (const PMDeathRecipient&);
5535d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
5635d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang        AWakeLock *mWakeLock;
5735d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    };
5835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
5935d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    const sp<PMDeathRecipient> mDeathRecipient;
6035d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
6135d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    void clearPowerManager();
6235d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
6335d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang    DISALLOW_EVIL_CONSTRUCTORS(AWakeLock);
6435d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang};
6535d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
6635d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang}  // namespace android
6735d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang
6835d5af131c9d4962e935082f204ccd6a2130861cWeiyin Jiang#endif  // A_WAKELOCK_H_
69