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