diff --git a/src/com/android/settings/network/MobileNetworkSummaryStatus.java b/src/com/android/settings/network/MobileNetworkSummaryStatus.java
deleted file mode 100644
index b22e48e..0000000
--- a/src/com/android/settings/network/MobileNetworkSummaryStatus.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2021 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;
-
-import android.content.Context;
-import android.telephony.SubscriptionManager;
-import android.util.Log;
-
-import com.android.settings.network.SubscriptionUtil;
-import com.android.settings.network.helper.SelectableSubscriptions;
-import com.android.settings.network.helper.SubscriptionAnnotation;
-import com.android.settings.network.helper.SubscriptionGrouping;
-import com.android.settings.network.telephony.MobileNetworkUtils;
-import com.android.settingslib.utils.ThreadUtils;
-
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Future;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-
-/**
- * This one keeps the information required by MobileNetworkSummaryController.
- */
-public class MobileNetworkSummaryStatus {
-    private static final String LOG_TAG = "MobileNetworkSummaryStatus";
-
-    private Future<Map<Integer, CharSequence>> mUniqueNameMapping;
-    private Map<Integer, CharSequence> mUniqueNameMappingCache;
-
-    private Future<Boolean> mIsEuiccConfiguable;
-    private Boolean mIsEuiccConfiguableCache;
-
-    private Future<Boolean> mIsPsimDisableSupported;
-    private Boolean mIsPsimDisableSupportedCache;
-
-    private List<SubscriptionAnnotation> mSubscriptionList;
-
-    private boolean mDisableReEntranceUpdate;
-
-    // Constructor
-    public MobileNetworkSummaryStatus() {}
-
-    /**
-     * Update the status
-     * @param context
-     * @param andThen Consumer which always performed by the end of #update()
-     *                and avoid from repeated queries.
-     */
-    public void update(Context context, Consumer<MobileNetworkSummaryStatus> andThen) {
-        if (mDisableReEntranceUpdate) {
-            Log.d(LOG_TAG, "network summary query ignored");
-            if (andThen != null) {
-                andThen.accept(this);
-            }
-            return;
-        }
-        mDisableReEntranceUpdate = true;
-        Log.d(LOG_TAG, "network summary query");
-
-        // Query Euicc in background
-        mIsEuiccConfiguable = (Future<Boolean>)
-                ThreadUtils.postOnBackgroundThread(() -> isEuiccConfiguable(context));
-
-        // Query display name in background
-        mUniqueNameMapping = (Future<Map<Integer, CharSequence>>)
-                ThreadUtils.postOnBackgroundThread(() -> getUniqueNameForDisplay(context));
-
-        // Query support status of pSIM disable feature
-        mIsPsimDisableSupported = (Future<Boolean>) ThreadUtils.postOnBackgroundThread(()
-                -> isPhysicalSimDisableSupported(context));
-
-        // Query subscription
-        mSubscriptionList = getSubscriptions(context);
-
-        if (andThen != null) {
-            andThen.accept(this);
-        }
-        mDisableReEntranceUpdate = false;
-    }
-
-    /**
-     * Get the subscription information
-     * @return a list of SubscriptionAnnotation
-     */
-    public List<SubscriptionAnnotation> getSubscriptionList() {
-        return mSubscriptionList;
-    }
-
-    /**
-     * Get unique display name for a specific subscription
-     * @param subscriptionId subscription ID
-     * @return display name for that subscription
-     */
-    public CharSequence getDisplayName(int subscriptionId) {
-        if (mUniqueNameMapping != null) {
-            try {
-                mUniqueNameMappingCache = mUniqueNameMapping.get();
-            } catch (Exception exception) {
-                Log.w(LOG_TAG, "Fail to get display names", exception);
-            }
-            mUniqueNameMapping = null;
-        }
-        if (mUniqueNameMappingCache == null) {
-            return null;
-        }
-        return mUniqueNameMappingCache.get(subscriptionId);
-    }
-
-    // Check if Euicc is currently available
-    public boolean isEuiccConfigSupport() {
-        if (mIsEuiccConfiguable != null) {
-            try {
-                mIsEuiccConfiguableCache = mIsEuiccConfiguable.get();
-            } catch (Exception exception) {
-                Log.w(LOG_TAG, "Fail to get euicc config status", exception);
-            }
-            mIsEuiccConfiguable = null;
-        }
-        return (mIsEuiccConfiguableCache == null) ?
-                false : mIsEuiccConfiguableCache.booleanValue();
-    }
-
-    // Check if disable physical SIM is supported
-    public boolean isPhysicalSimDisableSupport() {
-        if (mIsPsimDisableSupported != null) {
-            try {
-                mIsPsimDisableSupportedCache = mIsPsimDisableSupported.get();
-            } catch (Exception exception) {
-                Log.w(LOG_TAG, "Fail to get pSIM disable support", exception);
-            }
-            mIsPsimDisableSupported = null;
-        }
-        return (mIsPsimDisableSupportedCache == null) ?
-                false : mIsPsimDisableSupportedCache.booleanValue();
-    }
-
-    private List<SubscriptionAnnotation> getSubscriptions(Context context) {
-        return (new SelectableSubscriptions(context, true))
-
-                // To maintain the consistency with SubscriptionUtil#getAvailableSubscriptions().
-                .addFinisher(new SubscriptionGrouping())
-
-                .call()
-                .stream()
-                .filter(SubscriptionAnnotation::isDisplayAllowed)
-                .collect(Collectors.toList());
-    }
-
-    private Map<Integer, CharSequence> getUniqueNameForDisplay(Context context) {
-        return SubscriptionUtil.getUniqueSubscriptionDisplayNames(context);
-    }
-
-    private boolean isPhysicalSimDisableSupported(Context context) {
-        SubscriptionManager subMgr = context.getSystemService(SubscriptionManager.class);
-        return SubscriptionUtil.showToggleForPhysicalSim(subMgr);
-    }
-
-    private boolean isEuiccConfiguable(Context context) {
-        return MobileNetworkUtils.showEuiccSettingsDetecting(context);
-    }
-}
diff --git a/src/com/android/settings/network/helper/SubscriptionGrouping.java b/src/com/android/settings/network/helper/SubscriptionGrouping.java
deleted file mode 100644
index c4e0fd7..0000000
--- a/src/com/android/settings/network/helper/SubscriptionGrouping.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2021 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.os.ParcelUuid;
-import android.util.Log;
-
-import androidx.annotation.Keep;
-import androidx.annotation.VisibleForTesting;
-
-import com.android.settings.network.helper.SubscriptionAnnotation;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.UnaryOperator;
-import java.util.stream.Collectors;
-
-/**
- * A UnaryOperator for converting a list of SubscriptionAnnotation into
- * another list of SubscriptionAnnotation based on group UUID.
- * Only one SubscriptionAnnotation with entries with same (valid) group UUID would be kept.
- *
- * Here's an example when applying this operation as a finisher of SelectableSubscriptions:
- *
- * Callable<SubscriptionAnnotation> callable = (new SelectableSubscriptions(context, true))
- *         .addFinisher(new SubscriptionGrouping());
- *
- * List<SubscriptionAnnotation> result = ExecutorService.submit(callable).get()
- */
-public class SubscriptionGrouping
-        implements UnaryOperator<List<SubscriptionAnnotation>> {
-    private static final String LOG_TAG = "SubscriptionGrouping";
-
-    // implementation of UnaryOperator
-    public List<SubscriptionAnnotation> apply(List<SubscriptionAnnotation> listOfSubscriptions) {
-        Log.d(LOG_TAG, "Grouping " + listOfSubscriptions);
-
-        // group by GUID
-        Map<ParcelUuid, List<SubscriptionAnnotation>> groupedSubInfoList =
-                listOfSubscriptions.stream()
-                .filter(Objects::nonNull)
-                .collect(Collectors.groupingBy(subAnno -> getGroupUuid(subAnno)));
-
-        // select best one from subscription(s) within the same group
-        groupedSubInfoList.replaceAll((uuid, annoList) -> {
-            if ((uuid == SubscriptionAnnotation.EMPTY_UUID) || (annoList.size() <= 1)) {
-                return annoList;
-            }
-            return Collections.singletonList(selectBestFromList(annoList));
-        });
-
-        // build a stream of subscriptions
-        return groupedSubInfoList.values()
-                .stream().flatMap(List::stream).collect(Collectors.toList());
-    }
-
-    @Keep
-    @VisibleForTesting
-    protected ParcelUuid getGroupUuid(SubscriptionAnnotation subAnno) {
-        ParcelUuid groupUuid = subAnno.getGroupUuid();
-        return (groupUuid == null) ? SubscriptionAnnotation.EMPTY_UUID : groupUuid;
-    }
-
-    protected SubscriptionAnnotation selectBestFromList(List<SubscriptionAnnotation> annoList) {
-        Comparator<SubscriptionAnnotation> annoSelector = (anno1, anno2) -> {
-            if (anno1.isDisplayAllowed() != anno2.isDisplayAllowed()) {
-                return anno1.isDisplayAllowed() ? -1 : 1;
-            }
-            if (anno1.isActive() != anno2.isActive()) {
-                return anno1.isActive() ? -1 : 1;
-            }
-            if (anno1.isExisted() != anno2.isExisted()) {
-                return anno1.isExisted() ? -1 : 1;
-            }
-            return 0;
-        };
-        annoSelector = annoSelector
-                // eSIM in front of pSIM
-                .thenComparingInt(anno -> -anno.getType())
-                // maintain the ordering given within constructor
-                .thenComparingInt(anno -> annoList.indexOf(anno));
-        return annoList.stream().sorted(annoSelector).findFirst().orElse(null);
-    }
-}
diff --git a/src/com/android/settings/wifi/WifiDialog2.kt b/src/com/android/settings/wifi/WifiDialog2.kt
index a0d215a..2b89e4b 100644
--- a/src/com/android/settings/wifi/WifiDialog2.kt
+++ b/src/com/android/settings/wifi/WifiDialog2.kt
@@ -44,6 +44,7 @@
     @StyleRes style: Int = 0,
     private val hideSubmitButton: Boolean = mode == WifiConfigUiBase2.MODE_VIEW,
     private val hideMeteredAndPrivacy: Boolean = false,
