- make Setting a single Activity and DO, handle DO internally for each page
- improve toggle button
- have each tile report if they want to be listed or not
- add deep dive for wifi

Bug: 76805265

Test: Manually
Change-Id: I9c23696bdcfa1a2582ea0d49ee1a869a34002e1a
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 01aa181..0f4072c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -64,15 +64,8 @@
         <activity
             android:name=".common.CarSettingActivity"
             android:label="@string/settings_label"
-            android:launchMode="singleTop"
-            android:windowSoftInputMode="adjustPan">
-        </activity>
-
-        <activity
-            android:name=".quicksettings.QuickSettingActivity"
-            android:theme="@style/CarQuickSettingTheme"
-            android:label="@string/settings_label"
             android:launchMode="singleTask"
+            android:windowSoftInputMode="adjustPan"
             android:exported="true">
             <!-- Set priority high enough to trump the phone setting app -->
             <!-- TODO: once phone setting is removed from car system image, set priority to 1 -->
diff --git a/res/color/toggle_bg.xml b/res/color/toggle_bg.xml
new file mode 100644
index 0000000..f48f216
--- /dev/null
+++ b/res/color/toggle_bg.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2018 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_enabled="false"
+      android:color="@color/toggle_bg_disabled"/>
+  <item android:state_enabled="true"
+      android:color="@color/car_accent"/>
+  <item android:color="@color/car_accent"/>
+</selector>
\ No newline at end of file
diff --git a/res/color/toggle_icon_tint.xml b/res/color/toggle_icon_tint.xml
new file mode 100644
index 0000000..41388ba
--- /dev/null
+++ b/res/color/toggle_icon_tint.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2018 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.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+  <item android:state_enabled="false"
+      android:color="@color/toggle_icon_disabled"/>
+  <item android:state_enabled="true"
+      android:color="@color/car_card"/>
+  <item android:color="@color/car_card"/>
+</selector>
\ No newline at end of file
diff --git a/res/drawable/button_ripple_bg.xml b/res/drawable/button_ripple_bg.xml
index 7565c69..c9c4cf8 100644
--- a/res/drawable/button_ripple_bg.xml
+++ b/res/drawable/button_ripple_bg.xml
@@ -16,5 +16,6 @@
 -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-        android:color="@color/car_card_ripple_background">
+        android:color="@color/car_card_ripple_background"
+        android:radius="@dimen/toggle_ripple">
 </ripple>
diff --git a/res/drawable/circle_bg.xml b/res/drawable/circle_bg.xml
index b002eba..5fc37ad 100644
--- a/res/drawable/circle_bg.xml
+++ b/res/drawable/circle_bg.xml
@@ -20,7 +20,7 @@
     android:shape="oval">
 
   <solid
-      android:color="@color/car_accent"/>
+      android:color="@color/toggle_bg"/>
 
   <size
       android:width="@dimen/car_touch_target_size"
diff --git a/res/drawable/ic_brightness_knob.xml b/res/drawable/ic_brightness_knob.xml
new file mode 100644
index 0000000..a6f2026
--- /dev/null
+++ b/res/drawable/ic_brightness_knob.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 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
+  -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="30dp"
+        android:height="30dp"
+        android:viewportWidth="24.0"
+        android:viewportHeight="24.0">
+    <path
+        android:pathData="M20,8.69L20,4h-4.69L12,0.69 8.69,4L4,4v4.69L0.69,12 4,15.31L4,20h4.69L12,23.31 15.31,20L20,20v-4.69L23.31,12 20,8.69zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"
+        android:fillColor="@color/car_accent"/>
+</vector>
diff --git a/res/layout/action_bar_quick_settings.xml b/res/layout/action_bar_quick_settings.xml
index 88856dd..7b3ba20 100644
--- a/res/layout/action_bar_quick_settings.xml
+++ b/res/layout/action_bar_quick_settings.xml
@@ -18,7 +18,8 @@
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/car_app_bar_height">
+    android:layout_height="@dimen/car_app_bar_height"
+    android:layout_gravity="top">
 
     <FrameLayout
         android:id="@+id/action_bar_icon_container"
@@ -39,7 +40,6 @@
         android:layout_height="match_parent"
         android:layout_marginEnd="@dimen/car_keyline_1"
         android:layout_toEndOf="@id/action_bar_icon_container"
-        android:text="@string/settings_label"
         android:gravity="center_vertical"
         android:textAppearance="@style/TextAppearance.Car.Title2"
         android:textColor="@color/car_accent"/>
@@ -58,17 +58,21 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
             android:layout_marginEnd="@dimen/car_padding_4"
+            android:background="@drawable/button_ripple_bg"
             style="@style/Widget.Car.Settings.ActionBar.Button.Borderless.Colored"
             android:orientation="horizontal">
             <ImageView
                 android:id="@+id/user_icon"
                 android:src="@drawable/ic_user"
-                style="@style/ListIcon"/>
+                android:background="@null"
+                style="@style/ListIcon.ActionBar"/>
             <TextView
                 android:id="@+id/user_switcher_text"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_vertical"
+                android:background="@null"
+                android:textColor="@color/car_accent"
                 android:textAppearance="@style/TextAppearance.Car.Label1"
                 android:layout_marginStart="@dimen/car_padding_2"
                 android:layout_marginEnd="@dimen/car_padding_2"/>
@@ -79,24 +83,23 @@
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
             android:layout_marginEnd="@dimen/car_padding_4"
+            android:background="@drawable/button_ripple_bg"
             style="@style/Widget.Car.Settings.ActionBar.Button.Borderless.Colored"
             android:orientation="horizontal">
             <ImageView
                 android:src="@drawable/ic_settings_gear"
-                style="@style/ListIcon"/>
+                android:background="@null"
+                style="@style/ListIcon.ActionBar"/>
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="center_vertical"
                 android:text="@string/more_settings_label"
+                android:textColor="@color/car_accent"
                 android:textAppearance="@style/TextAppearance.Car.Label1"
+                android:background="@null"
                 android:layout_marginStart="@dimen/car_padding_2"
                 android:layout_marginEnd="@dimen/car_padding_2"/>
         </LinearLayout>
     </LinearLayout>
-    <View
-        android:layout_alignParentBottom="true"
-        android:background="@color/car_list_divider"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_list_divider_height" />
 </RelativeLayout>
