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