Merge "Should not decode Wi-Fi QR code after onPause" into qt-dev
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
index fa17f07..d0322b7 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java
@@ -47,6 +47,7 @@
 
 import androidx.annotation.StringRes;
 import androidx.annotation.UiThread;
+import androidx.annotation.VisibleForTesting;
 import androidx.lifecycle.ViewModelProviders;
 
 import com.android.settings.R;
@@ -262,6 +263,24 @@
     }
 
     @Override
+    public void onPause() {
+        if (mCamera != null) {
+            mCamera.stop();
+        }
+
+        super.onPause();
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        if (!isGoingInitiator()) {
+            restartCamera();
+        }
+    }
+
+    @Override
     public int getMetricsCategory() {
         if (mIsConfiguratorMode) {
             return SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR;
@@ -702,4 +721,9 @@
     public void onAccessPointsChanged() {
         // Do nothing.
     }
+
+    @VisibleForTesting
+    protected boolean isDecodeTaskAlive() {
+        return mCamera != null && mCamera.isDecodeTaskAlive();
+    }
 }
diff --git a/src/com/android/settings/wifi/qrcode/QrCamera.java b/src/com/android/settings/wifi/qrcode/QrCamera.java
index 45de6b5..b7d41ba 100644
--- a/src/com/android/settings/wifi/qrcode/QrCamera.java
+++ b/src/com/android/settings/wifi/qrcode/QrCamera.java
@@ -401,4 +401,14 @@
             mScannerCallback.handleSuccessfulResult(qrCode.getText());
         }
     }
+
+    /**
+     * After {@link #start(SurfaceTexture)}, DecodingTask runs continuously to capture images and
+     * decode QR code. DecodingTask become null After {@link #stop()}.
+     *
+     * Uses this method in test case to prevent power consumption problem.
+     */
+    public boolean isDecodeTaskAlive() {
+        return mDecodeTask != null;
+    }
 }
diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java
index 16be216..d633689 100644
--- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java
+++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java
@@ -16,9 +16,16 @@
 
 package com.android.settings.wifi.dpp;
 
+import static com.android.settings.wifi.dpp.WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.app.Instrumentation;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
 
+import androidx.fragment.app.FragmentManager;
+import androidx.test.InstrumentationRegistry;
 import androidx.test.rule.ActivityTestRule;
 import androidx.test.runner.AndroidJUnit4;
 
@@ -38,6 +45,7 @@
         Intent intent = new Intent(WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_SCANNER);
         intent.putExtra(WifiDppUtils.EXTRA_WIFI_SECURITY, "WEP");
         intent.putExtra(WifiDppUtils.EXTRA_WIFI_SSID, "GoogleGuest");
+        intent.putExtra(WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY, "password");
         mActivityRule.launchActivity(intent);
     }
 
@@ -48,4 +56,21 @@
         mActivityRule.getActivity().setRequestedOrientation(
                 ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
     }
+
+    @Test
+    public void onPause_shouldNotDecodeQrCode() {
+        final WifiDppConfiguratorActivity hostActivity =
+                (WifiDppConfiguratorActivity) mActivityRule.getActivity();
+        final FragmentManager fragmentManager = hostActivity.getSupportFragmentManager();
+        final WifiDppQrCodeScannerFragment scannerFragment =
+                (WifiDppQrCodeScannerFragment) fragmentManager
+                .findFragmentByTag(TAG_FRAGMENT_QR_CODE_SCANNER);
+        final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
+
+        instrumentation.runOnMainSync(() -> {
+            instrumentation.callActivityOnPause(hostActivity);
+
+            assertThat(scannerFragment.isDecodeTaskAlive()).isEqualTo(false);
+        });
+    }
 }