diff --git a/res/layout/brightness_tile.xml b/res/layout/brightness_tile.xml
index 6ca3349..57f7a71 100644
--- a/res/layout/brightness_tile.xml
+++ b/res/layout/brightness_tile.xml
@@ -20,6 +20,7 @@
     android:id="@+id/seekbar"
     android:progressDrawable="@drawable/ic_seekbar_track"
     android:layout_marginBottom="@dimen/car_padding_4"
-    android:thumb="@drawable/ic_seekbar_thumb"
+    android:thumb="@drawable/ic_brightness_knob"
+    android:splitTrack="false"
     android:layout_width="match_parent"
     android:layout_height="@dimen/car_single_line_list_item_height"/>
diff --git a/res/layout/quick_settings.xml b/res/layout/quick_settings.xml
index d9b26a5..08eee4f 100644
--- a/res/layout/quick_settings.xml
+++ b/res/layout/quick_settings.xml
@@ -15,23 +15,11 @@
   ~ limitations under the License
   -->
 
-<LinearLayout
+<androidx.car.widget.PagedListView
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/list"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:id="@+id/container">
-    <android.support.v7.widget.Toolbar
-        android:id="@+id/toolbar"
-        android:layout_width="match_parent"
-        android:layout_height="@dimen/car_app_bar_height"
-        app:contentInsetStart="0dp"
-        style="@style/ActionBarStyle.Car" />
-    <androidx.car.widget.PagedListView
-        android:id="@+id/list"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        app:showPagedListViewDivider="false"
-        style="@style/PagedList" />
-</LinearLayout>
\ No newline at end of file
+    android:layout_height="wrap_content"
+    app:showPagedListViewDivider="false"
+    style="@style/PagedList" />
\ No newline at end of file
diff --git a/res/layout/tile.xml b/res/layout/tile.xml
index 58e3b88..f05a739 100644
--- a/res/layout/tile.xml
+++ b/res/layout/tile.xml
@@ -15,38 +15,54 @@
   ~ limitations under the License
   -->
 
-<com.android.car.list.InterceptTouchRelativeLayout
+<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/tile_container"
     android:padding="@dimen/toggle_padding"
     android:layout_marginStart="@dimen/car_padding_2"
     android:layout_marginEnd="@dimen/car_padding_2"
     android:layout_marginBottom="@dimen/car_padding_5"
     android:layout_width="match_parent"
-    android:layout_height="wrap_content">
+    android:layout_height="wrap_content"
+    android:gravity="center_horizontal"
+    android:orientation="vertical">
     <FrameLayout
         android:id="@+id/icon_container"
         android:layout_width="@dimen/car_touch_target_size"
         android:layout_height="@dimen/car_touch_target_size"
-        android:background="@drawable/circle_bg"
-        android:layout_centerHorizontal="true"
-        android:layout_marginBottom="@dimen/car_padding_4">
-        <ImageButton
+        android:background="@drawable/button_ripple_bg"
+        android:layout_marginBottom="@dimen/car_padding_4"
+        android:gravity="center">
+        <View
+            android:id="@+id/icon_background"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@drawable/circle_bg"/>
+        <ImageView
             android:id="@+id/tile_icon"
             android:layout_width="@dimen/car_primary_icon_size"
             android:layout_height="@dimen/car_primary_icon_size"
             android:layout_gravity="center"
             android:src="@drawable/ic_settings_wifi"
-            android:tint="@color/car_card"
-            android:background="@null"
+            android:tint="@color/toggle_icon_tint"
             style="@style/ListIcon" />
     </FrameLayout>
-    <TextView
-        android:id="@+id/tile_text"
+    <LinearLayout
+        android:id="@+id/text_container"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
-        android:paddingTop="@dimen/car_padding_1"
-        android:layout_centerHorizontal="true"
-        android:layout_below="@id/icon_container"
-        android:textAppearance="@style/TextAppearance.Car.Label1"/>
-</com.android.car.list.InterceptTouchRelativeLayout>
\ No newline at end of file
+        android:orientation="horizontal">
+        <TextView
+            android:id="@+id/tile_text"
+            android:layout_height="wrap_content"
+            android:layout_width="wrap_content"
+            android:textAppearance="@style/TextAppearance.Car.Label1"/>
+        <ImageView
+            android:id="@+id/deep_dive_icon"
+            android:layout_width="@dimen/car_primary_icon_size"
+            android:layout_height="@dimen/car_primary_icon_size"
+            android:src="@drawable/ic_arrow_drop_down"
+            android:tint="@color/car_label1"
+            android:layout_marginStart="@dimen/car_padding_1"
+            android:visibility="gone"/>
+    </LinearLayout>
+</LinearLayout>
\ No newline at end of file
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
new file mode 100644
index 0000000..fa0d625
--- /dev/null
+++ b/res/values-night/colors.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+    Copyright (C) 2018 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.
+-->
+<resources>
+    <color name="toggle_bg_disabled">@color/car_grey_800</color>
+    <color name="toggle_icon_disabled">@color/car_grey_400</color>
+</resources>
\ No newline at end of file
diff --git a/res/values/colors.xml b/res/values/colors.xml
index d3ae5f0..047b1e0 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -16,4 +16,7 @@
 -->
 <resources>
     <color name="lock_pattern_background">#353839</color>
+
+    <color name="toggle_bg_disabled">@color/car_grey_400</color>
+    <color name="toggle_icon_disabled">@color/car_grey_800</color>
 </resources>
\ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 23caf72..96e8cc6 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -38,5 +38,7 @@
     <dimen name="pin_pad_key_text_size">48sp</dimen>
 
     <dimen name="lockscreen_title_drawable_padding">5dp</dimen>
+
     <dimen name="toggle_padding">10dp</dimen>
+    <dimen name="toggle_ripple">90dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9d90626..b45a89c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -33,6 +33,8 @@
     <string name="keywords_display_brightness_level">dim screen, touchscreen, battery</string>
     <string name="keywords_display_auto_brightness">dim screen, touchscreen, battery</string>
     <string name="keywords_display_night_display">dim screen, night, tint</string>
