1acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan/*
2acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * Copyright (C) 2010, The Android Open Source Project
3acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan *
4acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License");
5acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * you may not use this file except in compliance with the License.
6acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * You may obtain a copy of the License at
7acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan *
8acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan *     http://www.apache.org/licenses/LICENSE-2.0
9acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan *
10acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * Unless required by applicable law or agreed to in writing, software
11acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS,
12acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * See the License for the specific language governing permissions and
14acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan * limitations under the License.
15acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan */
16acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
17acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyanpackage com.android.server.sip;
18acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
19acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyanimport android.os.PowerManager;
209329db04f13480ccdff013dcc00cdb96f12a921cWink Savilleimport android.telephony.Rlog;
21acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
22acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyanimport java.util.HashSet;
23acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
24acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyanclass SipWakeLock {
2585caf063c027ba0d1defeaff8850e12b6428c4f7Chia-chi Yeh    private static final String TAG = "SipWakeLock";
269329db04f13480ccdff013dcc00cdb96f12a921cWink Saville    private static final boolean DBG = false;
27acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    private PowerManager mPowerManager;
28acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    private PowerManager.WakeLock mWakeLock;
29acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    private PowerManager.WakeLock mTimerWakeLock;
30acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    private HashSet<Object> mHolders = new HashSet<Object>();
31acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
32acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    SipWakeLock(PowerManager powerManager) {
33acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        mPowerManager = powerManager;
34acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    }
35acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
36acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    synchronized void reset() {
379329db04f13480ccdff013dcc00cdb96f12a921cWink Saville        if (DBG) log("reset count=" + mHolders.size());
38acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        mHolders.clear();
39acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        release(null);
40acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    }
41acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
42acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    synchronized void acquire(long timeout) {
43acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        if (mTimerWakeLock == null) {
44acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan            mTimerWakeLock = mPowerManager.newWakeLock(
45acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan                    PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock.timer");
46acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan            mTimerWakeLock.setReferenceCounted(true);
47acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        }
48acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        mTimerWakeLock.acquire(timeout);
49acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    }
50acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
51acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    synchronized void acquire(Object holder) {
52acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        mHolders.add(holder);
53acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        if (mWakeLock == null) {
54acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan            mWakeLock = mPowerManager.newWakeLock(
55acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan                    PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock");
56acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        }
57acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        if (!mWakeLock.isHeld()) mWakeLock.acquire();
589329db04f13480ccdff013dcc00cdb96f12a921cWink Saville        if (DBG) log("acquire count=" + mHolders.size());
59acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    }
60acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan
61acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    synchronized void release(Object holder) {
62acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        mHolders.remove(holder);
63acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        if ((mWakeLock != null) && mHolders.isEmpty()
64acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan                && mWakeLock.isHeld()) {
65acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan            mWakeLock.release();
66acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan        }
679329db04f13480ccdff013dcc00cdb96f12a921cWink Saville        if (DBG) log("release count=" + mHolders.size());
689329db04f13480ccdff013dcc00cdb96f12a921cWink Saville    }
699329db04f13480ccdff013dcc00cdb96f12a921cWink Saville
709329db04f13480ccdff013dcc00cdb96f12a921cWink Saville    private void log(String s) {
719329db04f13480ccdff013dcc00cdb96f12a921cWink Saville        Rlog.d(TAG, s);
72acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan    }
73acedadc1967457ac2f8981c67f884fd8c0ee853cHung-ying Tyan}
74