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