+    <!-- Label for night mode toggle tile in quick setting [CHAR LIMIT=20] -->
+    <string name="night_mode_tile_label">Night mode</string>
 
     <!-- wifi settings--><skip />
     <!-- Used in the 1st-level settings screen to go to the 2nd-level settings screen  [CHAR LIMIT=20]-->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 53b26e5..465f4b2 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -48,6 +48,7 @@
     <style name="ListIcon.ActionBar" parent="ListIcon">
         <item name="android:tint">@color/car_accent</item>
         <item name="android:layout_gravity">center</item>
+        <item name="android:background">@drawable/button_ripple_bg</item>
         <item name="android:src">@drawable/ic_arrow_back</item>
     </style>
 
diff --git a/src/com/android/car/settings/common/BaseFragment.java b/src/com/android/car/settings/common/BaseFragment.java
index dd1931c..2639e68 100644
--- a/src/com/android/car/settings/common/BaseFragment.java
+++ b/src/com/android/car/settings/common/BaseFragment.java
@@ -16,6 +16,8 @@
 
 package com.android.car.settings.common;
 
+import android.annotation.NonNull;
+import android.car.drivingstate.CarUxRestrictions;
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.StringRes;
@@ -29,6 +31,7 @@
 import android.widget.TextView;
 
 import com.android.car.settings.R;
+import com.android.car.settings.quicksettings.QuickSettingFragment;
 
 import java.util.Set;
 
@@ -67,16 +70,54 @@
 
     protected FragmentController mFragmentController;
 
-    public void setFragmentController(FragmentController fragmentController) {
+    @NonNull
+    private CarUxRestrictions mCurrentRestrictions;
+
+    public final void setFragmentController(FragmentController fragmentController) {
         mFragmentController = fragmentController;
     }
 
+    /**
+     * Sets the CarUxRestrictions and update this fragment by calling onUxRestrictionChanged().
+     */
+    void setCarUxRestrictions(@NonNull CarUxRestrictions restrictions) {
+        mCurrentRestrictions = restrictions;
+        onUxRestrictionChanged(restrictions);
+    }
+
     protected static Bundle getBundle() {
         Bundle bundle = new Bundle();
         bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar);
         return bundle;
     }
 
+    /**
+     * Checks if this fragment can be shown or not given the CarUxRestrictions. Default to
+     * {@code false} if UX_RESTRICTIONS_NO_SETUP is set.
+     */
+    protected boolean canBeShown(@NonNull CarUxRestrictions carUxRestrictions) {
+        return !CarUxRestrictionsHelper.isNoSetup(carUxRestrictions);
+    }
+
+    /**
+     * Notifies the fragment with the latest CarUxRestrictions change. Default to quick setting
+     * page when canBeShown() return false, no-op otherwise.
+     */
+    protected void onUxRestrictionChanged(@NonNull CarUxRestrictions carUxRestrictions) {
+        mCurrentRestrictions = carUxRestrictions;
+        if (!canBeShown(carUxRestrictions)) {
+            mFragmentController.launchFragment(QuickSettingFragment.newInstance());
+        }
+    }
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        if (mCurrentRestrictions != null) {
+            onUxRestrictionChanged(mCurrentRestrictions);
+        }
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
diff --git a/src/com/android/car/settings/common/CarSettingActivity.java b/src/com/android/car/settings/common/CarSettingActivity.java
index d7767c5..222cd17 100644
--- a/src/com/android/car/settings/common/CarSettingActivity.java
+++ b/src/com/android/car/settings/common/CarSettingActivity.java
@@ -15,6 +15,7 @@
  */
 package com.android.car.settings.common;
 
+import android.car.drivingstate.CarUxRestrictions;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
@@ -23,9 +24,7 @@
 import android.view.inputmethod.InputMethodManager;
 
 import com.android.car.settings.R;
-import com.android.car.settings.home.HomepageFragment;
-import com.android.car.settings.users.UsersListFragment;
-import com.android.car.settings.wifi.WifiSettingsFragment;
+import com.android.car.settings.quicksettings.QuickSettingFragment;
 
 /**
  * Base activity class for car settings, provides a action bar with a back button that goes to
@@ -35,12 +34,8 @@
         BaseFragment.FragmentController {
     private static final String TAG = "CarSetting";
 
-    /** Actions to launch setting page to configure a new wifi network. */
-    public static final String ACTION_ADD_WIFI = "android.car.settings.action_add_wifi";
-
-    /** Actions to launch setting page to show the list of all users. */
-    public static final String ACTION_LIST_USER = "android.car.settings.action_list_user";
-
+    private CarUxRestrictionsHelper mUxRestrictionsHelper;
+    private CarUxRestrictions mCarUxRestrictions;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -53,21 +48,23 @@
     @Override
     public void onStart() {
         super.onStart();
-        Intent intent = getIntent();
-        if (intent != null && intent.getAction() != null) {
-            switch (intent.getAction()) {
-                case ACTION_LIST_USER:
-                    launchFragment(UsersListFragment.newInstance());
-                    return;
-                case ACTION_ADD_WIFI:
-                    launchFragment(WifiSettingsFragment.getInstance());
-                    return;
-                default:
-            }
-        }
-        HomepageFragment homepageFragment = HomepageFragment.getInstance();
-        homepageFragment.setFragmentController(this);
-        launchFragment(homepageFragment);
+        mUxRestrictionsHelper =
+                new CarUxRestrictionsHelper(this, carUxRestrictions -> {
+                    mCarUxRestrictions = carUxRestrictions;
+                    BaseFragment currentFragment = getCurrentFragment();
+                    if (currentFragment != null) {
+                        currentFragment.setCarUxRestrictions(carUxRestrictions);
+                    }
+                });
+        mUxRestrictionsHelper.start();
+        QuickSettingFragment qs = QuickSettingFragment.newInstance();
+        launchFragment(qs);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mUxRestrictionsHelper.stop();
     }
 
     @Override
@@ -77,6 +74,14 @@
 
     @Override
     public void launchFragment(BaseFragment fragment) {
+        if (mCarUxRestrictions != null && !fragment.canBeShown(mCarUxRestrictions)) {
+            DoBlockingDialogFragment alertDialog = new DoBlockingDialogFragment();
+            alertDialog.show(getSupportFragmentManager(), DoBlockingDialogFragment.DIALOG_TAG);
+            return;
+        }
+        if (mCarUxRestrictions != null) {
+            fragment.setCarUxRestrictions(mCarUxRestrictions);
+        }
         fragment.setFragmentController(this);
         getSupportFragmentManager()
                 .beginTransaction()
@@ -105,6 +110,10 @@
         }
     }
 
