diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 8389d84..acf1848 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -251,4 +251,8 @@
      */
     public static class MediaControlsSettingsActivity extends SettingsActivity {}
 
+    /**
+     * Activity for AppDashboard.
+     */
+    public static class AppDashboardActivity extends SettingsActivity {}
 }
diff --git a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
index 84e7bf7..ddb3951 100644
--- a/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
+++ b/src/com/android/settings/applications/AppAndNotificationDashboardFragment.java
@@ -67,10 +67,6 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        // TODO(b/168166015): Remove this when the new Apps page ready.
-        if (FeatureFlagUtils.isEnabled(getContext(), FeatureFlags.SILKY_HOME)) {
-            return R.xml.apps;
-        }
         return R.xml.app_and_notification;
     }
 
@@ -142,5 +138,14 @@
                         Context context) {
                     return buildPreferenceControllers(context);
                 }
+
+                @Override
+                protected boolean isPageSearchEnabled(Context context) {
+                    // TODO(b/174964405): This method should be removed when silky home launched.
+                    // This page is going to deprecate, we should make this page unsearchable
+                    // when the silky home is enabled, otherwise search results will contain the
+                    // old data and launch this page even if the silky home is enabled.
+                    return !FeatureFlagUtils.isEnabled(context, FeatureFlags.SILKY_HOME);
+                }
             };
 }
