Merge "Show Hotspot informations in Network details settings" into main
diff --git a/Android.bp b/Android.bp
index bb5ace8..d34aaac 100644
--- a/Android.bp
+++ b/Android.bp
@@ -74,6 +74,7 @@
         "androidx.preference_preference",
         "androidx.recyclerview_recyclerview",
         "androidx.window_window",
+        "androidx.window_window-java",
         "com.google.android.material_material",
         "setupcompat",
         "setupdesign",
@@ -107,6 +108,7 @@
         "Settings-change-ids",
         "androidx.room_room-runtime",
         "SystemUIUnfoldLib",
+        "aconfig_settings_flags_lib",
     ],
 
     plugins: [
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 412846c..b0b8ad6 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3287,6 +3287,7 @@
             android:name="Settings$DataUsageSummaryActivity"
             android:label="@string/data_usage_summary_title"
             android:exported="true"
+            android:enabled="@bool/config_show_sim_info"
             android:icon="@drawable/ic_homepage_data_usage">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.DATA_USAGE_SETTINGS" />
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
new file mode 100644
index 0000000..05c8d0d
--- /dev/null
+++ b/aconfig/Android.bp
@@ -0,0 +1,18 @@
+package {
+    default_applicable_licenses: ["packages_apps_Settings_license"],
+}
+
+aconfig_declarations {
+    name: "aconfig_settings_flags",
+    package: "com.android.settings.flags",
+    srcs: [
+        "settings_connecteddevice_flag_declarations.aconfig",
+        "settings_localepicker_flag_declarations.aconfig",
+    ],
+}
+
+java_aconfig_library {
+    name: "aconfig_settings_flags_lib",
+    aconfig_declarations: "aconfig_settings_flags",
+}
+
diff --git a/aconfig/settings_connecteddevice_flag_declarations.aconfig b/aconfig/settings_connecteddevice_flag_declarations.aconfig
new file mode 100644
index 0000000..db42fff
--- /dev/null
+++ b/aconfig/settings_connecteddevice_flag_declarations.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.settings.flags"
+
+flag {
+  name: "enable_subsequent_pair_settings_integration"
+  namespace: "pixel_cross_device_control"
+  description: "Gates whether to enable subsequent pair Settings integration."
+  bug: "296507968"
+}
diff --git a/aconfig/settings_localepicker_flag_declarations.aconfig b/aconfig/settings_localepicker_flag_declarations.aconfig
new file mode 100644
index 0000000..6d7a117
--- /dev/null
+++ b/aconfig/settings_localepicker_flag_declarations.aconfig
@@ -0,0 +1,8 @@
+package: "com.android.settings.flags"
+
+flag {
+    name: "terms_of_address_enabled"
+    namespace: "settings_localepicker"
+    description: "Feature flag for Terms of Address"
+    bug: "297798866"
+}
diff --git a/res/xml/shortcuts.xml b/res/xml/shortcuts.xml
index afb2104..058d22e 100644
--- a/res/xml/shortcuts.xml
+++ b/res/xml/shortcuts.xml
@@ -24,6 +24,7 @@
     <shortcut
         android:shortcutId="manifest-shortcut-data-usage"
         android:icon="@drawable/ic_shortcut_data_usage"
+        android:enabled="@bool/config_show_sim_info"
         android:shortcutShortLabel="@string/data_usage_summary_title">
         <intent
             android:action="android.intent.action.MAIN"
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index c14c01b..1645586 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -34,6 +34,8 @@
 import android.view.View;
 import android.widget.AdapterView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.loader.app.LoaderManager;
 import androidx.loader.content.Loader;
@@ -57,6 +59,7 @@
 import com.android.settingslib.net.UidDetailProvider;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceChangeListener,
@@ -97,6 +100,7 @@
     String mPackageName;
     private CycleAdapter mCycleAdapter;
 
+    @Nullable
     private List<NetworkCycleDataForUid> mUsageData;
     @VisibleForTesting
     NetworkTemplate mTemplate;
@@ -261,7 +265,7 @@
     }
 
     @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
+    public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
         if (preference == mRestrictBackground) {
             mDataSaverBackend.setIsDenylisted(mAppItem.key, mPackageName, !(Boolean) newValue);
             updatePrefs();
@@ -361,9 +365,7 @@
         }
         String[] packages = mPackageManager.getPackagesForUid(uid);
         if (packages != null) {
-            for (int i = 0; i < packages.length; i++) {
-                mPackages.add(packages[i]);
-            }
+            Collections.addAll(mPackages, packages);
         }
     }
 