+    private BaseFragment getCurrentFragment() {
+        return (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container);
+    }
+
     private void hideKeyboard() {
         InputMethodManager imm = (InputMethodManager)this.getSystemService(
                 Context.INPUT_METHOD_SERVICE);
diff --git a/src/com/android/car/settings/common/CarUxRestrictionsHelper.java b/src/com/android/car/settings/common/CarUxRestrictionsHelper.java
index 492367a..fbe810e 100644
--- a/src/com/android/car/settings/common/CarUxRestrictionsHelper.java
+++ b/src/com/android/car/settings/common/CarUxRestrictionsHelper.java
@@ -87,6 +87,15 @@
         }
     }
 
+    /**
+     * Checks if UX_RESTRICTIONS_NO_SETUP is set or not.
+     */
+    public static boolean isNoSetup(CarUxRestrictions carUxRestrictions) {
+        return (carUxRestrictions.getActiveRestrictions()
+                & CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
+                == CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP;
+    }
+
     private final ServiceConnection mServiceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
diff --git a/src/com/android/car/settings/common/DoBlockingDialogFragment.java b/src/com/android/car/settings/common/DoBlockingDialogFragment.java
new file mode 100644
index 0000000..9fd43ac
--- /dev/null
+++ b/src/com/android/car/settings/common/DoBlockingDialogFragment.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2018 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.car.settings.common;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.support.v4.app.DialogFragment;
+
+import androidx.car.app.CarAlertDialog;
+
+import com.android.car.settings.R;
+
+/**
+ * A dialog to block non-distrction optimized view when restriction is applied.
+ */
+public class DoBlockingDialogFragment extends DialogFragment {
+    public static final String DIALOG_TAG = "block_dialog_tag";
+
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        Context context = getContext();
+        return new CarAlertDialog.Builder(context)
+                .setBody(context.getString(R.string.restricted_while_driving))
+                .setPositiveButton(context.getString(R.string.okay),
+                        /* listener= */ null)
+                .create();
+    }
+}
diff --git a/src/com/android/car/settings/quicksettings/BluetoothTile.java b/src/com/android/car/settings/quicksettings/BluetoothTile.java
index a3b4ffc..c3687da 100644
--- a/src/com/android/car/settings/quicksettings/BluetoothTile.java
+++ b/src/com/android/car/settings/quicksettings/BluetoothTile.java
@@ -39,6 +39,7 @@
     private final Context mContext;
     private final StateChangedListener mStateChangedListener;
     private LocalBluetoothAdapter mLocalAdapter;
+    private LocalBluetoothManager mLocalManager;
 
     @DrawableRes
     private int mIconRes = R.drawable.ic_settings_bluetooth;
@@ -60,7 +61,6 @@
                         // TODO show a different status icon?
                     case BluetoothAdapter.STATE_OFF:
                         mIconRes = R.drawable.ic_settings_bluetooth_disabled;
-                        mText = mContext.getString(R.string.bluetooth_disabled);
                         mState = State.OFF;
                         break;
                     default:
@@ -91,27 +91,33 @@
         mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
         mBtStateChangeFilter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
         mContext.registerReceiver(mBtStateReceiver, mBtStateChangeFilter);
-        LocalBluetoothManager mLocalManager = LocalBluetoothManager.getInstance(
+        mLocalManager = LocalBluetoothManager.getInstance(
                 mContext, null /* listener */);
         if (mLocalManager == null) {
             Log.e(TAG, "Bluetooth is not supported on this device");
-            mIconRes = R.drawable.ic_settings_bluetooth_disabled;
-            mText = mContext.getString(R.string.bluetooth_disabled);
-            mState = State.OFF;
             return;
         }
+        mText = mContext.getString(R.string.bluetooth_settings);
         mLocalAdapter = mLocalManager.getBluetoothAdapter();
         if (mLocalAdapter.isEnabled()) {
             mIconRes = R.drawable.ic_settings_bluetooth;
-            mText = mContext.getString(R.string.bluetooth_settings);
             mState = State.ON;
         } else {
             mIconRes = R.drawable.ic_settings_bluetooth_disabled;
-            mText = mContext.getString(R.string.bluetooth_disabled);
             mState = State.OFF;
         }
     }
 
