Retrieve WifiDppQrGeneratorFragment at runtime.

* Add getWifiDppQrCodeGeneratorFragment() in WifiFeatureProvider
* WifiDppConfiguratorActivity calls from the FeatureFactory to get WifiDppQrCodeGeneratorFragment instance
* Use a flag to guard this behaviour
* Updated a few private variables of WifiDppQrCodeGeneratorFragment to
  protected so I can access them in derived classes.

Bug: b/338891273
Settings Intake: b/329012096

Test: manual test, override the flag locally, and check I can switch to
overriden implementation.
Flag: com.android.settings.flags.enable_wifi_sharing_runtime_fragment

Change-Id: I715bf89bd9be221f06914e87629c76bf7a2f743f
diff --git a/aconfig/settings_wifi_flag_declarations.aconfig b/aconfig/settings_wifi_flag_declarations.aconfig
new file mode 100644
index 0000000..cb8007f
--- /dev/null
+++ b/aconfig/settings_wifi_flag_declarations.aconfig
@@ -0,0 +1,12 @@
+package: "com.android.settings.flags"
+container: "system_ext"
+
+# NOTE: Keep alphabetized to help limit merge conflicts from multiple simultaneous editors.
+
+flag {
+    name: "enable_wifi_sharing_runtime_fragment"
+    namespace: "prism_qr"
+    description: "Use WifiFeatureProvider to get the instance of WifiDppQrCodeGeneratorFragment."
+    bug: "329012096"
+}
+
diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
index a7527d7..c7ad9ca 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java
@@ -35,6 +35,8 @@
 import androidx.fragment.app.FragmentTransaction;
 
 import com.android.settings.R;
+import com.android.settings.flags.Flags;
+import com.android.settings.overlay.FeatureFactory;
 
 import java.util.List;
 
@@ -236,7 +238,12 @@
                         WifiDppUtils.TAG_FRAGMENT_QR_CODE_GENERATOR);
 
         if (fragment == null) {
-            fragment = new WifiDppQrCodeGeneratorFragment();
+            if (Flags.enableWifiSharingRuntimeFragment()) {
+                fragment = FeatureFactory.getFeatureFactory().getWifiFeatureProvider()
+                    .getWifiDppQrCodeGeneratorFragment();
+            } else {
+                fragment = new WifiDppQrCodeGeneratorFragment();
+            }
         } else {
             if (fragment.isVisible()) {
                 return;
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
index 3d437e2..1213b0d 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
@@ -56,7 +56,7 @@
     private static final String TAG = "WifiDppQrCodeGeneratorFragment";
 
     private ImageView mQrCodeView;
-    private String mQrCode;
+    protected String mQrCode;
 
     private static final String CHIP_LABEL_METADATA_KEY = "android.service.chooser.chip_label";
     private static final String CHIP_ICON_METADATA_KEY = "android.service.chooser.chip_icon";
@@ -258,7 +258,7 @@
         return button;
     }
 
-    private void setQrCode() {
+    protected void setQrCode() {
         try {
             final int qrcodeSize = getContext().getResources().getDimensionPixelSize(
                     R.dimen.qrcode_size);
diff --git a/src/com/android/settings/wifi/factory/WifiFeatureProvider.java b/src/com/android/settings/wifi/factory/WifiFeatureProvider.java
index 5ab899a..e5bf81a 100644
--- a/src/com/android/settings/wifi/factory/WifiFeatureProvider.java
+++ b/src/com/android/settings/wifi/factory/WifiFeatureProvider.java
@@ -27,6 +27,7 @@
 import androidx.lifecycle.ViewModelStoreOwner;
 
 import com.android.settings.wifi.details.WifiNetworkDetailsViewModel;
+import com.android.settings.wifi.dpp.WifiDppQrCodeGeneratorFragment;
 import com.android.settings.wifi.repository.SharedConnectivityRepository;
 import com.android.settings.wifi.repository.WifiHotspotRepository;
 import com.android.settings.wifi.tether.WifiHotspotSecurityViewModel;
@@ -147,6 +148,15 @@
     }
 
     /**
+     * Gets an instance of WifiDppQrCodeGeneratorFragment
+     */
+    public WifiDppQrCodeGeneratorFragment getWifiDppQrCodeGeneratorFragment() {
+        WifiDppQrCodeGeneratorFragment fragment = new WifiDppQrCodeGeneratorFragment();
+        verboseLog(TAG, "getWifiDppQrCodeGeneratorFragment():" + fragment);
+        return fragment;
+    }
+
+    /**
      * Send a {@link Log#VERBOSE} log message.
      *
      * @param tag Used to identify the source of a log message.  It usually identifies