@@ -448,73 +450,75 @@
 
     @VisibleForTesting
     final LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>> mUidDataCallbacks =
-        new LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>>() {
-            @Override
-            public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
-                final NetworkCycleDataForUidLoader.Builder builder
-                    = NetworkCycleDataForUidLoader.builder(mContext);
-                builder.setRetrieveDetail(true)
-                    .setNetworkTemplate(mTemplate);
-                for (int i = 0; i < mAppItem.uids.size(); i++) {
-                    builder.addUid(mAppItem.uids.keyAt(i));
+            new LoaderManager.LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
+                    final NetworkCycleDataForUidLoader.Builder<?> builder =
+                            NetworkCycleDataForUidLoader.builder(mContext);
+                    builder.setRetrieveDetail(true)
+                            .setNetworkTemplate(mTemplate);
+                    for (int i = 0; i < mAppItem.uids.size(); i++) {
+                        builder.addUid(mAppItem.uids.keyAt(i));
+                    }
+                    if (mCycles != null) {
+                        builder.setCycles(mCycles);
+                    }
+                    return builder.build();
                 }
-                if (mCycles != null) {
-                    builder.setCycles(mCycles);
-                }
-                return builder.build();
-            }
 
-            @Override
-            public void onLoadFinished(Loader<List<NetworkCycleDataForUid>> loader,
-                    List<NetworkCycleDataForUid> data) {
-                mUsageData = data;
-                mCycleAdapter.updateCycleList(data);
-                if (mSelectedCycle > 0L) {
-                    final int numCycles = data.size();
-                    int position = 0;
-                    for (int i = 0; i < numCycles; i++) {
-                        final NetworkCycleDataForUid cycleData = data.get(i);
-                        if (cycleData.getEndTime() == mSelectedCycle) {
-                            position = i;
-                            break;
+                @Override
+                public void onLoadFinished(@NonNull Loader<List<NetworkCycleDataForUid>> loader,
+                        List<NetworkCycleDataForUid> data) {
+                    mUsageData = data;
+                    mCycleAdapter.updateCycleList(data);
+                    if (mSelectedCycle > 0L) {
+                        final int numCycles = data.size();
+                        int position = 0;
+                        for (int i = 0; i < numCycles; i++) {
+                            final NetworkCycleDataForUid cycleData = data.get(i);
+                            if (cycleData.getEndTime() == mSelectedCycle) {
+                                position = i;
+                                break;
+                            }
                         }
+                        if (position > 0) {
+                            mCycle.setSelection(position);
+                        }
+                        bindData(position);
+                    } else {
+                        bindData(0 /* position */);
                     }
-                    if (position > 0) {
-                        mCycle.setSelection(position);
-                    }
-                    bindData(position);
-                } else {
-                    bindData(0 /* position */);
+                    mIsLoading = false;
                 }
-                mIsLoading = false;
-            }
 
-            @Override
-            public void onLoaderReset(Loader<List<NetworkCycleDataForUid>> loader) {
-            }
-        };
+                @Override
+                public void onLoaderReset(@NonNull Loader<List<NetworkCycleDataForUid>> loader) {
+                }
+            };
 
     private final LoaderManager.LoaderCallbacks<ArraySet<Preference>> mAppPrefCallbacks =
-        new LoaderManager.LoaderCallbacks<ArraySet<Preference>>() {
-            @Override
-            public Loader<ArraySet<Preference>> onCreateLoader(int i, Bundle bundle) {
-                return new AppPrefLoader(getPrefContext(), mPackages, getPackageManager());
-            }
+            new LoaderManager.LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<ArraySet<Preference>> onCreateLoader(int i, Bundle bundle) {
+                    return new AppPrefLoader(getPrefContext(), mPackages, getPackageManager());
+                }
 
-            @Override
-            public void onLoadFinished(Loader<ArraySet<Preference>> loader,
-                    ArraySet<Preference> preferences) {
-                if (preferences != null && mAppList != null) {
-                    for (Preference preference : preferences) {
-                        mAppList.addPreference(preference);
+                @Override
+                public void onLoadFinished(@NonNull Loader<ArraySet<Preference>> loader,
+                        ArraySet<Preference> preferences) {
+                    if (preferences != null && mAppList != null) {
+                        for (Preference preference : preferences) {
+                            mAppList.addPreference(preference);
+                        }
                     }
                 }
-            }
 
-            @Override
-            public void onLoaderReset(Loader<ArraySet<Preference>> loader) {
-            }
-        };
+                @Override
+                public void onLoaderReset(@NonNull Loader<ArraySet<Preference>> loader) {
+                }
+            };
 
     @Override
     public void onDataSaverChanged(boolean isDataSaving) {
diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java
index ee2a1ad..5c52797 100644
--- a/src/com/android/settings/datausage/DataUsageList.java
+++ b/src/com/android/settings/datausage/DataUsageList.java
@@ -48,6 +48,8 @@
 import android.widget.ImageView;
 import android.widget.Spinner;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.lifecycle.Lifecycle;
 import androidx.loader.app.LoaderManager.LoaderCallbacks;
@@ -118,7 +120,10 @@
     LoadingViewController mLoadingViewController;
 
     private ChartDataUsagePreference mChart;
+
+    @Nullable
     private List<NetworkCycleChartData> mCycleData;
+
     // Caches the cycles for startAppDataUsage usage, which need be cleared when resumed.
     private ArrayList<Long> mCycles;
     // Spinner will keep the selected cycle even after paused, this only keeps the displayed cycle,
@@ -165,7 +170,7 @@
     }
 
     @Override
-    public void onViewCreated(View v, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View v, Bundle savedInstanceState) {
         super.onViewCreated(v, savedInstanceState);
 
         mHeader = setPinnedHeaderView(R.layout.apps_filter_spinner);
@@ -355,7 +360,9 @@
         }
 
         // generate cycle list based on policy and available history
-        mCycleAdapter.updateCycleList(mCycleData);
+        if (mCycleData != null) {
+            mCycleAdapter.updateCycleList(mCycleData);
+        }
         updateSelectedCycle();
     }
 
@@ -481,11 +488,9 @@
         }
         stats.close();
 