+    @Nullable
+    public View.OnClickListener getDeepDiveListener() {
+        return null;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mLocalManager != null;
+    }
+
     @Override
     public Drawable getIcon() {
         return mContext.getDrawable(mIconRes);
@@ -120,6 +126,7 @@
     @Override
     @Nullable
     public String getText() {
+        // TODO: return connected ssid
         return mText;
     }
 
diff --git a/src/com/android/car/settings/quicksettings/DayNightTile.java b/src/com/android/car/settings/quicksettings/DayNightTile.java
index 1a6b5da..ef4107c 100644
--- a/src/com/android/car/settings/quicksettings/DayNightTile.java
+++ b/src/com/android/car/settings/quicksettings/DayNightTile.java
@@ -19,18 +19,12 @@
 import android.annotation.DrawableRes;
 import android.annotation.Nullable;
 import android.app.UiModeManager;
-import android.bluetooth.BluetoothAdapter;
-import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
 import android.graphics.drawable.Drawable;
-import android.util.Log;
 import android.view.View;
+import android.view.View.OnClickListener;
 
 import com.android.car.settings.R;
-import com.android.settingslib.bluetooth.LocalBluetoothAdapter;
-import com.android.settingslib.bluetooth.LocalBluetoothManager;
 
 /**
  * Controls Day night mode tile on quick setting page.
@@ -43,7 +37,7 @@
     @DrawableRes
     private int mIconRes = R.drawable.ic_settings_night_display;
 
-    private String mText = "night mode";
+    private final String mText;
 
     private State mState = State.ON;
 
@@ -52,10 +46,21 @@
         mContext = context;
         mUiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
         if (mUiModeManager.getNightMode() == UiModeManager.MODE_NIGHT_YES) {
-            mState = State.OFF;
-        } else {
             mState = State.ON;
+        } else {
+            mState = State.OFF;
         }
+        mText = mContext.getString(R.string.night_mode_tile_label);
+    }
+
+    @Nullable
+    public OnClickListener getDeepDiveListener() {
+        return null;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return true;
     }
 
     @Override
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingActivity.java b/src/com/android/car/settings/quicksettings/QuickSettingActivity.java
deleted file mode 100644
index be2ac37..0000000
--- a/src/com/android/car/settings/quicksettings/QuickSettingActivity.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2017 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.car.settings.quicksettings;
-
-import android.app.Dialog;
-import android.car.drivingstate.CarUxRestrictions;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.UserInfo;
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.support.v7.app.ActionBar;
-import android.support.v7.app.AppCompatActivity;
-import android.support.v7.widget.Toolbar;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.ImageView;
-import android.widget.TextView;
-
-import androidx.car.app.CarAlertDialog;
-import androidx.car.widget.PagedListView;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.CarSettingActivity;
-import com.android.car.settings.common.CarUxRestrictionsHelper;
-import com.android.car.settings.users.UserIconProvider;
-import com.android.settingslib.users.UserManagerHelper;
-
-/**
- * Shows a page to access frequently used settings.
- */
-public class QuickSettingActivity extends AppCompatActivity {
-    private static final String TAG = "QS";
-    private static final String DIALOG_TAG = "block_dialog_tag";
-
-    private static final float RESTRICTED_ALPHA = 0.5f;
-    private static final float UNRESTRICTED_ALPHA = 1f;
-
-    private CarUxRestrictionsHelper mUxRestrictionsHelper;
-    private UserManagerHelper  mUserManagerHelper;
-    private QuickSettingGridAdapter mGridAdapter;
-    private PagedListView mListView;
-    private View mFullSettingBtn;
-    private View mUserSwitcherBtn;
-
-    private final OnClickListener mLaunchSettingListener = v -> {
-        Intent intent = new Intent(this, CarSettingActivity.class);
-        startActivity(intent);
-    };
-
-    private final OnClickListener mBlockingListener = v -> {
-        AlertDialogFragment alertDialog = new AlertDialogFragment();
-        alertDialog.show(getSupportFragmentManager(), DIALOG_TAG);
-    };
-
-    /**
-     * Shows a dialog to notify user that the actions is not available while driving.
-     */
-    public static class AlertDialogFragment extends DialogFragment {
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            Context context = getContext();
-            return new CarAlertDialog.Builder(context)
-                    .setBody(context.getString(R.string.restricted_while_driving))
-                    .setPositiveButton(context.getString(R.string.okay),
-                            /* listener= */ null)
-                    .create();
-        }
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mUserManagerHelper = new UserManagerHelper(this);
-        setContentView(R.layout.quick_settings);
-        mListView = (PagedListView) findViewById(R.id.list);
-        mGridAdapter = new QuickSettingGridAdapter(this);
-        mListView.getRecyclerView().setLayoutManager(mGridAdapter.getGridLayoutManager());
-        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
-        // make the toolbar take the whole width.
-        toolbar.setPadding(0, 0, 0, 0);
-        setSupportActionBar(toolbar);
-        ActionBar actionBar = getSupportActionBar();
-        actionBar.setDisplayHomeAsUpEnabled(false);
-        actionBar.setCustomView(R.layout.action_bar_quick_settings);
-        actionBar.setDisplayShowCustomEnabled(true);
-
-        mFullSettingBtn = findViewById(R.id.full_setting_btn);
-        mUserSwitcherBtn = findViewById(R.id.user_switcher_btn);
-        mUserSwitcherBtn.setOnClickListener(v -> {
-            Intent intent = new Intent(this, CarSettingActivity.class);
-            intent.setAction(CarSettingActivity.ACTION_LIST_USER);
-            startActivity(intent);
-        });
-
-        setupAccountButton();
-        View exitBtn = findViewById(R.id.exit_button);
-        exitBtn.setOnClickListener(v -> finish());
-        mUxRestrictionsHelper =
-                new CarUxRestrictionsHelper(
-                        this, QuickSettingActivity.this::onUxRestrictionChagned);
-    }
-
-    private void setupAccountButton() {
-        ImageView userIcon = (ImageView) findViewById(R.id.user_icon);
-        UserInfo currentUserInfo = mUserManagerHelper.getForegroundUserInfo();
-        userIcon.setImageDrawable(
-                UserIconProvider.getUserIcon(currentUserInfo, mUserManagerHelper, this));
-
-        TextView userSwitcherText = (TextView) findViewById(R.id.user_switcher_text);
-        userSwitcherText.setText(currentUserInfo.name);
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-
-        mGridAdapter
-                .addTile(new WifiTile(this, mGridAdapter))
-                .addTile(new BluetoothTile(this, mGridAdapter))
-                .addTile(new DayNightTile(this, mGridAdapter))
-                .addSeekbarTile(new BrightnessTile(this));
-        mListView.setAdapter(mGridAdapter);
-        mUxRestrictionsHelper.start();
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        mGridAdapter.stop();
-        mUxRestrictionsHelper.stop();
-    }
-
-    private void onUxRestrictionChagned(CarUxRestrictions carUxRestrictions) {
-        // TODO: update tiles
-        applyRestriction(
-                (carUxRestrictions.getActiveRestrictions()
-                        & CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP)
-                        == CarUxRestrictions.UX_RESTRICTIONS_NO_SETUP);
-    }
-
-    private void applyRestriction(boolean restricted) {
-        if (restricted) {
-            mFullSettingBtn.setAlpha(RESTRICTED_ALPHA);
-            mFullSettingBtn.setOnClickListener(mBlockingListener);
-        } else {
-            mFullSettingBtn.setAlpha(UNRESTRICTED_ALPHA);
-            mFullSettingBtn.setOnClickListener(mLaunchSettingListener);
-        }
-    }
-}
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingFragment.java b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
new file mode 100644
index 0000000..bae76a6
--- /dev/null
+++ b/src/com/android/car/settings/quicksettings/QuickSettingFragment.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2018 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.car.settings.quicksettings;
+
+import android.car.drivingstate.CarUxRestrictions;
+import android.content.pm.UserInfo;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.car.widget.PagedListView;
+
+import com.android.car.settings.R;
+import com.android.car.settings.common.BaseFragment;
+import com.android.car.settings.common.CarUxRestrictionsHelper;
+import com.android.car.settings.home.HomepageFragment;
+import com.android.car.settings.users.UserIconProvider;
+import com.android.car.settings.users.UsersListFragment;
+import com.android.settingslib.users.UserManagerHelper;
+
+/**
+ * Shows a page to access frequently used settings.
+ */
+public class QuickSettingFragment extends BaseFragment {
+    private static final String TAG = "QS";
+
+    private static final float RESTRICTED_ALPHA = 0.5f;
+    private static final float UNRESTRICTED_ALPHA = 1f;
+
+    private UserManagerHelper  mUserManagerHelper;
+    private QuickSettingGridAdapter mGridAdapter;
+    private PagedListView mListView;
+    private View mFullSettingBtn;
+    private View mUserSwitcherBtn;
+
+    /**
+     * Returns an instance of this class.
+     */
+    public static QuickSettingFragment newInstance() {
+        QuickSettingFragment quickSettingFragment = new QuickSettingFragment();
+        Bundle bundle = quickSettingFragment.getBundle();
+        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_quick_settings);
+        bundle.putInt(EXTRA_LAYOUT, R.layout.quick_settings);
+        bundle.putInt(EXTRA_TITLE_ID, R.string.settings_label);
+        quickSettingFragment.setArguments(bundle);
+        return quickSettingFragment;
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+        getActivity().findViewById(R.id.action_bar_icon_container).setOnClickListener(
+                v -> getActivity().finish());
+
+        mUserManagerHelper = new UserManagerHelper(getContext());
+        mListView = (PagedListView) getActivity().findViewById(R.id.list);
+        mGridAdapter = new QuickSettingGridAdapter(getContext());
+        mListView.getRecyclerView().setLayoutManager(mGridAdapter.getGridLayoutManager());
+
+        mFullSettingBtn = getActivity().findViewById(R.id.full_setting_btn);
+        mFullSettingBtn.setOnClickListener(v -> {
+            mFragmentController.launchFragment(HomepageFragment.getInstance());
+        });
+        mUserSwitcherBtn = getActivity().findViewById(R.id.user_switcher_btn);
+        mUserSwitcherBtn.setOnClickListener(v -> {
+            mFragmentController.launchFragment(UsersListFragment.newInstance());
+        });
+
+        setupAccountButton();
+        View exitBtn = getActivity().findViewById(R.id.exit_button);
+        exitBtn.setOnClickListener(v -> mFragmentController.goBack());
+
+        mGridAdapter
+                .addTile(new WifiTile(getContext(), mGridAdapter, mFragmentController))
+                .addTile(new BluetoothTile(getContext(), mGridAdapter))
+                .addTile(new DayNightTile(getContext(), mGridAdapter))
+                .addSeekbarTile(new BrightnessTile(getContext()));
+        mListView.setAdapter(mGridAdapter);
+    }
+
+    @Override
+    public void onStop() {
+        super.onStop();
+        mGridAdapter.stop();
+    }
+
+    private void setupAccountButton() {
+        ImageView userIcon = (ImageView) getActivity().findViewById(R.id.user_icon);
+        UserInfo currentUserInfo = mUserManagerHelper.getForegroundUserInfo();
+        userIcon.setImageDrawable(
+                UserIconProvider.getUserIcon(
+                        currentUserInfo, mUserManagerHelper, getContext()));
+
+        TextView userSwitcherText = (TextView) getActivity().findViewById(R.id.user_switcher_text);
+        userSwitcherText.setText(currentUserInfo.name);
+    }
+
+    /**
+     * Quick setting fragment is distraction optimized, so is allowed at all times.
+     */
+    @Override
+    public boolean canBeShown(CarUxRestrictions carUxRestrictions) {
+        return true;
+    }
+
+    @Override
+    public void onUxRestrictionChanged(CarUxRestrictions carUxRestrictions) {
+        // TODO: update tiles
+        applyRestriction(CarUxRestrictionsHelper.isNoSetup(carUxRestrictions));
+    }
+
+    private void applyRestriction(boolean restricted) {
+        mFullSettingBtn.setAlpha(restricted ? RESTRICTED_ALPHA : UNRESTRICTED_ALPHA);
+    }
+}
diff --git a/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java b/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
index 45012f4..6c392ca 100644
--- a/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
+++ b/src/com/android/car/settings/quicksettings/QuickSettingGridAdapter.java
@@ -23,6 +23,7 @@
 import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.SeekBar;
