Merge "[Settings] Code refactor for combining TelephonyCallback with Lifecycle" into tm-dev
diff --git a/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapter.java b/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapter.java
new file mode 100644
index 0000000..0fae4f2
--- /dev/null
+++ b/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapter.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.helper;
+
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.Lifecycle;
+
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+/**
+ * A {@link LifecycleCallbackConverter} for supporting the register/unregister work for
+ * {@link TelephonyCallback}.
+ */
+@VisibleForTesting
+public class LifecycleCallbackTelephonyAdapter<T> extends LifecycleCallbackConverter<T> {
+ private static final String TAG = "LifecycleCallbackTelephony";
+
+ private final Runnable mRegisterCallback;
+ private final Runnable mUnRegisterCallback;
+
+ /**
+ * Constructor
+ * @param lifecycle {@link Lifecycle} to monitor
+ * @param telephonyManager {@link TelephonyManager} to interact with
+ * @param telephonyCallback {@link TelephonyCallback}
+ * @param executor {@link Executor} for receiving the notify from telephony framework.
+ * @param resultCallback for the result from {@link TelephonyCallback}
+ */
+ @VisibleForTesting
+ public LifecycleCallbackTelephonyAdapter(@NonNull Lifecycle lifecycle,
+ @NonNull TelephonyManager telephonyManager,
+ @NonNull TelephonyCallback telephonyCallback,
+ Executor executor, @NonNull Consumer<T> resultCallback) {
+ super(lifecycle, resultCallback);
+
+ // Register operation
+ mRegisterCallback = () -> {
+ telephonyManager.registerTelephonyCallback(executor, telephonyCallback);
+ };
+
+ // Un-Register operation
+ mUnRegisterCallback = () -> {
+ telephonyManager.unregisterTelephonyCallback(telephonyCallback);
+ };
+ }
+
+ @Override
+ public void setCallbackActive(boolean isActive) {
+ super.setCallbackActive(isActive);
+ Runnable op = (isActive) ? mRegisterCallback : mUnRegisterCallback;
+ op.run();
+ }
+}
diff --git a/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapterTest.java b/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapterTest.java
new file mode 100644
index 0000000..be940f2
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackTelephonyAdapterTest.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.network.helper;
+
+import static org.mockito.ArgumentMatchers.anyObject;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+@RunWith(AndroidJUnit4.class)
+public class LifecycleCallbackTelephonyAdapterTest implements LifecycleOwner {
+
+ private final LifecycleRegistry mRegistry = LifecycleRegistry.createUnsafe(this);
+
+ @Mock
+ private TelephonyManager mTelMgr;
+
+ private TestCallback mTestCallback;
+ private AtomicReference<Object> mResult;
+ private LifecycleCallbackTelephonyAdapter<Object> mAdapter;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mResult = new AtomicReference<Object>();
+ mTestCallback = new TestCallback();
+
+ doNothing().when(mTelMgr).registerTelephonyCallback(null, mTestCallback);
+ doNothing().when(mTelMgr).unregisterTelephonyCallback(mTestCallback);
+
+ mAdapter = new LifecycleCallbackTelephonyAdapter<Object>(getLifecycle(), mTelMgr,
+ mTestCallback, null, result -> mResult.set(result));
+ }
+
+ public Lifecycle getLifecycle() {
+ return mRegistry;
+ }
+
+ @Test
+ public void telephonyCallback_register_whenActive() {
+ mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+ verify(mTelMgr, never()).registerTelephonyCallback(anyObject(), anyObject());
+
+ mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+ verify(mTelMgr).registerTelephonyCallback(anyObject(), anyObject());
+ }
+
+ @Test
+ public void telephonyCallback_unregister_whenInActive() {
+ mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+ verify(mTelMgr, never()).unregisterTelephonyCallback(anyObject());
+
+ mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+ verify(mTelMgr, never()).unregisterTelephonyCallback(anyObject());
+
+ mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+ verify(mTelMgr).unregisterTelephonyCallback(anyObject());
+
+ mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+ verify(mTelMgr, times(1)).unregisterTelephonyCallback(anyObject());
+ }
+
+ protected static class TestCallback extends TelephonyCallback
+ implements TelephonyCallback.CallStateListener {
+ @Override
+ public void onCallStateChanged(int state) {}
+ }
+}