Migrate WakeLocks to Kotlin
bug: 209145335
Test: N/A
Change-Id: I70f530d8ca6a7e6cb6e3edbf17fdf61122dd2230
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.kt b/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.kt
index 652cef9..169ccf1 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/utils/WakeLocks.kt
@@ -13,86 +13,60 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+@file:JvmName("WakeLocks")
-package androidx.work.impl.utils;
+package androidx.work.impl.utils
-import static android.os.PowerManager.PARTIAL_WAKE_LOCK;
+import android.content.Context
+import android.os.PowerManager
+import androidx.work.Logger
+import java.util.WeakHashMap
-import android.content.Context;
-import android.os.PowerManager;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RestrictTo;
-import androidx.work.Logger;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.WeakHashMap;
+private val TAG = Logger.tagWithPrefix("WakeLocks")
/**
- * A common class for creating WakeLocks.
+ * Creates and returns a new WakeLock.
*
- * @hide
+ * @param context The context from which to get the PowerManager
+ * @param tag A descriptive tag for the WakeLock; this method will prefix "WorkManager: " to it
+ * @return A new [android.os.PowerManager.WakeLock]
*/
-@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public class WakeLocks {
+internal fun newWakeLock(context: Context, tag: String): PowerManager.WakeLock {
+ val powerManager = context.applicationContext
+ .getSystemService(Context.POWER_SERVICE) as PowerManager
+ val tagWithPrefix = "WorkManager: $tag"
+ val wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, tagWithPrefix)
+ // Wakelocks are created on the command processor thread, but we check if they are still
+ // being held on the main thread.
+ synchronized(WakeLocksHolder) {
+ WakeLocksHolder.wakeLocks.put(wakeLock, tagWithPrefix)
+ }
+ return wakeLock
+}
- private static final String TAG = Logger.tagWithPrefix("WakeLocks");
-
- private static final WeakHashMap<PowerManager.WakeLock, String> sWakeLocks =
- new WeakHashMap<>();
-
- /**
- * Creates and returns a new WakeLock.
- *
- * @param context The context from which to get the PowerManager
- * @param tag A descriptive tag for the WakeLock; this method will prefix "WorkManager: "
- * to it
- * @return A new {@link android.os.PowerManager.WakeLock}
- */
- public static PowerManager.WakeLock newWakeLock(
- @NonNull Context context,
- @NonNull String tag) {
- PowerManager powerManager = (PowerManager) context.getApplicationContext()
- .getSystemService(Context.POWER_SERVICE);
-
- String tagWithPrefix = "WorkManager: " + tag;
- PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PARTIAL_WAKE_LOCK, tagWithPrefix);
- // Wakelocks are created on the command processor thread, but we check if they are still
- // being held on the main thread.
- synchronized (sWakeLocks) {
- sWakeLocks.put(wakeLock, tagWithPrefix);
- }
- return wakeLock;
+/**
+ * Checks to see if there are any [PowerManager.WakeLock]s that
+ * [androidx.work.impl.background.systemalarm.SystemAlarmService] holds when all the
+ * pending commands have been drained in the command queue.
+ */
+fun checkWakeLocks() {
+ // There is a small chance that while we are checking if all the commands in the queue are
+ // drained and wake locks are no longer being held, a new command comes along and we end up
+ // with a ConcurrentModificationException. The addition of commands happens on the command
+ // processor thread and this check is done on the main thread.
+ val wakeLocksCopy = mutableMapOf<PowerManager.WakeLock?, String>()
+ synchronized(WakeLocksHolder) {
+ // Copy the WakeLocks - otherwise we can get a ConcurrentModificationException if the
+ // garbage collector kicks in and ends up removing something from the master copy while
+ // we are iterating over it.
+ wakeLocksCopy.putAll(WakeLocksHolder.wakeLocks)
}
- /**
- * Checks to see if there are any {@link PowerManager.WakeLock}s that
- * {@link androidx.work.impl.background.systemalarm.SystemAlarmService} holds when all the
- * pending commands have been drained in the command queue.
- */
- public static void checkWakeLocks() {
- // There is a small chance that while we are checking if all the commands in the queue are
- // drained and wake locks are no longer being held, a new command comes along and we end up
- // with a ConcurrentModificationException. The addition of commands happens on the command
- // processor thread and this check is done on the main thread.
-
- Map<PowerManager.WakeLock, String> wakeLocksCopy = new HashMap<>();
- synchronized (sWakeLocks) {
- // Copy the WakeLocks - otherwise we can get a ConcurrentModificationException if the
- // garbage collector kicks in and ends up removing something from the master copy while
- // we are iterating over it.
- wakeLocksCopy.putAll(sWakeLocks);
- }
-
- for (PowerManager.WakeLock wakeLock : wakeLocksCopy.keySet()) {
- if (wakeLock != null && wakeLock.isHeld()) {
- String message = "WakeLock held for " + wakeLocksCopy.get(wakeLock);
- Logger.get().warning(TAG, message);
- }
- }
- }
-
- private WakeLocks() {
+ wakeLocksCopy.forEach { (wakeLock, tag) ->
+ if (wakeLock?.isHeld == true) Logger.get().warning(TAG, "WakeLock held for $tag")
}
}
+
+private object WakeLocksHolder {
+ val wakeLocks = WeakHashMap<PowerManager.WakeLock, String>()
+}
\ No newline at end of file