+    private val isSysUiCaller: Boolean = false,
 ) : AlertDialog(context, style), WifiConfigUiBase2, DialogInterface.OnClickListener {
     /**
      * Host UI component of WifiDialog2 can receive callbacks by this interface.
@@ -71,7 +72,9 @@
     override fun getController(): WifiConfigController2 = controller
 
     override fun onCreate(savedInstanceState: Bundle?) {
-        setWindowsOverlay()
+        if (isSysUiCaller) {
+            setWindowsOverlay()
+        }
         view = layoutInflater.inflate(R.layout.wifi_dialog, null)
         setView(view)
         controller = WifiConfigController2(this, view, wifiEntry, mode, hideMeteredAndPrivacy)
diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java
index eb3d88a..951277a 100644
--- a/src/com/android/settings/wifi/WifiDialogActivity.java
+++ b/src/com/android/settings/wifi/WifiDialogActivity.java
@@ -43,6 +43,7 @@
 
 import com.android.settings.R;
 import com.android.settings.SetupWizardUtils;
+import com.android.settings.Utils;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.wifi.dpp.WifiDppUtils;
 import com.android.settingslib.core.lifecycle.ObservableActivity;
@@ -172,7 +173,10 @@
         } else {
             if (mIsWifiTrackerLib) {
                 mDialog2 = new WifiDialog2(this, this,
-                        mNetworkDetailsTracker.getWifiEntry(), WifiConfigUiBase2.MODE_CONNECT);
+                        mNetworkDetailsTracker.getWifiEntry(), WifiConfigUiBase2.MODE_CONNECT,
+                        0 /* style */, false /* hideSubmitButton */,
+                        false /* hideMeteredAndPrivacy */,
+                        Utils.SYSTEMUI_PACKAGE_NAME.equals(getLaunchedFromPackage()));
             } else {
                 mDialog = WifiDialog.createModal(
                         this, this, mAccessPoint, WifiConfigUiBase.MODE_CONNECT);
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
index bf866b2..8d6d2d9 100644
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkSummaryControllerTest.java
@@ -44,8 +44,6 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.Settings.MobileNetworkActivity;
-import com.android.settings.network.helper.SubscriptionAnnotation;
-import com.android.settings.network.helper.SubscriptionGrouping;
 import com.android.settings.widget.AddPreference;
 import com.android.settingslib.RestrictedLockUtils;
 import com.android.settingslib.core.lifecycle.Lifecycle;
diff --git a/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java b/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java
deleted file mode 100644
index bea7209..0000000
--- a/tests/unit/src/com/android/settings/network/helper/SubscriptionGroupingTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2021 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 com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.os.ParcelUuid;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.network.helper.SubscriptionAnnotation;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(AndroidJUnit4.class)
-public class SubscriptionGroupingTest {
-
-    private ParcelUuid mMockUuid;
-
-    private Context mContext;
-    private SubscriptionGrouping mTarget;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        mContext = spy(ApplicationProvider.getApplicationContext());
-        mMockUuid = ParcelUuid.fromString("1-1-1-1-1");
-        mTarget = spy(new SubscriptionGrouping());
-    }
-
-    @Test
-    public void apply_multipleEntriesWithSameGroupUuid_onlyOneLeft() {
-        SubscriptionAnnotation subAnno1 = new TestSubAnnotation(1,
-                SubscriptionAnnotation.TYPE_ESIM, true, true, mMockUuid);
-        SubscriptionAnnotation subAnno2 = new TestSubAnnotation(2,
-                SubscriptionAnnotation.TYPE_PSIM, true, true, mMockUuid);
-        SubscriptionAnnotation subAnno3 = new TestSubAnnotation(3,
-                SubscriptionAnnotation.TYPE_ESIM, true, true, mMockUuid);
-        doReturn(mMockUuid).when(mTarget).getGroupUuid(any());
-
-        List<SubscriptionAnnotation> result = mTarget
-                .apply(Arrays.asList(subAnno2, subAnno1, subAnno3));
-        assertThat(result.size()).isEqualTo(1);
-        assertThat(result.get(0)).isEqualTo(subAnno1);
-    }
-
-    @Test
-    public void apply_multipleEntriesWithSameGroupUuid_disabledOneIsAvoided() {
-        SubscriptionAnnotation subAnno1 = new TestSubAnnotation(1,
-                SubscriptionAnnotation.TYPE_ESIM, true, true, mMockUuid);
-        SubscriptionAnnotation subAnno2 = new TestSubAnnotation(2,
-                SubscriptionAnnotation.TYPE_PSIM, true, true, mMockUuid);
-        SubscriptionAnnotation subAnno3 = new TestSubAnnotation(3,
-                SubscriptionAnnotation.TYPE_ESIM, false, false, mMockUuid);
-        doReturn(mMockUuid).when(mTarget).getGroupUuid(any());
-
-        List<SubscriptionAnnotation> result = mTarget
-                .apply(Arrays.asList(subAnno2, subAnno1, subAnno3));
-        assertThat(result.size()).isEqualTo(1);
-        assertThat(result.get(0)).isEqualTo(subAnno1);
-    }
-
-    private class TestSubAnnotation extends SubscriptionAnnotation {
-        private int mSubId;
-        private int mSimType;
-        private boolean mIsActive;
-        private boolean mIsDisplayAllowed;
-        private ParcelUuid mUuid;
-
-        private TestSubAnnotation(int subId, int simType,
-                boolean isActive, boolean isDisplayAllowed, ParcelUuid guuid) {
-            super(null, -1, null, null, null, null);
-            mSubId = subId;
-            mSimType = simType;
-            mIsActive = isActive;
-            mIsDisplayAllowed = isDisplayAllowed;
-            mUuid = guuid;
-        }
-
-        @Override
-        public int getSubscriptionId() {
-            return mSubId;
-        }
-
-        @Override
-        public int getType() {
-            return mSimType;
-        }
-
-        @Override
-        public boolean isExisted() {
-            return true;
-        }
-
-        @Override
-        public boolean isActive() {
-            return mIsActive;
-        }
-
-        @Override
-        public boolean isDisplayAllowed() {
-            return mIsDisplayAllowed;
-        }
-
-        @Override
-        public ParcelUuid getGroupUuid() {
-            return mUuid;
-        }
-    }
-}