@@ -39,9 +40,6 @@
 public class QuickSettingGridAdapter
         extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements StateChangedListener {
     private static final int COLUMN_COUNT = 4;
-    // alpha value for icon or text.
-    private static final int ALPHA_DISABLED = 128;
-    private static final int ALPHA_ENABLED = 255;
     private static final int SEEKBAR_VIEWTYPE = 0;
     private static final int TILE_VIEWTYPE = 1;
     private final Context mContext;
@@ -84,6 +82,18 @@
         String getText();
 
         State getState();
+
+        /**
+         * Returns {@code true} if this tile should be displayed.
+         */
+        boolean isAvailable();
+
+        /**
+         * Returns a listener for launching a setting fragment for advanced configuration for this
+         * tile, A.K.A deep dive, if available. {@code null} if deep dive is not available.
+         */
+        @Nullable
+        OnClickListener getDeepDiveListener();
     }
 
     interface SeekbarTile extends SeekBar.OnSeekBarChangeListener {
@@ -103,7 +113,9 @@
     }
 
     QuickSettingGridAdapter addTile(Tile tile) {
-        mTiles.add(tile);
+        if (tile.isAvailable()) {
+            mTiles.add(tile);
+        }
         return this;
     }
 
@@ -145,15 +157,31 @@
             case TILE_VIEWTYPE:
                 Tile tile = mTiles.get(position - mSeekbarTiles.size());
                 TileViewHolder vh = (TileViewHolder) holder;
