128f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan/* 228f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * Copyright (C) 2010, The Android Open Source Project 328f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * 428f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * Licensed under the Apache License, Version 2.0 (the "License"); 528f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * you may not use this file except in compliance with the License. 628f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * You may obtain a copy of the License at 728f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * 828f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * http://www.apache.org/licenses/LICENSE-2.0 928f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * 1028f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * Unless required by applicable law or agreed to in writing, software 1128f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * distributed under the License is distributed on an "AS IS" BASIS, 1228f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1328f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * See the License for the specific language governing permissions and 1428f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan * limitations under the License. 1528f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan */ 1628f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 1728f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyanpackage com.android.server.sip; 1828f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 1928f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyanimport android.os.PowerManager; 2028f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyanimport android.util.Log; 2128f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 2228f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyanimport java.util.HashSet; 2328f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 2428f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyanclass SipWakeLock { 25cb6ee06f62c20ae036a206667097f20b837b11abChia-chi Yeh private static final boolean DEBUG = false; 26cb6ee06f62c20ae036a206667097f20b837b11abChia-chi Yeh private static final String TAG = "SipWakeLock"; 2728f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan private PowerManager mPowerManager; 2828f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan private PowerManager.WakeLock mWakeLock; 2928f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan private PowerManager.WakeLock mTimerWakeLock; 3028f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan private HashSet<Object> mHolders = new HashSet<Object>(); 3128f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 3228f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan SipWakeLock(PowerManager powerManager) { 3328f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mPowerManager = powerManager; 3428f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 3528f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 3628f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan synchronized void reset() { 37cb6ee06f62c20ae036a206667097f20b837b11abChia-chi Yeh if (DEBUG) Log.v(TAG, "reset count=" + mHolders.size()); 3828f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mHolders.clear(); 3928f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan release(null); 4028f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 4128f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 4228f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan synchronized void acquire(long timeout) { 4328f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan if (mTimerWakeLock == null) { 4428f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mTimerWakeLock = mPowerManager.newWakeLock( 4528f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock.timer"); 4628f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mTimerWakeLock.setReferenceCounted(true); 4728f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 4828f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mTimerWakeLock.acquire(timeout); 4928f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 5028f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 5128f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan synchronized void acquire(Object holder) { 5228f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mHolders.add(holder); 5328f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan if (mWakeLock == null) { 5428f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mWakeLock = mPowerManager.newWakeLock( 5528f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan PowerManager.PARTIAL_WAKE_LOCK, "SipWakeLock"); 5628f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 5728f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan if (!mWakeLock.isHeld()) mWakeLock.acquire(); 58cb6ee06f62c20ae036a206667097f20b837b11abChia-chi Yeh if (DEBUG) Log.v(TAG, "acquire count=" + mHolders.size()); 5928f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 6028f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan 6128f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan synchronized void release(Object holder) { 6228f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mHolders.remove(holder); 6328f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan if ((mWakeLock != null) && mHolders.isEmpty() 6428f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan && mWakeLock.isHeld()) { 6528f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan mWakeLock.release(); 6628f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 67cb6ee06f62c20ae036a206667097f20b837b11abChia-chi Yeh if (DEBUG) Log.v(TAG, "release count=" + mHolders.size()); 6828f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan } 6928f63c06894b9ca9252f43bc54a098c0a785d4b4Hung-ying Tyan} 70