diff --git a/src/com/android/settings/applications/AppDashboardFragment.java b/src/com/android/settings/applications/AppDashboardFragment.java
new file mode 100644
index 0000000..d513cc7
--- /dev/null
+++ b/src/com/android/settings/applications/AppDashboardFragment.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications;
+
+import android.app.settings.SettingsEnums;
+import android.content.Context;
+
+import com.android.settings.R;
+import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.search.BaseSearchIndexProvider;
+import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.drawer.CategoryKey;
+import com.android.settingslib.search.SearchIndexable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Settings page for apps. */
+@SearchIndexable
+public class AppDashboardFragment extends DashboardFragment {
+
+    private static final String TAG = "AppDashboardFragment";
+    private AppsPreferenceController mAppsPreferenceController;
+
+    private static List<AbstractPreferenceController> buildPreferenceControllers(Context context) {
+        final List<AbstractPreferenceController> controllers = new ArrayList<>();
+        controllers.add(new AppsPreferenceController(context));
+        return controllers;
+    }
+
+    @Override
+    public int getMetricsCategory() {
+        return SettingsEnums.SETTINGS_APP_NOTIF_CATEGORY;
+    }
+
+    @Override
+    protected String getLogTag() {
+        return TAG;
+    }
+
+    @Override
+    public int getHelpResource() {
+        return R.string.help_url_apps_and_notifications;
+    }
+
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.apps;
+    }
+
+    @Override
+    public void onAttach(Context context) {
+        super.onAttach(context);
+        mAppsPreferenceController = use(AppsPreferenceController.class);
+        mAppsPreferenceController.setFragment(this /* fragment */);
+    }
+
+    @Override
+    protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
+        return buildPreferenceControllers(context);
+    }
+
+    @Override
+    public String getCategoryKey() {
+        // TODO(b/174964405): Remove this function when the silky flag was deprecated.
+        // To include injection tiles, map this app fragment to the app category in the short term.
+        // When we deprecate the silky flag, we have to:
+        // 1. Remove this method.
+        // 2. Update the mapping in DashboardFragmentRegistry.PARENT_TO_CATEGORY_KEY_MAP.
+        return CategoryKey.CATEGORY_APPS;
+    }
+
+    public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
+            new BaseSearchIndexProvider(R.xml.apps);
+}
diff --git a/src/com/android/settings/applications/AppsPreferenceController.java b/src/com/android/settings/applications/AppsPreferenceController.java
new file mode 100644
index 0000000..08fd9c5
--- /dev/null
+++ b/src/com/android/settings/applications/AppsPreferenceController.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.applications;
+
+import android.app.Application;
+import android.app.usage.UsageStats;
+import android.content.Context;
+import android.icu.text.RelativeDateTimeFormatter;
+import android.os.UserHandle;
+import android.text.TextUtils;
+import android.util.ArrayMap;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.fragment.app.Fragment;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceCategory;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.applications.appinfo.AppInfoDashboardFragment;
+import com.android.settings.core.BasePreferenceController;
+import com.android.settingslib.Utils;
+import com.android.settingslib.applications.ApplicationsState;
+import com.android.settingslib.utils.StringUtil;
+import com.android.settingslib.widget.AppPreference;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This controller displays up to four recently used apps.
+ * If there is no recently used app, we only show up an "App Info" preference.
+ */
+public class AppsPreferenceController extends BasePreferenceController {
+
+    public static final int SHOW_RECENT_APP_COUNT = 4;
+
+    @VisibleForTesting
+    static final String KEY_RECENT_APPS_CATEGORY = "recent_apps_category";
+    @VisibleForTesting
+    static final String KEY_GENERAL_CATEGORY = "general_category";
+    @VisibleForTesting
+    static final String KEY_ALL_APP_INFO = "all_app_info";
+    @VisibleForTesting
+    static final String KEY_SEE_ALL = "see_all_apps";
+
+    private final ApplicationsState mApplicationsState;
+    private final int mUserId;
+
+    @VisibleForTesting
+    List<UsageStats> mRecentApps;
+    @VisibleForTesting
+    PreferenceCategory mRecentAppsCategory;
+    @VisibleForTesting
+    PreferenceCategory mGeneralCategory;
+    @VisibleForTesting
+    Preference mAllAppsInfoPref;
+    @VisibleForTesting
+    Preference mSeeAllPref;
+
+    private Fragment mHost;
+
+    public AppsPreferenceController(Context context) {
+        super(context, KEY_RECENT_APPS_CATEGORY);
+        mApplicationsState = ApplicationsState.getInstance(
+                (Application) mContext.getApplicationContext());
+        mUserId = UserHandle.myUserId();
+    }
+
+    public void setFragment(Fragment fragment) {
+        mHost = fragment;
+    }
+
+    @Override
+    public int getAvailabilityStatus() {
+        return AVAILABLE_UNSEARCHABLE;
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        initPreferences(screen);
+        refreshUi();
+    }
+
+    @Override
+    public void updateState(Preference preference) {
+        super.updateState(preference);
+        refreshUi();
+    }
+
+    @VisibleForTesting
+    void refreshUi() {
+        loadAllAppsCount();
+        mRecentApps = loadRecentApps();
+        if (!mRecentApps.isEmpty()) {
+            displayRecentApps();
+            mRecentAppsCategory.setVisible(true);
+            mGeneralCategory.setVisible(true);
+            mSeeAllPref.setVisible(true);
+        } else {
+            mAllAppsInfoPref.setVisible(true);
+        }
+    }
+
+    @VisibleForTesting
+    void loadAllAppsCount() {
+        // Show total number of installed apps as See all's summary.
+        new InstalledAppCounter(mContext, InstalledAppCounter.IGNORE_INSTALL_REASON,
+                mContext.getPackageManager()) {
+            @Override
+            protected void onCountComplete(int num) {
+                if (!mRecentApps.isEmpty()) {
+                    mSeeAllPref.setTitle(
+                            mContext.getResources().getQuantityString(R.plurals.see_all_apps_title,
+                                    num, num));
+                } else {
+                    mAllAppsInfoPref.setSummary(mContext.getString(R.string.apps_summary, num));
+                }
+            }
+        }.execute();
+    }
+
+    @VisibleForTesting
+    List<UsageStats> loadRecentApps() {
+        final RecentAppStatsMixin recentAppStatsMixin = new RecentAppStatsMixin(mContext,
+                SHOW_RECENT_APP_COUNT);
+        recentAppStatsMixin.loadDisplayableRecentApps(SHOW_RECENT_APP_COUNT);
+        return recentAppStatsMixin.mRecentApps;
+    }
+
+    private void initPreferences(PreferenceScreen screen) {
+        mRecentAppsCategory = screen.findPreference(KEY_RECENT_APPS_CATEGORY);
+        mGeneralCategory = screen.findPreference(KEY_GENERAL_CATEGORY);
+        mAllAppsInfoPref = screen.findPreference(KEY_ALL_APP_INFO);
+        mSeeAllPref = screen.findPreference(KEY_SEE_ALL);
+        mRecentAppsCategory.setVisible(false);
+        mGeneralCategory.setVisible(false);
+        mAllAppsInfoPref.setVisible(false);
+        mSeeAllPref.setVisible(false);
+    }
+
+    private void displayRecentApps() {
+        if (mRecentAppsCategory != null) {
+            final Map<String, Preference> existedAppPreferences = new ArrayMap<>();
+            final int prefCount = mRecentAppsCategory.getPreferenceCount();
+            for (int i = 0; i < prefCount; i++) {
+                final Preference pref = mRecentAppsCategory.getPreference(i);
+                final String key = pref.getKey();
+                if (!TextUtils.equals(key, KEY_SEE_ALL)) {
+                    existedAppPreferences.put(key, pref);
+                }
+            }
+
+            int showAppsCount = 0;
+            for (UsageStats stat : mRecentApps) {
+                final String pkgName = stat.getPackageName();
+                final ApplicationsState.AppEntry appEntry =
+                        mApplicationsState.getEntry(pkgName, mUserId);
+                if (appEntry == null) {
+                    continue;
+                }
+
+                boolean rebindPref = true;
+                Preference pref = existedAppPreferences.remove(pkgName);
+                if (pref == null) {
+                    pref = new AppPreference(mContext);
+                    rebindPref = false;
+                }
+
+                pref.setKey(pkgName);
+                pref.setTitle(appEntry.label);
+                pref.setIcon(Utils.getBadgedIcon(mContext, appEntry.info));
+                pref.setSummary(StringUtil.formatRelativeTime(mContext,
+                        System.currentTimeMillis() - stat.getLastTimeUsed(), false,
+                        RelativeDateTimeFormatter.Style.SHORT));
+                pref.setOrder(showAppsCount++);
+                pref.setOnPreferenceClickListener(preference -> {
+                    AppInfoBase.startAppInfoFragment(AppInfoDashboardFragment.class,
+                            R.string.application_info_label, pkgName, appEntry.info.uid,
+                            mHost, 1001 /*RequestCode*/, getMetricsCategory());
+                    return true;
+                });
+
+                if (!rebindPref) {
+                    mRecentAppsCategory.addPreference(pref);
+                }
+            }
+
+            // Remove unused preferences from pref category.
+            for (Preference unusedPref : existedAppPreferences.values()) {
+                mRecentAppsCategory.removePreference(unusedPref);
+            }
+        }
+    }
+}
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index 2c21771..0e0d3eb 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -35,6 +35,7 @@
 import com.android.settings.accounts.ChooseAccountFragment;
 import com.android.settings.accounts.ManagedProfileSettings;
 import com.android.settings.applications.AppAndNotificationDashboardFragment;
+import com.android.settings.applications.AppDashboardFragment;
 import com.android.settings.applications.ProcessStatsSummary;
 import com.android.settings.applications.ProcessStatsUi;
 import com.android.settings.applications.UsageAccessDetails;
@@ -289,6 +290,7 @@
             ConnectedDeviceDashboardFragment.class.getName(),
             UsbDetailsFragment.class.getName(),
             AppAndNotificationDashboardFragment.class.getName(),
+            AppDashboardFragment.class.getName(),
             WifiCallingDisclaimerFragment.class.getName(),
             AccountDashboardFragment.class.getName(),
             EnterprisePrivacySettings.class.getName(),
@@ -317,6 +319,7 @@
             Settings.NetworkDashboardActivity.class.getName(),
             Settings.ConnectedDeviceDashboardActivity.class.getName(),
             Settings.AppAndNotificationDashboardActivity.class.getName(),
+            Settings.AppDashboardActivity.class.getName(),
             Settings.DisplaySettingsActivity.class.getName(),
             Settings.SoundSettingsActivity.class.getName(),
             Settings.StorageDashboardActivity.class.getName(),
