1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package com.android.server.telecom;
18 
19 import android.content.Context;
20 import android.os.PowerManager;
21 
22 /**
23  * Container for PowerManager / PowerManager.WakeLock access in telecom to facilitate unit testing.
24  */
25 public class TelecomWakeLock {
26 
27     public class WakeLockAdapter {
28 
29         private PowerManager.WakeLock mWakeLock;
30 
WakeLockAdapter(PowerManager.WakeLock wakeLock)31         public WakeLockAdapter(PowerManager.WakeLock wakeLock) {
32             mWakeLock = wakeLock;
33         }
34 
acquire()35         public void acquire() {
36             mWakeLock.acquire();
37         }
38 
isHeld()39         public boolean isHeld() {
40             return mWakeLock.isHeld();
41         }
42 
release(int flags)43         public void release(int flags) {
44             mWakeLock.release(flags);
45         }
46 
setReferenceCounted(boolean isReferencedCounted)47         public void setReferenceCounted(boolean isReferencedCounted){
48             mWakeLock.setReferenceCounted(isReferencedCounted);
49         }
50 
51     }
52 
53     private static final String TAG = "TelecomWakeLock";
54 
55     private Context mContext;
56     private int mWakeLockLevel;
57     private String mWakeLockTag;
58     private WakeLockAdapter mWakeLock;
59 
TelecomWakeLock(Context context, int wakeLockLevel, String wakeLockTag)60     public TelecomWakeLock(Context context, int wakeLockLevel, String wakeLockTag) {
61         mContext = context;
62         mWakeLockLevel = wakeLockLevel;
63         mWakeLockTag = wakeLockTag;
64         mWakeLock = getWakeLockFromPowerManager();
65     }
66 
67     // Used For Testing
TelecomWakeLock(Context context, WakeLockAdapter wakeLockAdapter, int wakeLockLevel, String wakeLockTag)68     public TelecomWakeLock(Context context, WakeLockAdapter wakeLockAdapter, int wakeLockLevel,
69             String wakeLockTag) {
70         mContext = context;
71         mWakeLockLevel = wakeLockLevel;
72         mWakeLockTag = wakeLockTag;
73         mWakeLock = wakeLockAdapter;
74     }
75 
getWakeLockFromPowerManager()76     private WakeLockAdapter getWakeLockFromPowerManager() {
77         PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
78         WakeLockAdapter adapter = null;
79         if(powerManager.isWakeLockLevelSupported(mWakeLockLevel)) {
80             PowerManager.WakeLock wakeLock = powerManager.newWakeLock(mWakeLockLevel, mWakeLockTag);
81             adapter = new WakeLockAdapter(wakeLock);
82         }
83         return adapter;
84     }
85 
isHeld()86     public boolean isHeld() {
87         return mWakeLock != null && mWakeLock.isHeld();
88     }
89 
acquire()90     public void acquire() {
91         if(mWakeLock == null) {
92             Log.i(TAG, "Can not acquire WakeLock (not supported) with level: " + mWakeLockLevel);
93             return;
94         }
95 
96         if (!isHeld()) {
97             mWakeLock.acquire();
98             Log.i(TAG, "Acquiring WakeLock with id: " + mWakeLockLevel);
99         } else {
100             Log.i(TAG, "WakeLock already acquired for id: " + mWakeLockLevel);
101         }
102     }
103 
release(int flags)104     public void release(int flags) {
105         if (mWakeLock == null) {
106             Log.i(TAG, "Can not release WakeLock (not supported) with id: " + mWakeLockLevel);
107             return;
108         }
109 
110         if (isHeld()) {
111             mWakeLock.release(flags);
112             Log.i(TAG, "Releasing WakeLock with id: " + mWakeLockLevel);
113         } else {
114             Log.i(TAG, "WakeLock already released with id: " + mWakeLockLevel);
115         }
116     }
117 
setReferenceCounted(boolean isReferencedCounted)118     public void setReferenceCounted(boolean isReferencedCounted) {
119         if (mWakeLock == null) {
120             return;
121         }
122         mWakeLock.setReferenceCounted(isReferencedCounted);
123     }
124 
125     @Override
toString()126     public String toString() {
127         if(mWakeLock != null) {
128             return mWakeLock.toString();
129         } else {
130             return "null";
131         }
132     }
133 }
134