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 import android.telecom.Log;
22 
23 /**
24  * Container for PowerManager / PowerManager.WakeLock access in telecom to facilitate unit testing.
25  */
26 public class TelecomWakeLock {
27 
28     public class WakeLockAdapter {
29 
30         private PowerManager.WakeLock mWakeLock;
31 
WakeLockAdapter(PowerManager.WakeLock wakeLock)32         public WakeLockAdapter(PowerManager.WakeLock wakeLock) {
33             mWakeLock = wakeLock;
34         }
35 
acquire()36         public void acquire() {
37             mWakeLock.acquire();
38         }
39 
isHeld()40         public boolean isHeld() {
41             return mWakeLock.isHeld();
42         }
43 
release(int flags)44         public void release(int flags) {
45             mWakeLock.release(flags);
46         }
47 
setReferenceCounted(boolean isReferencedCounted)48         public void setReferenceCounted(boolean isReferencedCounted){
49             mWakeLock.setReferenceCounted(isReferencedCounted);
50         }
51 
52     }
53 
54     private static final String TAG = "TelecomWakeLock";
55 
56     private Context mContext;
57     private int mWakeLockLevel;
58     private String mWakeLockTag;
59     private WakeLockAdapter mWakeLock;
60 
TelecomWakeLock(Context context, int wakeLockLevel, String wakeLockTag)61     public TelecomWakeLock(Context context, int wakeLockLevel, String wakeLockTag) {
62         mContext = context;
63         mWakeLockLevel = wakeLockLevel;
64         mWakeLockTag = wakeLockTag;
65         mWakeLock = getWakeLockFromPowerManager();
66     }
67 
68     // Used For Testing
TelecomWakeLock(Context context, WakeLockAdapter wakeLockAdapter, int wakeLockLevel, String wakeLockTag)69     public TelecomWakeLock(Context context, WakeLockAdapter wakeLockAdapter, int wakeLockLevel,
70             String wakeLockTag) {
71         mContext = context;
72         mWakeLockLevel = wakeLockLevel;
73         mWakeLockTag = wakeLockTag;
74         mWakeLock = wakeLockAdapter;
75     }
76 
getWakeLockFromPowerManager()77     private WakeLockAdapter getWakeLockFromPowerManager() {
78         PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
79         WakeLockAdapter adapter = null;
80         if(powerManager.isWakeLockLevelSupported(mWakeLockLevel)) {
81             PowerManager.WakeLock wakeLock = powerManager.newWakeLock(mWakeLockLevel, mWakeLockTag);
82             adapter = new WakeLockAdapter(wakeLock);
83         }
84         return adapter;
85     }
86 
isHeld()87     public boolean isHeld() {
88         return mWakeLock != null && mWakeLock.isHeld();
89     }
90 
acquire()91     public void acquire() {
92         if(mWakeLock == null) {
93             Log.i(TAG, "Can not acquire WakeLock (not supported) with level: " + mWakeLockLevel);
94             return;
95         }
96 
97         if (!isHeld()) {
98             mWakeLock.acquire();
99             Log.i(TAG, "Acquiring WakeLock with id: " + mWakeLockLevel);
100         } else {
101             Log.i(TAG, "WakeLock already acquired for id: " + mWakeLockLevel);
102         }
103     }
104 
release(int flags)105     public void release(int flags) {
106         if (mWakeLock == null) {
107             Log.i(TAG, "Can not release WakeLock (not supported) with id: " + mWakeLockLevel);
108             return;
109         }
110 
111         if (isHeld()) {
112             mWakeLock.release(flags);
113             Log.i(TAG, "Releasing WakeLock with id: " + mWakeLockLevel);
114         } else {
115             Log.i(TAG, "WakeLock already released with id: " + mWakeLockLevel);
116         }
117     }
118 
setReferenceCounted(boolean isReferencedCounted)119     public void setReferenceCounted(boolean isReferencedCounted) {
120         if (mWakeLock == null) {
121             return;
122         }
123         mWakeLock.setReferenceCounted(isReferencedCounted);
124     }
125 
126     @Override
toString()127     public String toString() {
128         if(mWakeLock != null) {
129             return mWakeLock.toString();
130         } else {
131             return "null";
132         }
133     }
134 }
135