+                OnClickListener deepDiveListener = tile.getDeepDiveListener();
+                if (deepDiveListener != null) {
+                    vh.mDeepDiveIcon.setVisibility(View.VISIBLE);
+                    vh.mTextContainer.setOnClickListener(deepDiveListener);
+                    vh.mIconContainer.setOnClickListener(tile);
+                    vh.itemView.setOnClickListener(null);
+                    vh.itemView.setClickable(false);
+                } else {
+                    vh.itemView.setOnClickListener(tile);
+                    vh.itemView.setClickable(true);
+                    vh.mIconContainer.setOnClickListener(null);
+                    vh.mIconContainer.setClickable(false);
+                    vh.mDeepDiveIcon.setVisibility(View.GONE);
+                    vh.mTextContainer.setClickable(false);
+                    vh.mTextContainer.setOnClickListener(null);
+                }
                 vh.mIcon.setImageDrawable(tile.getIcon());
                 switch (tile.getState()) {
                     case ON:
-                        vh.mIcon.setAlpha(ALPHA_ENABLED);
-                        vh.mText.setAlpha(ALPHA_ENABLED);
+                        vh.mIcon.setEnabled(true);
+                        vh.mIconBackground.setEnabled(true);
                         break;
                     case OFF:
-                        vh.mIcon.setAlpha(ALPHA_DISABLED);
-                        vh.mText.setAlpha(ALPHA_DISABLED);
+                        vh.mIcon.setEnabled(false);
+                        vh.mIconBackground.setEnabled(false);
                         break;
                     default:
                 }
@@ -161,7 +189,6 @@
                 if (!TextUtils.isEmpty(textString)) {
                     vh.mText.setText(textString);
                 }
-                vh.itemView.setOnClickListener(tile);
                 break;
             default:
         }
@@ -177,12 +204,20 @@
     }
 
     private class TileViewHolder extends RecyclerView.ViewHolder {
+        private final View mIconContainer;
+        private final View mTextContainer;
+        private final View mIconBackground;
         private final ImageView mIcon;
+        private final ImageView mDeepDiveIcon;
         private final TextView mText;
 
         TileViewHolder(View view) {
             super(view);
+            mIconContainer = view.findViewById(R.id.icon_container);
+            mTextContainer = view.findViewById(R.id.text_container);
+            mIconBackground = view.findViewById(R.id.icon_background);
             mIcon = (ImageView) view.findViewById(R.id.tile_icon);
+            mDeepDiveIcon = (ImageView) view.findViewById(R.id.deep_dive_icon);
             mText = (TextView) view.findViewById(R.id.tile_text);
         }
     }
diff --git a/src/com/android/car/settings/quicksettings/WifiTile.java b/src/com/android/car/settings/quicksettings/WifiTile.java
index 664a817..30191bf 100644
--- a/src/com/android/car/settings/quicksettings/WifiTile.java
+++ b/src/com/android/car/settings/quicksettings/WifiTile.java
@@ -19,13 +19,15 @@
 import android.annotation.DrawableRes;
 import android.annotation.Nullable;
 import android.content.Context;
-import android.content.Intent;
+import android.content.pm.PackageManager;
 import android.graphics.drawable.Drawable;
 import android.view.View;
+import android.view.View.OnClickListener;
 
 import com.android.car.settings.R;
-import com.android.car.settings.common.CarSettingActivity;
+import com.android.car.settings.common.BaseFragment.FragmentController;
 import com.android.car.settings.wifi.CarWifiManager;
+import com.android.car.settings.wifi.WifiSettingsFragment;
 import com.android.car.settings.wifi.WifiUtil;
 import com.android.settingslib.wifi.AccessPoint;
 