-        final int restrictedUidsMax = restrictedUids.length;
-        for (int i = 0; i < restrictedUidsMax; ++i) {
-            final int uid = restrictedUids[i];
+        for (final int uid : restrictedUids) {
             // Only splice in restricted state for current user or managed users
-            if (!profiles.contains(new UserHandle(UserHandle.getUserId(uid)))) {
+            if (!profiles.contains(UserHandle.getUserHandleForUid(uid))) {
                 continue;
             }
 
@@ -505,14 +510,13 @@
                 R.array.datausage_hiding_carrier_service_package_names));
         // When there is no specified SubscriptionInfo, Wi-Fi data usage will be displayed.
         // In this case, the carrier service package also needs to be hidden.
-        boolean shouldHidePackageName = mSubscriptionInfoEntity != null
-                ? Arrays.stream(getContext().getResources().getIntArray(
+        boolean shouldHidePackageName = mSubscriptionInfoEntity == null
+                || Arrays.stream(getContext().getResources().getIntArray(
                         R.array.datausage_hiding_carrier_service_carrier_id))
-                .anyMatch(carrierId -> (carrierId == mSubscriptionInfoEntity.carrierId))
-                : true;
+                .anyMatch(carrierId -> (carrierId == mSubscriptionInfoEntity.carrierId));
 
-        for (int i = 0; i < items.size(); i++) {
-            UidDetail detail = mUidDetailProvider.getUidDetail(items.get(i).key, true);
+        for (var item : items) {
+            UidDetail detail = mUidDetailProvider.getUidDetail(item.key, true);
             // Do not show carrier service package in data usage list if it should be hidden for
             // the carrier.
             if (detail != null && shouldHidePackageName && packageNames.contains(
@@ -520,17 +524,13 @@
                 continue;
             }
 
-            final int percentTotal = largest != 0 ? (int) (items.get(i).total * 100 / largest) : 0;
+            final int percentTotal = largest != 0 ? (int) (item.total * 100 / largest) : 0;
             final AppDataUsagePreference preference = new AppDataUsagePreference(getContext(),
-                    items.get(i), percentTotal, mUidDetailProvider);
-            preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    AppDataUsagePreference pref = (AppDataUsagePreference) preference;
-                    AppItem item = pref.getItem();
-                    startAppDataUsage(item);
-                    return true;
-                }
+                    item, percentTotal, mUidDetailProvider);
+            preference.setOnPreferenceClickListener(p -> {
+                AppDataUsagePreference pref = (AppDataUsagePreference) p;
+                startAppDataUsage(pref.getItem());
+                return true;
             });
             mApps.addPreference(preference);
         }
@@ -538,6 +538,9 @@
 
     @VisibleForTesting
     void startAppDataUsage(AppItem item) {
+        if (mCycleData == null) {
+            return;
+        }
         final Bundle args = new Bundle();
         args.putParcelable(AppDataUsage.ARG_APP_ITEM, item);
         args.putParcelable(AppDataUsage.ARG_NETWORK_TEMPLATE, mTemplate);
@@ -600,67 +603,70 @@
 
     @VisibleForTesting
     final LoaderCallbacks<List<NetworkCycleChartData>> mNetworkCycleDataCallbacks =
-            new LoaderCallbacks<List<NetworkCycleChartData>>() {
-        @Override
-        public Loader<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) {
-            return NetworkCycleChartDataLoader.builder(getContext())
-                    .setNetworkTemplate(mTemplate)
-                    .build();
-        }
+            new LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) {
+                    return NetworkCycleChartDataLoader.builder(getContext())
+                            .setNetworkTemplate(mTemplate)
+                            .build();
+                }
 
-        @Override
-        public void onLoadFinished(Loader<List<NetworkCycleChartData>> loader,
-                List<NetworkCycleChartData> data) {
-            mLoadingViewController.showContent(false /* animate */);
-            mCycleData = data;
-            // calculate policy cycles based on available data
-            updatePolicy();
-            mCycleSpinner.setVisibility(View.VISIBLE);
-        }
+                @Override
+                public void onLoadFinished(@NonNull Loader<List<NetworkCycleChartData>> loader,
+                        List<NetworkCycleChartData> data) {
+                    mLoadingViewController.showContent(false /* animate */);
+                    mCycleData = data;
+                    // calculate policy cycles based on available data
+                    updatePolicy();
+                    mCycleSpinner.setVisibility(View.VISIBLE);
+                }
 
-        @Override
-        public void onLoaderReset(Loader<List<NetworkCycleChartData>> loader) {
-            mCycleData = null;
-        }
-    };
+                @Override
+                public void onLoaderReset(@NonNull Loader<List<NetworkCycleChartData>> loader) {
+                    mCycleData = null;
+                }
+            };
 
     private final LoaderCallbacks<NetworkStats> mNetworkStatsDetailCallbacks =
-            new LoaderCallbacks<NetworkStats>() {
-        @Override
-        public Loader<NetworkStats> onCreateLoader(int id, Bundle args) {
-            return new NetworkStatsSummaryLoader.Builder(getContext())
-                    .setStartTime(mChart.getInspectStart())
-                    .setEndTime(mChart.getInspectEnd())
-                    .setNetworkTemplate(mTemplate)
-                    .build();
-        }
-
-        @Override
-        public void onLoadFinished(Loader<NetworkStats> loader, NetworkStats data) {
-            final int[] restrictedUids = services.mPolicyManager.getUidsWithPolicy(
-                    POLICY_REJECT_METERED_BACKGROUND);
-            bindStats(data, restrictedUids);
-            updateEmptyVisible();
-        }
-
-        @Override
-        public void onLoaderReset(Loader<NetworkStats> loader) {
-            bindStats(null, new int[0]);
-            updateEmptyVisible();
-        }
-
-        private void updateEmptyVisible() {
-            if ((mApps.getPreferenceCount() != 0) !=
-                    (getPreferenceScreen().getPreferenceCount() != 0)) {
-                if (mApps.getPreferenceCount() != 0) {
-                    getPreferenceScreen().addPreference(mUsageAmount);
-                    getPreferenceScreen().addPreference(mApps);
-                } else {
-                    getPreferenceScreen().removeAll();
+            new LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<NetworkStats> onCreateLoader(int id, Bundle args) {
+                    return new NetworkStatsSummaryLoader.Builder(getContext())
+                            .setStartTime(mChart.getInspectStart())
+                            .setEndTime(mChart.getInspectEnd())
+                            .setNetworkTemplate(mTemplate)
+                            .build();
                 }
-            }
-        }
-    };
+
+                @Override
+                public void onLoadFinished(
+                        @NonNull Loader<NetworkStats> loader, NetworkStats data) {
+                    final int[] restrictedUids = services.mPolicyManager.getUidsWithPolicy(
+                            POLICY_REJECT_METERED_BACKGROUND);
+                    bindStats(data, restrictedUids);
+                    updateEmptyVisible();
+                }
+
+                @Override
+                public void onLoaderReset(@NonNull Loader<NetworkStats> loader) {
+                    bindStats(null, new int[0]);
+                    updateEmptyVisible();
+                }
+
+                private void updateEmptyVisible() {
+                    if ((mApps.getPreferenceCount() != 0)
+                            != (getPreferenceScreen().getPreferenceCount() != 0)) {
+                        if (mApps.getPreferenceCount() != 0) {
+                            getPreferenceScreen().addPreference(mUsageAmount);
+                            getPreferenceScreen().addPreference(mApps);
+                        } else {
+                            getPreferenceScreen().removeAll();
+                        }
+                    }
+                }
+            };
 
     private static boolean isGuestUser(Context context) {
         if (context == null) return false;
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 533fbe7..d96ec39 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -50,6 +50,7 @@
 
 import androidx.annotation.VisibleForTesting;
 import androidx.core.graphics.Insets;
+import androidx.core.util.Consumer;
 import androidx.core.view.ViewCompat;
 import androidx.core.view.WindowCompat;
 import androidx.core.view.WindowInsetsCompat;
@@ -57,7 +58,10 @@
 import androidx.fragment.app.FragmentActivity;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentTransaction;
+import androidx.window.embedding.SplitController;
+import androidx.window.embedding.SplitInfo;
 import androidx.window.embedding.SplitRule;
+import androidx.window.java.embedding.SplitControllerCallbackAdapter;
 
 import com.android.settings.R;
 import com.android.settings.Settings;
@@ -77,6 +81,7 @@
 import com.google.android.setupcompat.util.WizardManagerHelper;
 
 import java.net.URISyntaxException;
+import java.util.List;
 import java.util.Set;
 
 /** Settings homepage activity */
@@ -112,6 +117,9 @@
     // A regular layout shows icons on homepage, whereas a simplified layout doesn't.
     private boolean mIsRegularLayout = true;
 
+    private SplitControllerCallbackAdapter mSplitControllerAdapter;
+    private SplitInfoCallback mCallback;
+
     /** A listener receiving homepage loaded events. */
     public interface HomepageLoadedListener {
         /** Called when the homepage is loaded. */
@@ -259,6 +267,22 @@
     protected void onStart() {
         ((SettingsApplication) getApplication()).setHomeActivity(this);
         super.onStart();
+        if (mIsEmbeddingActivityEnabled) {
+            final SplitController splitController = SplitController.getInstance(this);
+            mSplitControllerAdapter = new SplitControllerCallbackAdapter(splitController);
+            mCallback = new SplitInfoCallback(this);
+            mSplitControllerAdapter.addSplitListener(this, Runnable::run, mCallback);
+        }
+    }
+
+    @Override
+    protected void onStop() {
+        super.onStop();
+        if (mSplitControllerAdapter != null && mCallback != null) {
+            mSplitControllerAdapter.removeSplitListener(mCallback);
+            mCallback = null;
+            mSplitControllerAdapter = null;
+        }
     }
 
     @Override
@@ -281,21 +305,13 @@
     @Override
     public void onConfigurationChanged(Configuration newConfig) {
         super.onConfigurationChanged(newConfig);
-        final boolean newTwoPaneState = ActivityEmbeddingUtils.isAlreadyEmbedded(this);
-        if (mIsTwoPane != newTwoPaneState) {
-            mIsTwoPane = newTwoPaneState;
-            updateHomepageAppBar();
-            updateHomepageBackground();
-            updateHomepagePaddings();
-        }
-        updateSplitLayout();
+        updateHomepageUI();
     }
 
     private void updateSplitLayout() {
         if (!mIsEmbeddingActivityEnabled) {
             return;
         }
-
         if (mIsTwoPane) {
             if (mIsRegularLayout == ActivityEmbeddingUtils.isRegularHomepageLayout(this)) {
                 // Layout unchanged
@@ -365,6 +381,17 @@
         }
     }
 
+    private void updateHomepageUI() {
+        final boolean newTwoPaneState = ActivityEmbeddingUtils.isAlreadyEmbedded(this);
+        if (mIsTwoPane != newTwoPaneState) {
+            mIsTwoPane = newTwoPaneState;
+            updateHomepageAppBar();
+            updateHomepageBackground();
+            updateHomepagePaddings();
+        }
+        updateSplitLayout();
+    }
+
     private void updateHomepageBackground() {
         if (!mIsEmbeddingActivityEnabled) {
             return;
@@ -733,4 +760,24 @@
             }
         }
     }
+
+    /** The callback invoked while AE splitting. */
+    private static class SplitInfoCallback implements Consumer<List<SplitInfo>> {
+        private final SettingsHomepageActivity mActivity;
+
+        private boolean mIsSplitUpdatedUI = false;
+
+        SplitInfoCallback(SettingsHomepageActivity activity) {
+            mActivity = activity;
+        }
+
+        @Override
+        public void accept(List<SplitInfo> splitInfoList) {
+            if (!splitInfoList.isEmpty() && !mIsSplitUpdatedUI && !mActivity.isFinishing()
+                    && ActivityEmbeddingUtils.isAlreadyEmbedded(mActivity)) {
+                mIsSplitUpdatedUI = true;
+                mActivity.updateHomepageUI();
+            }
+        }
+    }
 }
diff --git a/src/com/android/settings/media/MediaOutputIndicatorWorker.java b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
index 7c299c6..6e56153 100644
--- a/src/com/android/settings/media/MediaOutputIndicatorWorker.java
+++ b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
@@ -171,12 +171,20 @@
 
     /** Check if this device supports LE Audio Broadcast feature */
     public boolean isBroadcastSupported() {
+        if (mLocalBluetoothManager == null) {
+            Log.e(TAG, "isBroadcastSupported: Bluetooth is not supported on this device");
+            return false;
+        }
         LocalBluetoothLeBroadcast broadcast =
                 mLocalBluetoothManager.getProfileManager().getLeAudioBroadcastProfile();
         return broadcast != null ? true : false;
     }
 
     public boolean isDeviceBroadcasting() {
+        if (mLocalBluetoothManager == null) {
+            Log.e(TAG, "isDeviceBroadcasting: Bluetooth is not supported on this device");
+            return false;
+        }
         LocalBluetoothLeBroadcast broadcast =
                 mLocalBluetoothManager.getProfileManager().getLeAudioBroadcastProfile();
         if (broadcast == null) {
diff --git a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
index e3e83dc..400d261 100644
--- a/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
+++ b/src/com/android/settings/network/telephony/gsm/AutoSelectPreferenceController.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.network.telephony.gsm;
 
+import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
 import static androidx.lifecycle.Lifecycle.Event.ON_START;
 import static androidx.lifecycle.Lifecycle.Event.ON_STOP;
 
@@ -36,10 +37,11 @@
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleObserver;
-import androidx.lifecycle.OnLifecycleEvent;
+import androidx.lifecycle.LifecycleEventObserver;
+import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 import androidx.preference.SwitchPreference;
@@ -63,10 +65,10 @@
  * Preference controller for "Auto Select Network"
  */
 public class AutoSelectPreferenceController extends TelephonyTogglePreferenceController
-        implements LifecycleObserver{
+        implements LifecycleEventObserver{
     private static final long MINIMUM_DIALOG_TIME_MILLIS = TimeUnit.SECONDS.toMillis(1);
     private static final String LOG_TAG = "AutoSelectPreferenceController";
-    private static final String INTERNAL_LOG_TAG_INIT = "Init";
+    private static final String INTERNAL_LOG_TAG_ONRESUME = "OnResume";
     private static final String INTERNAL_LOG_TAG_AFTERSET = "AfterSet";
 
     private final Handler mUiHandler;
@@ -110,14 +112,37 @@
         }
     }
 
-    @OnLifecycleEvent(ON_START)
-    public void onStart() {
-        mAllowedNetworkTypesListener.register(mContext, mSubId);
-    }
-
-    @OnLifecycleEvent(ON_STOP)
-    public void onStop() {
-        mAllowedNetworkTypesListener.unregister(mContext, mSubId);
+    /**
+     * Implementation of LifecycleEventObserver.
+     */
+    @SuppressWarnings("FutureReturnValueIgnored")
+    public void onStateChanged(@NonNull LifecycleOwner lifecycleOwner,
+            @NonNull Lifecycle.Event event) {
+        switch (event) {
+            case ON_START:
+                mAllowedNetworkTypesListener.register(mContext, mSubId);
+                break;
+            case ON_RESUME:
+                ThreadUtils.postOnBackgroundThread(() -> {
+                    queryNetworkSelectionMode(INTERNAL_LOG_TAG_ONRESUME);
+                    //Update UI in UI thread
+                    mUiHandler.post(() -> {
+                        if (mSwitchPreference != null) {
+                            mRecursiveUpdate.getAndIncrement();
+                            mSwitchPreference.setChecked(isChecked());
+                            mRecursiveUpdate.decrementAndGet();
+                            updateListenerValue();
+                        }
+                    });
+                });
+                break;
+            case ON_STOP:
+                mAllowedNetworkTypesListener.unregister(mContext, mSubId);
+                break;
+            default:
+                // Do nothing
+                break;
+        }
     }
 
     @Override
@@ -243,19 +268,6 @@
                 updateUiAutoSelectValue(status);
             }
         };
-
-        ThreadUtils.postOnBackgroundThread(() -> {
-            queryNetworkSelectionMode(INTERNAL_LOG_TAG_INIT);
-            //Update UI in UI thread
-            mUiHandler.post(() -> {
-                if (mSwitchPreference != null) {
-                    mRecursiveUpdate.getAndIncrement();
-                    mSwitchPreference.setChecked(isChecked());
-                    mRecursiveUpdate.decrementAndGet();
-                    updateListenerValue();
-                }
-            });
-        });
         return this;
     }
 
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java
index cd06bae..444fa1e 100644
--- a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java
+++ b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java
@@ -313,4 +313,18 @@
 
         assertThat(mMediaOutputIndicatorWorker.isBroadcastSupported()).isTrue();
     }
+
+    @Test
+    public void isBroadcastSupported_noLocalMediaManager_returnFalse() {
+        mMediaOutputIndicatorWorker.mLocalMediaManager = null;
+
+        assertThat(mMediaOutputIndicatorWorker.isBroadcastSupported()).isFalse();
+    }
+
+    @Test
+    public void isDeviceBroadcasting_noLocalMediaManager_returnFalse() {
+        mMediaOutputIndicatorWorker.mLocalMediaManager = null;
+
+        assertThat(mMediaOutputIndicatorWorker.isDeviceBroadcasting()).isFalse();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/NotificationAssistantPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationAssistantPreferenceControllerTest.java
index fc90372..c8cf290 100644
--- a/tests/robotests/src/com/android/settings/notification/NotificationAssistantPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/NotificationAssistantPreferenceControllerTest.java
@@ -235,8 +235,7 @@
         mPreferenceController.getDefaultNASIntent();
         mPreferenceController.updateState(mPreference);
 
-        verify(mPreference, times(1)).setSwitchEnabled(eq(false));
+        verify(mPreference).setSwitchEnabled(eq(false));
         assertFalse(mPreference.isEnabled());
     }
-
 }
diff --git a/tests/spa_unit/src/com/android/settings/datausage/lib/DataUsageLibTest.kt b/tests/spa_unit/src/com/android/settings/datausage/lib/DataUsageLibTest.kt
index 5922fac..18af600 100644
--- a/tests/spa_unit/src/com/android/settings/datausage/lib/DataUsageLibTest.kt
+++ b/tests/spa_unit/src/com/android/settings/datausage/lib/DataUsageLibTest.kt
@@ -26,6 +26,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -86,6 +87,7 @@
     }
 
     @Test
+    @Ignore("b/297923588")
     fun getMobileTemplate_mergedImsisFromGroupNull_returnRequestedSub() {
         whenever(subscriptionManager.availableSubscriptionInfoList)
             .thenReturn(listOf(SUBSCRIBER_INFO))
@@ -168,4 +170,4 @@
         const val SUBSCRIBER_ID = "Test Subscriber"
         val SUBSCRIBER_INFO: SubscriptionInfo = SubscriptionInfo.Builder().setId(SUB_ID).build()
     }
-}
\ No newline at end of file
+}