@@ -33,9 +35,13 @@
  * Controls Wifi tile on quick setting page.
  */
 public class WifiTile implements QuickSettingGridAdapter.Tile, CarWifiManager.Listener {
+    private static final String TAG = "WifiTile";
     private final StateChangedListener mStateChangedListener;
     private final CarWifiManager mCarWifiManager;
     private final Context mContext;
+    private final FragmentController mFragmentController;
+
+    private final OnClickListener mSwitchSavedWifiListener;
 
     @DrawableRes
     private int mIconRes = R.drawable.ic_settings_wifi;
@@ -44,15 +50,33 @@
 
     private State mState = State.OFF;
 
-    WifiTile(Context context, StateChangedListener stateChangedListener) {
+    WifiTile(Context context, StateChangedListener stateChangedListener,
+            FragmentController fragmentController) {
         mContext = context;
+        mFragmentController = fragmentController;
+        mSwitchSavedWifiListener = v -> {
+            mFragmentController.launchFragment(
+                    WifiSettingsFragment.getInstance().showSavedApOnly(true));
+        };
         mCarWifiManager = new CarWifiManager(context, this /* listener */);
         mCarWifiManager.start();
         mStateChangedListener = stateChangedListener;
         // init icon and text etc.
+        updateAccessPointSsid();
         onWifiStateChanged(mCarWifiManager.getWifiState());
     }
 
+    @Nullable
+    public OnClickListener getDeepDiveListener() {
+        return !mCarWifiManager.getSavedAccessPoints().isEmpty()
+                ? mSwitchSavedWifiListener : null;
+    }
+
+    @Override
+    public boolean isAvailable() {
+        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI);
+    }
+
     @Override
     public Drawable getIcon() {
         return mContext.getDrawable(mIconRes);
@@ -100,9 +124,7 @@
     @Override
     public void onClick(View v) {
         if (wifiEnabledNotConnected()) {
-            Intent intent = new Intent(mContext, CarSettingActivity.class);
-            intent.setAction(CarSettingActivity.ACTION_ADD_WIFI);
-            mContext.startActivity(intent);
+            mFragmentController.launchFragment(WifiSettingsFragment.getInstance());
         } else {
             mCarWifiManager.setWifiEnabled(!mCarWifiManager.isWifiEnabled());
         }
diff --git a/src/com/android/car/settings/wifi/AccessPointListAdapter.java b/src/com/android/car/settings/wifi/AccessPointListAdapter.java
index 8baa8eb..4e9f0ce 100644
--- a/src/com/android/car/settings/wifi/AccessPointListAdapter.java
+++ b/src/com/android/car/settings/wifi/AccessPointListAdapter.java
@@ -29,14 +29,14 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
+import androidx.car.widget.PagedListView;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
 import com.android.settingslib.wifi.AccessPoint;
 
 import java.util.List;
 
-import androidx.car.widget.PagedListView;
-
 /**
  * Renders {@link AccessPoint} to a view to be displayed as a row in a list.
  */
@@ -58,6 +58,7 @@
     private final BaseFragment.FragmentController mFragmentController;
     private final CarWifiManager mCarWifiManager;
     private final WifiManager.ActionListener mConnectionListener;
+    private final boolean mShowAddNetworkRow;
 
     private List<AccessPoint> mAccessPoints;
 
@@ -65,8 +66,10 @@
             @NonNull Context context,
             CarWifiManager carWifiManager,
             @NonNull List<AccessPoint> accesssPoints,
+            boolean showAddNetworkRow,
             BaseFragment.FragmentController fragmentController) {
         mContext = context;
+        mShowAddNetworkRow = showAddNetworkRow;
         mFragmentController = fragmentController;
         mCarWifiManager = carWifiManager;
         mAccessPoints = accesssPoints;
@@ -184,7 +187,7 @@
     @Override
     public int getItemCount() {
         // number of rows include one per device and a row for add network.
-        return mAccessPoints.size() + 1;
+        return mShowAddNetworkRow ? mAccessPoints.size() + 1 : mAccessPoints.size();
     }
 
     @Override
diff --git a/src/com/android/car/settings/wifi/CarWifiManager.java b/src/com/android/car/settings/wifi/CarWifiManager.java
index 07bd79b..872c222 100644
--- a/src/com/android/car/settings/wifi/CarWifiManager.java
+++ b/src/com/android/car/settings/wifi/CarWifiManager.java
@@ -100,12 +100,26 @@
         mWifiTracker.onDestroy();
     }
 
-    public List<AccessPoint> getAccessPoints() {
+    /**
+     * Returns a list of all reachable access points.
+     */
+    public List<AccessPoint> getAllAccessPoints() {
+        return getAccessPoints(false);
+    }
+
+    /**
+     * Returns a list of saved access points.
+     */
+    public List<AccessPoint> getSavedAccessPoints() {
+        return getAccessPoints(true);
+    }
+
+    private List<AccessPoint> getAccessPoints(boolean saved) {
         List<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
         if (mWifiManager.isWifiEnabled()) {
             for (AccessPoint accessPoint : mWifiTracker.getAccessPoints()) {
                 // ignore out of reach access points.
-                if (accessPoint.isReachable()) {
+                if (shouldIncludeAp(accessPoint, saved)) {
                     accessPoints.add(accessPoint);
                 }
             }
@@ -113,9 +127,14 @@
         return accessPoints;
     }
 
+    private boolean shouldIncludeAp(AccessPoint accessPoint, boolean saved) {
+        return saved ? accessPoint.isReachable() && accessPoint.isSaved()
+                : accessPoint.isReachable();
+    }
+
     @Nullable
     public AccessPoint getConnectedAccessPoint() {
-        for (AccessPoint accessPoint : getAccessPoints()) {
+        for (AccessPoint accessPoint : getAllAccessPoints()) {
             if (accessPoint.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) {
                 return accessPoint;
             }
diff --git a/src/com/android/car/settings/wifi/WifiSettingsFragment.java b/src/com/android/car/settings/wifi/WifiSettingsFragment.java
index 4c19cc7..1bf5536 100644
--- a/src/com/android/car/settings/wifi/WifiSettingsFragment.java
+++ b/src/com/android/car/settings/wifi/WifiSettingsFragment.java
@@ -15,7 +15,9 @@
  */
 package com.android.car.settings.wifi;
 
+import android.annotation.NonNull;
 import android.annotation.StringRes;
+import android.car.drivingstate.CarUxRestrictions;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.view.View;
@@ -24,11 +26,11 @@
 import android.widget.TextView;
 import android.widget.ViewSwitcher;
 
+import androidx.car.widget.PagedListView;
+
 import com.android.car.settings.R;
 import com.android.car.settings.common.BaseFragment;
-
-import androidx.car.widget.DayNightStyle;
-import androidx.car.widget.PagedListView;
+import com.android.car.settings.common.CarUxRestrictionsHelper;
 
 /**
  * Main page to host Wifi related preferences.
@@ -43,6 +45,7 @@
     private PagedListView mListView;
     private TextView mMessageView;
     private ViewSwitcher mViewSwitcher;
+    private boolean mShowSavedApOnly;
 
     public static WifiSettingsFragment getInstance() {
         WifiSettingsFragment wifiSettingsFragment = new WifiSettingsFragment();
@@ -54,6 +57,14 @@
         return wifiSettingsFragment;
     }
 
+    /**
+     * Shows only saved wifi network.
+     */
+    public WifiSettingsFragment showSavedApOnly(boolean showSavedApOnly) {
+        mShowSavedApOnly = showSavedApOnly;
+        return this;
+    }
+
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
@@ -73,7 +84,10 @@
         mAdapter = new AccessPointListAdapter(
                 getContext(),
                 mCarWifiManager,
-                mCarWifiManager.getAccessPoints(),
+                mShowSavedApOnly
+                        ? mCarWifiManager.getSavedAccessPoints()
+                        : mCarWifiManager.getAllAccessPoints(),
+                !mShowSavedApOnly,
                 mFragmentController);
         mListView.setAdapter(mAdapter);
     }
@@ -118,6 +132,20 @@
         }
     }
 
+    /**
+     * This fragment will adapt to restriction, so can always be shown.
+     */
+    @Override
+    public boolean canBeShown(CarUxRestrictions carUxRestrictions) {
+        return true;
+    }
+
+    @Override
+    public void onUxRestrictionChanged(@NonNull CarUxRestrictions carUxRestrictions) {
+        mShowSavedApOnly = CarUxRestrictionsHelper.isNoSetup(carUxRestrictions);
+        refreshData();
+    }
+
     private  void setProgressBarVisible(boolean visible) {
         if (mProgressBar != null) {
             mProgressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
@@ -126,7 +154,9 @@
 
     private void refreshData() {
         if (mAdapter != null) {
-            mAdapter.updateAccessPoints(mCarWifiManager.getAccessPoints());
+            mAdapter.updateAccessPoints(mShowSavedApOnly
+                    ? mCarWifiManager.getSavedAccessPoints()
+                    : mCarWifiManager.getAllAccessPoints());
             // if the list is empty, keep showing the progress bar, the list should reset
             // every couple seconds.
             // TODO: Consider show a message in the list view place.
@@ -134,7 +164,9 @@
                 setProgressBarVisible(false);
             }
         }
-        mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
+        if (mCarWifiManager != null) {
+            mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
+        }
     }
 
     private void showMessage(@StringRes int resId) {