- refactor application setting to use paged list view
- refactor sound setting to use paged list view
- removed unused UI classes
- ui changes according to spec

Test: manually verified
Change-Id: Iace0f88ed627621682d0e6c0cb0c07badc466076
diff --git a/src/com/android/car/settings/applications/ApplicationDetailActivity.java b/src/com/android/car/settings/applications/ApplicationDetailActivity.java
index ac071f0..a5bc882 100644
--- a/src/com/android/car/settings/applications/ApplicationDetailActivity.java
+++ b/src/com/android/car/settings/applications/ApplicationDetailActivity.java
@@ -38,6 +38,7 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 
@@ -55,6 +56,9 @@
  */
 public class ApplicationDetailActivity extends CarSettingActivity {
     private static final String TAG = "AppDetailActivity";
+    /**
+     * Key for ResolvedInfo in bundle passed in.
+     */
     public static final String APPLICATION_INFO_KEY = "APPLICATION_INFO_KEY";
 
     private ResolveInfo mResolveInfo;
@@ -246,17 +250,15 @@
         }
     };
 
-    private OnClickListener mPermissionClickedListener = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            // start new activity to manage app permissions
-            Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
-            intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mResolveInfo.activityInfo.packageName);
-            try {
-                startActivity(intent);
-            } catch (ActivityNotFoundException e) {
-                Log.w(TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS");
-            }
+    private OnClickListener mPermissionClickedListener = (v) -> {
+        // start new activity to manage app permissions
+        Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS);
+        intent.putExtra(Intent.EXTRA_PACKAGE_NAME, mResolveInfo.activityInfo.packageName);
+        try {
+            startActivity(intent, AnimationUtil.slideInFromRightOption(
+                    ApplicationDetailActivity.this).toBundle());
+        } catch (ActivityNotFoundException e) {
+            Log.w(TAG, "No app can handle android.intent.action.MANAGE_APP_PERMISSIONS");
         }
     };
 }
diff --git a/src/com/android/car/settings/applications/ApplicationLineItem.java b/src/com/android/car/settings/applications/ApplicationLineItem.java
new file mode 100644
index 0000000..48625c6
--- /dev/null
+++ b/src/com/android/car/settings/applications/ApplicationLineItem.java
@@ -0,0 +1,69 @@
+/*
+ * 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.applications;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.widget.ImageView;
+
+import com.android.car.settings.common.AnimationUtil;
+import com.android.car.settings.common.IconTextLineItem;
+
+/**
+ * Represents an application in application settings page.
+ */
+public class ApplicationLineItem extends IconTextLineItem {
+    private final ResolveInfo mResolveInfo;
+    private final Context mContext;
+    private final PackageManager mPm;
+
+    public ApplicationLineItem(
+            @NonNull Context context, PackageManager pm, ResolveInfo resolveInfo) {
+        super(resolveInfo.loadLabel(pm));
+        mContext = context;
+        mPm = pm;
+        mResolveInfo = resolveInfo;
+    }
+
+
+    @Override
+    public void onClick() {
+        Intent intent = new Intent(mContext, ApplicationDetailActivity.class);
+        intent.putExtra(
+                ApplicationDetailActivity.APPLICATION_INFO_KEY, mResolveInfo);
+        mContext.startActivity(
+                intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
+    }
+
+    @Override
+    public boolean isEnabled() {
+        return true;
+    }
+
+    @Override
+    public CharSequence getDesc() {
+        return null;
+    }
+
+    @Override
+    public void setIcon(ImageView iconView) {
+        iconView.setImageDrawable(mResolveInfo.loadIcon(mPm));
+    }
+}
diff --git a/src/com/android/car/settings/applications/ApplicationListAdapter.java b/src/com/android/car/settings/applications/ApplicationListAdapter.java
index 0076d4c..625cf73 100644
--- a/src/com/android/car/settings/applications/ApplicationListAdapter.java
+++ b/src/com/android/car/settings/applications/ApplicationListAdapter.java
@@ -27,8 +27,11 @@
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
+
 import com.android.car.settings.R;
 import com.android.car.view.PagedListView;
+import com.android.car.settings.common.AnimationUtil;
+
 import java.util.Collections;
 import java.util.List;
 
@@ -85,7 +88,8 @@
             Intent intent = new Intent(mContext, ApplicationDetailActivity.class);
             intent.putExtra(
                 ApplicationDetailActivity.APPLICATION_INFO_KEY, resolveInfo);
-            mContext.startActivity(intent);
+            mContext.startActivity(
+                    intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
         }
     };
 
@@ -93,7 +97,7 @@
     public ApplicationListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
             int viewType) {
         View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.list_item, parent, false);
+                .inflate(R.layout.icon_widget_line_item, parent, false);
         return new ViewHolder(v);
     }
 
diff --git a/src/com/android/car/settings/applications/ApplicationSettingsActivity.java b/src/com/android/car/settings/applications/ApplicationSettingsActivity.java
index bd6ca2a..ed0b19a 100644
--- a/src/com/android/car/settings/applications/ApplicationSettingsActivity.java
+++ b/src/com/android/car/settings/applications/ApplicationSettingsActivity.java
@@ -15,32 +15,39 @@
  */
 package com.android.car.settings.applications;
 
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.os.Bundle;
-import android.support.v7.widget.RecyclerView;
-import com.android.car.settings.common.CarSettingActivity;
-import com.android.car.settings.R;
-import com.android.car.settings.common.NoDividerItemDecoration;
-import com.android.car.view.PagedListView;
+
+import com.android.car.settings.common.ListSettingsActivity;
+import com.android.car.settings.common.TypedPagedListAdapter;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Lists all installed applications and their summary.
  */
-public class ApplicationSettingsActivity extends CarSettingActivity {
-    private static final String TAG = "ApplicationSettingsActivity";
-
-    private PagedListView mListView;
-    private ApplicationListAdapter mAdapter;
+public class ApplicationSettingsActivity extends ListSettingsActivity {
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.paged_list);
-
-        mListView = (PagedListView) findViewById(R.id.list);
-        mListView.setDefaultItemDecoration(new NoDividerItemDecoration(this));
-        mListView.setDarkMode();
-        mAdapter = new ApplicationListAdapter(this /* context */, getPackageManager());
-        mListView.setAdapter(mAdapter);
     }
 
+    @Override
+    public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
+        PackageManager pm = getPackageManager();
+        Intent intent= new Intent(Intent.ACTION_MAIN);
+        intent.addCategory(Intent.CATEGORY_LAUNCHER);
+        List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent,
+                PackageManager.MATCH_DISABLED_UNTIL_USED_COMPONENTS
+                        | PackageManager.MATCH_DISABLED_COMPONENTS);
+        ArrayList<TypedPagedListAdapter.LineItem> items = new ArrayList<>();
+        for (ResolveInfo resolveInfo : resolveInfos) {
+            items.add(new ApplicationLineItem(this, pm, resolveInfo));
+        }
+        return items;
+    }
 }
diff --git a/src/com/android/car/settings/bluetooth/BluetoothDeviceListAdapter.java b/src/com/android/car/settings/bluetooth/BluetoothDeviceListAdapter.java
index 2449746..c472c85 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothDeviceListAdapter.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothDeviceListAdapter.java
@@ -39,6 +39,7 @@
 
 import com.android.car.settings.R;
 import com.android.car.view.PagedListView;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.settingslib.bluetooth.BluetoothCallback;
 import com.android.settingslib.bluetooth.BluetoothDeviceFilter;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
@@ -160,7 +161,7 @@
                 ((TextView) v).setText(R.string.bluetooth_preference_found_devices);
                 break;
             default:
-                v = layoutInflater.inflate(R.layout.list_item, parent, false);
+                v = layoutInflater.inflate(R.layout.icon_widget_line_item, parent, false);
         }
         return new ViewHolder(v);
     }
@@ -202,7 +203,8 @@
                     Intent intent = new Intent(mContext, BluetoothDetailActivity.class);
                     intent.putExtra(
                             BluetoothDetailActivity.BT_DEVICE_KEY, bluetoothDevice.getDevice());
-                    mContext.startActivity(intent);
+                    mContext.startActivity(
+                            intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
                 });
         } else {
             holder.mActionButton.setVisibility(View.GONE);
diff --git a/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java b/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java
index ed09b4d..15ca09e 100644
--- a/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java
+++ b/src/com/android/car/settings/bluetooth/BluetoothSettingsActivity.java
@@ -16,8 +16,6 @@
 package com.android.car.settings.bluetooth;
 
 import android.bluetooth.BluetoothAdapter;
-import android.content.Context;
-import android.graphics.Canvas;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
@@ -81,7 +79,7 @@
         }
         mLocalAdapter = mLocalManager.getBluetoothAdapter();
 
-        mDeviceListView.setDefaultItemDecoration(new ItemDecoration(this));
+        mDeviceListView.setDefaultItemDecoration(new PagedListView.Decoration(this));
         // Set this to light mode, since the scroll bar buttons always appear
         // on top of a dark scrim.
         mDeviceListView.setDarkMode();
@@ -188,17 +186,4 @@
             mProgressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
         }
     }
-
-    /**
-     * Default {@link com.android.car.view.PagedListView.Decoration} for the {@link PagedListView}
-     * that removes the dividing lines between items.
-     */
-    private static class ItemDecoration extends PagedListView.Decoration {
-        public ItemDecoration(Context context) {
-            super(context);
-        }
-
-        @Override
-        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {}
-    }
 }
diff --git a/src/com/android/car/settings/common/AnimationUtil.java b/src/com/android/car/settings/common/AnimationUtil.java
new file mode 100644
index 0000000..4966c67
--- /dev/null
+++ b/src/com/android/car/settings/common/AnimationUtil.java
@@ -0,0 +1,38 @@
+/*
+ * 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.common;
+
+import android.app.ActivityOptions;
+import android.content.Context;
+
+import com.android.car.settings.R;
+
+/**
+ * Contains util function for animations.
+ */
+public class AnimationUtil {
+    private AnimationUtil() {
+    }
+
+    /**
+     * Animation that slide the new activity in from right.
+     */
+    public static ActivityOptions slideInFromRightOption(Context context) {
+        return ActivityOptions.makeCustomAnimation(
+                context, R.anim.trans_right_in , R.anim.trans_fade_out);
+    }
+}
diff --git a/src/com/android/car/settings/common/CarSettingActivity.java b/src/com/android/car/settings/common/CarSettingActivity.java
index b680e43..642ea30 100644
--- a/src/com/android/car/settings/common/CarSettingActivity.java
+++ b/src/com/android/car/settings/common/CarSettingActivity.java
@@ -17,9 +17,9 @@
 
 import android.app.Activity;
 import android.os.Bundle;
-import android.support.v4.app.NavUtils;
 import android.view.MenuItem;
 
+import com.android.car.settings.R;
 
 /**
  * Base activity class for car settings, provides a action bar with a back button that goes to
@@ -47,6 +47,7 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == android.R.id.home) {
                 onBackPressed();
+                overridePendingTransition(R.anim.trans_fade_in, R.anim.trans_right_out);
                 return true;
         }
         return super.onOptionsItemSelected(item);
diff --git a/src/com/android/car/settings/common/IconTextLineItem.java b/src/com/android/car/settings/common/IconTextLineItem.java
index 62e8650..2c0f7c3 100644
--- a/src/com/android/car/settings/common/IconTextLineItem.java
+++ b/src/com/android/car/settings/common/IconTextLineItem.java
@@ -16,7 +16,6 @@
 
 package com.android.car.settings.common;
 
-import android.annotation.DrawableRes;
 import android.support.v7.widget.RecyclerView;
 import android.text.TextUtils;
 import android.view.LayoutInflater;
@@ -33,14 +32,11 @@
 public abstract class IconTextLineItem
         extends TypedPagedListAdapter.LineItem<IconTextLineItem.ViewHolder> {
     private final CharSequence mTitle;
-    @DrawableRes
-    private final int mIconRes;
 
     private View.OnClickListener mOnClickListener = (v) -> onClick();
 
-    public IconTextLineItem(CharSequence title, @DrawableRes int iconRes) {
+    public IconTextLineItem(CharSequence title) {
         mTitle = title;
-        mIconRes = iconRes;
     }
 
     @Override
@@ -51,7 +47,7 @@
     @Override
     public void bindViewHolder(ViewHolder viewHolder) {
         viewHolder.titleView.setText(mTitle);
-        viewHolder.iconView.setImageResource(mIconRes);
+        setIcon(viewHolder.iconView);
         CharSequence desc = getDesc();
         if (TextUtils.isEmpty(desc)) {
             viewHolder.descView.setVisibility(View.GONE);
@@ -60,19 +56,27 @@
             viewHolder.descView.setText(desc);
         }
         viewHolder.itemView.setOnClickListener(mOnClickListener);
-        viewHolder.itemView.setEnabled(isEnabled());
+        if (isEnabled()) {
+            viewHolder.itemView.setEnabled(true);
+            viewHolder.rightArrow.setVisibility(View.VISIBLE);
+        } else {
+            viewHolder.itemView.setEnabled(false);
+            viewHolder.rightArrow.setVisibility(View.GONE);
+        }
     }
 
     static class ViewHolder extends RecyclerView.ViewHolder {
         final TextView titleView;
         final TextView descView;
         final ImageView iconView;
+        final ImageView rightArrow;
 
         public ViewHolder(View view) {
             super(view);
             iconView = (ImageView) view.findViewById(R.id.icon);
             titleView = (TextView) view.findViewById(R.id.title);
             descView = (TextView) view.findViewById(R.id.desc);
+            rightArrow = (ImageView) view.findViewById(R.id.right_chevron);
         }
     }
 
@@ -82,6 +86,8 @@
         return new ViewHolder(v);
     }
 
+    public abstract void setIcon(ImageView iconView);
+
     public abstract void onClick();
 
     public abstract boolean isEnabled();
diff --git a/src/com/android/car/settings/common/IconToggleLineItem.java b/src/com/android/car/settings/common/IconToggleLineItem.java
index ba56ab9..83b82cd 100644
--- a/src/com/android/car/settings/common/IconToggleLineItem.java
+++ b/src/com/android/car/settings/common/IconToggleLineItem.java
@@ -33,7 +33,7 @@
  */
 public abstract class IconToggleLineItem
         extends TypedPagedListAdapter.LineItem<IconToggleLineItem.ViewHolder> {
-    private final Context mContext;
+    protected final Context mContext;
     private final CharSequence mTitle;
     protected IconUpdateListener mIconUpdateListener;
 
@@ -88,7 +88,7 @@
 
     public static RecyclerView.ViewHolder createViewHolder(ViewGroup parent) {
         View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.tile_item, parent, false);
+                .inflate(R.layout.icon_toggle_line_item, parent, false);
         return new ViewHolder(v);
     }
 
diff --git a/src/com/android/car/settings/common/ListSettingsActivity.java b/src/com/android/car/settings/common/ListSettingsActivity.java
index f9c5745..9088c3a 100644
--- a/src/com/android/car/settings/common/ListSettingsActivity.java
+++ b/src/com/android/car/settings/common/ListSettingsActivity.java
@@ -34,10 +34,10 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.paged_list);
+        setContentView(R.layout.list);
 
         mListView = (PagedListView) findViewById(R.id.list);
-        mListView.setDefaultItemDecoration(new NoDividerItemDecoration(this));
+        mListView.setDefaultItemDecoration(getDecoration());
         mListView.setDarkMode();
         mPagedListAdapter = new TypedPagedListAdapter(this /* context */, getLineItems());
         mListView.setAdapter(mPagedListAdapter);
@@ -47,4 +47,11 @@
      * Gets a List of LineItems to show up in this activity.
      */
     public abstract ArrayList<TypedPagedListAdapter.LineItem> getLineItems();
+
+    /**
+     * Gets decoration for the list view.
+     */
+    protected PagedListView.Decoration getDecoration() {
+        return new PagedListView.Decoration(this);
+    }
 }
diff --git a/src/com/android/car/settings/common/SeekbarLineItem.java b/src/com/android/car/settings/common/SeekbarLineItem.java
index 294a248..1140f02 100644
--- a/src/com/android/car/settings/common/SeekbarLineItem.java
+++ b/src/com/android/car/settings/common/SeekbarLineItem.java
@@ -64,7 +64,7 @@
     public void bindViewHolder(ViewHolder viewHolder) {
         viewHolder.titleView.setText(mTitle);
         viewHolder.seekBar.setMax(getMaxSeekbarValue());
-        viewHolder.seekBar.setProgress(getInitialSeekbarValue());
+        viewHolder.seekBar.setProgress(getSeekbarValue());
         viewHolder.seekBar.setOnSeekBarChangeListener(mOnSeekBarChangeListener);
     }
 
@@ -91,7 +91,7 @@
         return null;
     }
 
-    public abstract int getInitialSeekbarValue();
+    public abstract int getSeekbarValue();
 
     public abstract int getMaxSeekbarValue();
 
diff --git a/src/com/android/car/settings/common/SimpleIconLineItem.java b/src/com/android/car/settings/common/SimpleIconLineItem.java
index 9830f2e..967464e 100644
--- a/src/com/android/car/settings/common/SimpleIconLineItem.java
+++ b/src/com/android/car/settings/common/SimpleIconLineItem.java
@@ -16,6 +16,7 @@
 
 package com.android.car.settings.common;
 
+import android.app.ActivityOptions;
 import android.content.Context;
 import android.content.Intent;
 
@@ -25,6 +26,7 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.ImageView;
 
 import com.android.car.settings.R;
 
@@ -35,6 +37,7 @@
     private final CharSequence mDesc;
     private final Context mContext;
     private final Class mActivityClass;
+    private final @DrawableRes int mIconRes;
 
     public SimpleIconLineItem(
             @StringRes int title,
@@ -42,21 +45,22 @@
             Context context,
             CharSequence desc,
             Class activityClass) {
-        super(context.getText(title), iconRes);
+        super(context.getText(title));
         mDesc = desc;
         mContext = context;
         mActivityClass = activityClass;
+        mIconRes = iconRes;
     }
 
     @Override
-    public int getType() {
-        return SIMPLE_ICON_TEXT_TYPE;
+    public void setIcon(ImageView iconView) {
+        iconView.setImageResource(mIconRes);
     }
 
     @Override
     public void onClick() {
         Intent intent = new Intent(mContext, mActivityClass);
-        mContext.startActivity(intent);
+        mContext.startActivity(intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
     }
 
     @Override
@@ -68,10 +72,4 @@
     public CharSequence getDesc() {
         return mDesc;
     }
-
-    public static RecyclerView.ViewHolder createViewHolder(ViewGroup parent) {
-        View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.tile_item, parent, false);
-        return new ViewHolder(v);
-    }
 }
diff --git a/src/com/android/car/settings/common/TypedPagedListAdapter.java b/src/com/android/car/settings/common/TypedPagedListAdapter.java
index a12afc4..69188aa 100644
--- a/src/com/android/car/settings/common/TypedPagedListAdapter.java
+++ b/src/com/android/car/settings/common/TypedPagedListAdapter.java
@@ -40,9 +40,9 @@
     private static final String TAG = "TypedPagedListAdapter";
 
     private final Context mContext;
-    private final ArrayList<LineItem> mContentList;
+    private final ArrayList<? extends LineItem> mContentList;
 
-    public TypedPagedListAdapter(@NonNull Context context, ArrayList<LineItem> contentList) {
+    public TypedPagedListAdapter(@NonNull Context context, ArrayList<? extends LineItem> contentList) {
         mContext = context;
         mContentList = contentList;
     }
@@ -57,8 +57,7 @@
                 TOGGLE_TYPE,
                 ICON_TEXT_TYPE,
                 SEEKBAR_TYPE,
-                ICON_TOGGLE_TYPE,
-                SIMPLE_ICON_TEXT_TYPE})
+                ICON_TOGGLE_TYPE})
         public @interface LineItemType {}
 
         // with one title and one description
@@ -76,9 +75,6 @@
         // with one icon, title, description and a toggle.
         static final int ICON_TOGGLE_TYPE = 5;
 
-        // similar to ICON_TEXT_TYPE, but with a different layout.
-        static final int SIMPLE_ICON_TEXT_TYPE = 6;
-
         @LineItemType
         abstract int getType();
 
@@ -100,8 +96,6 @@
                 return SeekbarLineItem.createViewHolder(parent);
             case LineItem.ICON_TOGGLE_TYPE:
                 return IconToggleLineItem.createViewHolder(parent);
-            case LineItem.SIMPLE_ICON_TEXT_TYPE:
-                return SimpleIconLineItem.createViewHolder(parent);
             default:
                 throw new IllegalStateException("ViewType not supported: " + viewType);
         }
diff --git a/src/com/android/car/settings/datetime/SetDateLineItem.java b/src/com/android/car/settings/datetime/SetDateLineItem.java
index fe86955..2f77044 100644
--- a/src/com/android/car/settings/datetime/SetDateLineItem.java
+++ b/src/com/android/car/settings/datetime/SetDateLineItem.java
@@ -22,6 +22,7 @@
 import android.text.format.DateFormat;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.TextLineItem;
 import com.android.settingslib.datetime.ZoneGetter;
 
@@ -53,6 +54,6 @@
     @Override
     public void onClick() {
         Intent intent = new Intent(mContext /* context */, DatePickerActivity.class);
-        mContext.startActivity(intent);
+        mContext.startActivity(intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
     }
 }
diff --git a/src/com/android/car/settings/datetime/SetTimeLineItem.java b/src/com/android/car/settings/datetime/SetTimeLineItem.java
index 958f526..25b3944 100644
--- a/src/com/android/car/settings/datetime/SetTimeLineItem.java
+++ b/src/com/android/car/settings/datetime/SetTimeLineItem.java
@@ -22,6 +22,7 @@
 import android.text.format.DateFormat;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.TextLineItem;
 import com.android.settingslib.datetime.ZoneGetter;
 
@@ -53,6 +54,6 @@
     @Override
     public void onClick() {
         Intent intent = new Intent(mContext, TimePickerActivity.class);
-        mContext.startActivity(intent);
+        mContext.startActivity(intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
     }
 }
diff --git a/src/com/android/car/settings/datetime/SetTimeZoneLineItem.java b/src/com/android/car/settings/datetime/SetTimeZoneLineItem.java
index 789f5d9..c67b2a6 100644
--- a/src/com/android/car/settings/datetime/SetTimeZoneLineItem.java
+++ b/src/com/android/car/settings/datetime/SetTimeZoneLineItem.java
@@ -21,6 +21,7 @@
 import android.provider.Settings;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.TextLineItem;
 import com.android.settingslib.datetime.ZoneGetter;
 
@@ -53,6 +54,6 @@
     @Override
     public void onClick() {
         Intent intent = new Intent(mContext, TimeZonePickerActivity.class);
-        mContext.startActivity(intent);
+        mContext.startActivity(intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
     }
 }
diff --git a/src/com/android/car/settings/datetime/TimeZoneListAdapter.java b/src/com/android/car/settings/datetime/TimeZoneListAdapter.java
index 80eb3f3..db3b009 100644
--- a/src/com/android/car/settings/datetime/TimeZoneListAdapter.java
+++ b/src/com/android/car/settings/datetime/TimeZoneListAdapter.java
@@ -91,7 +91,7 @@
     public TimeZoneListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
             int viewType) {
         View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.time_zone_list_item, parent, false);
+                .inflate(R.layout.text_line_item, parent, false);
         return new ViewHolder(v);
     }
 
diff --git a/src/com/android/car/settings/datetime/TimeZonePickerActivity.java b/src/com/android/car/settings/datetime/TimeZonePickerActivity.java
index b97bca2..e94b200 100644
--- a/src/com/android/car/settings/datetime/TimeZonePickerActivity.java
+++ b/src/com/android/car/settings/datetime/TimeZonePickerActivity.java
@@ -22,7 +22,6 @@
 import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 import com.android.car.view.PagedListView;
-import com.android.car.settings.common.NoDividerItemDecoration;
 
 /**
  * Lists all time zone and its offset from GMT.
@@ -37,7 +36,7 @@
         setContentView(R.layout.list);
 
         PagedListView listView = (PagedListView) findViewById(android.R.id.list);
-        listView.setDefaultItemDecoration(new NoDividerItemDecoration(this /* context */));
+        listView.setDefaultItemDecoration(new PagedListView.Decoration(this /* context */));
         listView.setDarkMode();
         TimeZoneListAdapter adapter = new TimeZoneListAdapter(
                 this /* context */, this /* TimeZoneChangeListener */);
diff --git a/src/com/android/car/settings/display/BrightnessLineItem.java b/src/com/android/car/settings/display/BrightnessLineItem.java
index c6ee785..27cf350 100644
--- a/src/com/android/car/settings/display/BrightnessLineItem.java
+++ b/src/com/android/car/settings/display/BrightnessLineItem.java
@@ -40,7 +40,7 @@
     }
 
     @Override
-    public int getInitialSeekbarValue() {
+    public int getSeekbarValue() {
         int currentBrightness = 0;
         try {
             currentBrightness = Settings.System.getInt(mContext.getContentResolver(),
diff --git a/src/com/android/car/settings/home/BluetoothLineItem.java b/src/com/android/car/settings/home/BluetoothLineItem.java
index 9de21b9..d5026f4 100644
--- a/src/com/android/car/settings/home/BluetoothLineItem.java
+++ b/src/com/android/car/settings/home/BluetoothLineItem.java
@@ -24,6 +24,7 @@
 
 import com.android.car.settings.R;
 import com.android.car.settings.bluetooth.BluetoothSettingsActivity;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.IconToggleLineItem;
 
 
@@ -31,14 +32,13 @@
  * Represents the Bluetooth line item on settings home page.
  */
 public class BluetoothLineItem extends IconToggleLineItem {
-    private final Context mContext;
     private BluetoothAdapter mBluetoothAdapter;
 
     public BluetoothLineItem(Context context) {
         super(context.getText(R.string.bluetooth_settings), context);
-        mContext = context;
-        mBluetoothAdapter = ((BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE))
-                .getAdapter();
+        mBluetoothAdapter =
+                ((BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE))
+                        .getAdapter();
     }
 
     @Override
@@ -53,7 +53,7 @@
     @Override
     public void onClicked() {
         Intent intent = new Intent(mContext, BluetoothSettingsActivity.class);
-        mContext.startActivity(intent);
+        mContext.startActivity(intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
     }
 
     @Override
diff --git a/src/com/android/car/settings/home/HomepageActivity.java b/src/com/android/car/settings/home/HomepageActivity.java
index ce59b73..7891c9a 100644
--- a/src/com/android/car/settings/home/HomepageActivity.java
+++ b/src/com/android/car/settings/home/HomepageActivity.java
@@ -110,7 +110,7 @@
                 R.drawable.ic_settings_display,
                 this,
                 null,
-                DatetimeSettingsActivity.class));
+                DisplaySettingsActivity.class));
         lineItems.add(new SimpleIconLineItem(
                 R.string.sound_settings,
                 R.drawable.ic_settings_sound,
@@ -126,11 +126,11 @@
                 null,
                 ApplicationSettingsActivity.class));
         lineItems.add(new SimpleIconLineItem(
-                R.string.display_settings,
-                R.drawable.ic_settings_display,
+                R.string.date_and_time_settings_title,
+                R.drawable.ic_settings_date_time,
                 this,
                 null,
-                DisplaySettingsActivity.class));
+                DatetimeSettingsActivity.class));
         lineItems.add(new SimpleIconLineItem(
                 R.string.system_setting_title,
                 R.drawable.ic_settings_about,
diff --git a/src/com/android/car/settings/home/WifiLineItem.java b/src/com/android/car/settings/home/WifiLineItem.java
index 39c2616..b6a1c82 100644
--- a/src/com/android/car/settings/home/WifiLineItem.java
+++ b/src/com/android/car/settings/home/WifiLineItem.java
@@ -23,6 +23,7 @@
 import android.net.wifi.WifiManager;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.IconToggleLineItem;
 import com.android.car.settings.wifi.CarWifiManager;
 import com.android.car.settings.wifi.WifiSettingsActivity;
@@ -49,7 +50,7 @@
     @Override
     public void onClicked() {
         Intent intent = new Intent(mContext, WifiSettingsActivity.class);
-        mContext.startActivity(intent);
+        mContext.startActivity(intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
     }
 
     @Override
diff --git a/src/com/android/car/settings/sound/SoundSettingsActivity.java b/src/com/android/car/settings/sound/SoundSettingsActivity.java
index 07c9d97..37551bd 100644
--- a/src/com/android/car/settings/sound/SoundSettingsActivity.java
+++ b/src/com/android/car/settings/sound/SoundSettingsActivity.java
@@ -16,15 +16,23 @@
 package com.android.car.settings.sound;
 
 import android.car.Car;
+import android.car.CarNotConnectedException;
+import android.car.media.CarAudioManager;
 import android.content.ComponentName;
 import android.content.ServiceConnection;
 import android.media.AudioManager;
+import android.media.IVolumeController;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.view.View;
+import android.os.RemoteException;
+import android.util.Log;
 
 import com.android.car.settings.common.CarSettingActivity;
+import com.android.car.settings.common.TypedPagedListAdapter;
 import com.android.car.settings.R;
+import com.android.car.view.PagedListView;
+
+import java.util.ArrayList;
 
 /**
  * Activity hosts sound related settings.
@@ -32,51 +40,59 @@
 public class SoundSettingsActivity extends CarSettingActivity {
     private static final String TAG = "SoundSettingsActivity";
     private Car mCar;
+    private CarAudioManager mCarAudioManager;
+    private PagedListView mListView;
+    private TypedPagedListAdapter mPagedListAdapter;
 
-    private VolumeControllerPresenter mMediaVolumeControllerPresenter;
-    private VolumeControllerPresenter mRingVolumeControllerPresenter;
+    private final ArrayList<VolumeLineItem> mVolumeLineItems = new ArrayList<>();
+    private final SoundSettingsActivity.VolumnCallback
+            mVolumeCallback = new SoundSettingsActivity.VolumnCallback();
 
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.volume_list);
-
-        View mediaVolumeControllerView = findViewById(
-                R.id.media_volume);
-        View ringVolumeControllerView = findViewById(
-                R.id.ring_volume);
-        mMediaVolumeControllerPresenter = new VolumeControllerPresenter(
-                this /* context*/,
-                mediaVolumeControllerView,
-                AudioManager.STREAM_MUSIC,
-                null /* Uri sampleUri */,
-                R.string.media_volume_title,
-                com.android.internal.R.drawable.ic_audio_media);
-        mRingVolumeControllerPresenter = new VolumeControllerPresenter(
-                this /* context*/,
-                ringVolumeControllerView,
-                AudioManager.STREAM_RING,
-                null /* Uri sampleUri */,
-                R.string.ring_volume_title,
-                com.android.internal.R.drawable.ic_audio_ring_notif);
-        mCar = Car.createCar(this /* context */, mServiceConnection);
-    }
-
-    ServiceConnection mServiceConnection = new ServiceConnection() {
+    private final ServiceConnection mServiceConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
-            mMediaVolumeControllerPresenter.onServiceConnected(mCar);
-            mRingVolumeControllerPresenter.onServiceConnected(mCar);
+            try {
+                mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
+                mCarAudioManager.setVolumeController(mVolumeCallback);
+            } catch (CarNotConnectedException e) {
+                Log.e(TAG, "Car is not connected!", e);
+            }
+            for (VolumeLineItem item : mVolumeLineItems) {
+                item.setCarAudioManager(mCarAudioManager);
+            }
+            mListView = (PagedListView) findViewById(R.id.list);
+            mListView.setDefaultItemDecoration(
+                    new PagedListView.Decoration(SoundSettingsActivity.this));
+            mListView.setDarkMode();
+            mPagedListAdapter = new TypedPagedListAdapter(
+                    SoundSettingsActivity.this /* context */, mVolumeLineItems);
+            mListView.setAdapter(mPagedListAdapter);
         }
 
         @Override
         public void onServiceDisconnected(ComponentName name) {
-            mMediaVolumeControllerPresenter.onServiceDisconnected();
-            mRingVolumeControllerPresenter.onServiceDisconnected();
+            mCarAudioManager = null;
         }
     };
 
     @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.list);
+        mVolumeLineItems.add(new VolumeLineItem(
+                SoundSettingsActivity.this,
+                AudioManager.STREAM_MUSIC,
+                R.string.media_volume_title,
+                com.android.internal.R.drawable.ic_audio_media));
+        mVolumeLineItems.add(new VolumeLineItem(
+                SoundSettingsActivity.this,
+                AudioManager.STREAM_RING,
+                R.string.ring_volume_title,
+                com.android.internal.R.drawable.ic_audio_ring_notif));
+        mCar = Car.createCar(this /* context */, mServiceConnection);
+    }
+
+    @Override
     public void onStart() {
         super.onStart();
         mCar.connect();
@@ -85,8 +101,46 @@
     @Override
     public void onStop() {
         super.onStop();
-        mMediaVolumeControllerPresenter.stop();
-        mRingVolumeControllerPresenter.stop();
+        for (VolumeLineItem item : mVolumeLineItems) {
+            item.stop();
+        }
         mCar.disconnect();
     }
+
+    /**
+     * The interface has a terrible name, it is actually a callback, so here name it accordingly.
+     */
+    private final class VolumnCallback extends IVolumeController.Stub {
+        @Override
+        public void displaySafeVolumeWarning(int flags) throws RemoteException {
+        }
+
+        @Override
+        public void volumeChanged(int streamType, int flags) throws RemoteException {
+            for (VolumeLineItem item : mVolumeLineItems) {
+                if (streamType == item.getStreamType()) {
+                    break;
+                }
+                return;
+            }
+            mPagedListAdapter.notifyDataSetChanged();
+        }
+
+        // this is not mute of this stream
+        @Override
+        public void masterMuteChanged(int flags) throws RemoteException {
+        }
+
+        @Override
+        public void setLayoutDirection(int layoutDirection) throws RemoteException {
+        }
+
+        @Override
+        public void dismiss() throws RemoteException {
+        }
+
+        @Override
+        public void setA11yMode(int mode) {
+        }
+    }
 }
diff --git a/src/com/android/car/settings/sound/VolumeControllerPresenter.java b/src/com/android/car/settings/sound/VolumeControllerPresenter.java
deleted file mode 100644
index cd7a2a5..0000000
--- a/src/com/android/car/settings/sound/VolumeControllerPresenter.java
+++ /dev/null
@@ -1,192 +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.sound;
-
-import android.car.Car;
-import android.car.CarNotConnectedException;
-import android.car.media.CarAudioManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.ServiceConnection;
-import android.media.AudioManager;
-import android.media.IVolumeController;
-import android.media.Ringtone;
-import android.media.RingtoneManager;
-import android.net.Uri;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.provider.Settings;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
-
-import com.android.car.settings.R;
-
-/**
- * Contains logic about volume controller UI.
- */
-public class VolumeControllerPresenter implements OnSeekBarChangeListener {
-
-    private static final String TAG = "SeekBarVolumizer";
-    private static final int AUDIO_FEEDBACK_DELAY_MS = 1500;
-
-    private final Handler mHandler = new Handler(Looper.getMainLooper());
-    private final SeekBar mSeekBar;
-    private final int mStreamType;
-    private final Ringtone mRingtone;
-    private final VolumnCallback mVolumeCallback = new VolumnCallback();
-
-    private CarAudioManager mCarAudioManager;
-
-    public void onServiceConnected(Car car) {
-        try {
-            mCarAudioManager = (CarAudioManager) car.getCarManager(Car.AUDIO_SERVICE);
-            mCarAudioManager.setVolumeController(mVolumeCallback);
-            mSeekBar.setMax(mCarAudioManager.getStreamMaxVolume(mStreamType));
-            mSeekBar.setProgress(mCarAudioManager.getStreamVolume(mStreamType));
-            mSeekBar.setOnSeekBarChangeListener(VolumeControllerPresenter.this);
-        } catch (CarNotConnectedException e) {
-            Log.e(TAG, "Car is not connected!", e);
-        }
-    }
-
-    public void onServiceDisconnected() {
-        mSeekBar.setOnSeekBarChangeListener(null);
-        mCarAudioManager = null;
-    }
-
-    public VolumeControllerPresenter(Context context, View volumeControllerView,
-            int streamType, Uri sampleUri, int titleStringResId, int iconResId) {
-        mSeekBar = (SeekBar) volumeControllerView.findViewById(R.id.seekbar);
-        mStreamType = streamType;
-        Uri ringtoneUri;
-
-        if (sampleUri == null) {
-            switch (mStreamType) {
-                case AudioManager.STREAM_RING:
-                    ringtoneUri = Settings.System.DEFAULT_RINGTONE_URI;
-                    break;
-                case AudioManager.STREAM_NOTIFICATION:
-                    ringtoneUri = Settings.System.DEFAULT_NOTIFICATION_URI;
-                    break;
-                default:
-                    ringtoneUri = Settings.System.DEFAULT_ALARM_ALERT_URI;
-            }
-        } else {
-            ringtoneUri = sampleUri;
-        }
-        mRingtone = RingtoneManager.getRingtone(context, ringtoneUri);
-        if (mRingtone != null) {
-            mRingtone.setStreamType(mStreamType);
-        }
-        ((ImageView) volumeControllerView.findViewById(R.id.icon)).setImageResource(iconResId);
-        ((TextView) volumeControllerView.findViewById(R.id.stream_name)).setText(titleStringResId);
-    }
-
-    public void stop() {
-        mHandler.removeCallbacksAndMessages(null);
-        mRingtone.stop();
-    }
-
-    @Override
-    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-        try {
-            if (mCarAudioManager == null) {
-                Log.w(TAG, "CarAudiomanager not available, Car is not connected!");
-                return;
-            }
-            mCarAudioManager.setStreamVolume(mStreamType, progress, AudioManager.FLAG_PLAY_SOUND);
-            playAudioFeedback();
-        } catch (CarNotConnectedException e) {
-            Log.e(TAG, "Car is not connected!", e);
-        }
-    }
-
-    @Override
-    public void onStartTrackingTouch(SeekBar seekBar) {
-
-    }
-
-    @Override
-    public void onStopTrackingTouch(SeekBar seekBar) {
-        playAudioFeedback();
-    }
-
-    private void playAudioFeedback() {
-        mHandler.removeCallbacksAndMessages(null);
-        mRingtone.play();
-        mHandler.postDelayed(() -> {
-            if (mRingtone.isPlaying()) {
-                mRingtone.stop();
-            }
-        }, AUDIO_FEEDBACK_DELAY_MS);
-    }
-
-    /**
-     * The interface has a terrible name, it is actually a callback, so here name it accordingly.
-     */
-    private final class VolumnCallback extends IVolumeController.Stub {
-
-        private final String TAG = VolumeControllerPresenter.TAG + ".cb";
-
-        @Override
-        public void displaySafeVolumeWarning(int flags) throws RemoteException {
-        }
-
-        @Override
-        public void volumeChanged(int streamType, int flags) throws RemoteException {
-            if (streamType != mStreamType) {
-                return;
-            }
-            try {
-                if (mCarAudioManager == null) {
-                    Log.w(TAG, "CarAudiomanager not available, Car is not connected!");
-                    return;
-                }
-                int volume = mCarAudioManager.getStreamVolume(mStreamType);
-                if (mSeekBar.getProgress() == volume) {
-                    return;
-                }
-                mSeekBar.setProgress(volume);
-            } catch (CarNotConnectedException e) {
-                Log.e(TAG, "Car is not connected!", e);
-            }
-        }
-
-        // this is not mute of this stream
-        @Override
-        public void masterMuteChanged(int flags) throws RemoteException {
-        }
-
-        @Override
-        public void setLayoutDirection(int layoutDirection) throws RemoteException {
-        }
-
-        @Override
-        public void dismiss() throws RemoteException {
-        }
-
-        @Override
-        public void setA11yMode(int mode) {
-        }
-    }
-}
diff --git a/src/com/android/car/settings/sound/VolumeLineItem.java b/src/com/android/car/settings/sound/VolumeLineItem.java
new file mode 100644
index 0000000..66e5c92
--- /dev/null
+++ b/src/com/android/car/settings/sound/VolumeLineItem.java
@@ -0,0 +1,128 @@
+/*
+ * 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.sound;
+
+import android.car.CarNotConnectedException;
+import android.car.media.CarAudioManager;
+import android.content.Context;
+import android.media.AudioManager;
+import android.media.Ringtone;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.provider.Settings;
+import android.util.Log;
+
+import com.android.car.settings.common.SeekbarLineItem;
+
+/**
+ * Contains logic about volume controller UI.
+ */
+public class VolumeLineItem extends SeekbarLineItem {
+    private static final String TAG = "VolumeLineItem";
+    private static final int AUDIO_FEEDBACK_DELAY_MS = 1500;
+
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private final int streamType;
+    private final Ringtone mRingtone;
+
+    private CarAudioManager mCarAudioManager;
+
+    public VolumeLineItem(
+            Context context, int streamType, int titleStringResId, int iconResId) {
+        super(context.getText(titleStringResId));
+        this.streamType = streamType;
+        Uri ringtoneUri;
+
+        switch (this.streamType) {
+            case AudioManager.STREAM_RING:
+                ringtoneUri = Settings.System.DEFAULT_RINGTONE_URI;
+                break;
+            case AudioManager.STREAM_NOTIFICATION:
+                ringtoneUri = Settings.System.DEFAULT_NOTIFICATION_URI;
+                break;
+            default:
+                ringtoneUri = Settings.System.DEFAULT_ALARM_ALERT_URI;
+        }
+        mRingtone = RingtoneManager.getRingtone(context, ringtoneUri);
+        if (mRingtone != null) {
+            mRingtone.setStreamType(this.streamType);
+        }
+    }
+
+    public int getStreamType() {
+        return streamType;
+    }
+
+    public void setCarAudioManager(CarAudioManager carAudioManager) {
+        mCarAudioManager = carAudioManager;
+    }
+
+    public void stop() {
+        mHandler.removeCallbacksAndMessages(null);
+        if (mRingtone != null) {
+            mRingtone.stop();
+        }
+    }
+
+    @Override
+    public int getSeekbarValue() {
+        try {
+            return mCarAudioManager.getStreamVolume(streamType);
+        } catch (CarNotConnectedException e) {
+            Log.e(TAG, "Car is not connected!", e);
+        }
+        return 0;
+    }
+
+    @Override
+    public int getMaxSeekbarValue() {
+        try {
+            return mCarAudioManager.getStreamMaxVolume(streamType);
+        } catch (CarNotConnectedException e) {
+            Log.e(TAG, "Car is not connected!", e);
+        }
+        return 0;
+    }
+
+    @Override
+    public void onSeekbarChanged(int progress) {
+        try {
+            if (mCarAudioManager == null) {
+                Log.w(TAG, "CarAudiomanager not available, Car is not connected!");
+                return;
+            }
+            mCarAudioManager.setStreamVolume(streamType, progress, AudioManager.FLAG_PLAY_SOUND);
+            playAudioFeedback();
+        } catch (CarNotConnectedException e) {
+            Log.e(TAG, "Car is not connected!", e);
+        }
+    }
+
+    private void playAudioFeedback() {
+        mHandler.removeCallbacksAndMessages(null);
+        if (mRingtone != null) {
+            mRingtone.play();
+            mHandler.postDelayed(() -> {
+                if (mRingtone.isPlaying()) {
+                    mRingtone.stop();
+                }
+            }, AUDIO_FEEDBACK_DELAY_MS);
+        }
+    }
+}
diff --git a/src/com/android/car/settings/system/AboutSettingsActivity.java b/src/com/android/car/settings/system/AboutSettingsActivity.java
index a2ea9ba..8f630f7 100644
--- a/src/com/android/car/settings/system/AboutSettingsActivity.java
+++ b/src/com/android/car/settings/system/AboutSettingsActivity.java
@@ -19,9 +19,11 @@
 import android.os.Build;
 
 import com.android.car.settings.common.ListSettingsActivity;
+import com.android.car.settings.common.NoDividerItemDecoration;
 import com.android.car.settings.common.SimpleTextLineItem;
 import com.android.car.settings.common.TypedPagedListAdapter;
 import com.android.car.settings.R;
+import com.android.car.view.PagedListView;
 import com.android.settingslib.DeviceInfoUtils;
 
 import java.util.ArrayList;
@@ -47,4 +49,9 @@
                 getText(R.string.build_number), Build.DISPLAY));
         return lineItems;
     }
+
+    @Override
+    public PagedListView.Decoration getDecoration() {
+        return new NoDividerItemDecoration(this);
+    }
 }
diff --git a/src/com/android/car/settings/system/AboutSystemLineItem.java b/src/com/android/car/settings/system/AboutSystemLineItem.java
index 0334540..2d240de 100644
--- a/src/com/android/car/settings/system/AboutSystemLineItem.java
+++ b/src/com/android/car/settings/system/AboutSystemLineItem.java
@@ -19,8 +19,10 @@
 import android.content.Context;
 import android.content.Intent;
 import android.os.Build;
+import android.widget.ImageView;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.IconTextLineItem;
 
 
@@ -32,7 +34,7 @@
     private final Context mContext;
 
     public AboutSystemLineItem(Context context) {
-        super(context.getString(R.string.about_settings), R.drawable.ic_settings_about);
+        super(context.getString(R.string.about_settings));
         mContext = context;
     }
 
@@ -49,6 +51,11 @@
     @Override
     public void onClick() {
         Intent intent = new Intent(mContext, AboutSettingsActivity.class);
-        mContext.startActivity(intent);
+        mContext.startActivity(intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
+    }
+
+    @Override
+    public void setIcon(ImageView iconView) {
+        iconView.setImageResource(R.drawable.ic_settings_about);
     }
 }
diff --git a/src/com/android/car/settings/system/LegalInfoLineItem.java b/src/com/android/car/settings/system/LegalInfoLineItem.java
index 663d16b..d5cb484 100644
--- a/src/com/android/car/settings/system/LegalInfoLineItem.java
+++ b/src/com/android/car/settings/system/LegalInfoLineItem.java
@@ -17,6 +17,7 @@
 package com.android.car.settings.system;
 
 import android.content.Context;
+import android.widget.ImageView;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.IconTextLineItem;
@@ -30,7 +31,7 @@
     private final Context mContext;
 
     public LegalInfoLineItem(Context context) {
-        super(context.getString(R.string.legal_information), R.drawable.ic_settings_about);
+        super(context.getString(R.string.legal_information));
         mContext = context;
     }
 
@@ -48,4 +49,9 @@
     public void onClick() {
         // TODO: link to a legal info page.
     }
+
+    @Override
+    public void setIcon(ImageView iconView) {
+        iconView.setImageResource(R.drawable.ic_settings_about);
+    }
 }
diff --git a/src/com/android/car/settings/system/SystemUpdatesLineItem.java b/src/com/android/car/settings/system/SystemUpdatesLineItem.java
index 034b9df..f97dc24 100644
--- a/src/com/android/car/settings/system/SystemUpdatesLineItem.java
+++ b/src/com/android/car/settings/system/SystemUpdatesLineItem.java
@@ -17,6 +17,7 @@
 package com.android.car.settings.system;
 
 import android.content.Context;
+import android.widget.ImageView;
 
 import com.android.car.settings.R;
 import com.android.car.settings.common.IconTextLineItem;
@@ -31,8 +32,7 @@
     private final Context mContext;
 
     public SystemUpdatesLineItem(Context context) {
-        super(context.getString(
-                R.string.system_update_settings_list_item_title), R.drawable.ic_system_update);
+        super(context.getString(R.string.system_update_settings_list_item_title));
         mContext = context;
     }
 
@@ -50,4 +50,9 @@
     public void onClick() {
         // TODO: trigger system OTA flow
     }
+
+    @Override
+    public void setIcon(ImageView iconView) {
+        iconView.setImageResource(R.drawable.ic_system_update);
+    }
 }
diff --git a/src/com/android/car/settings/wifi/AccessPointListAdapter.java b/src/com/android/car/settings/wifi/AccessPointListAdapter.java
index 8a72b73..c4f7ec5 100644
--- a/src/com/android/car/settings/wifi/AccessPointListAdapter.java
+++ b/src/com/android/car/settings/wifi/AccessPointListAdapter.java
@@ -34,6 +34,7 @@
 import android.widget.Toast;
 
 import com.android.car.settings.R;
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.wifi.AccessPointListAdapter.ViewHolder;
 import com.android.car.view.PagedListView;
 import com.android.settingslib.wifi.AccessPoint;
@@ -123,7 +124,8 @@
                 Bundle accessPointState = new Bundle();
                 mAccessPoint.saveWifiState(accessPointState);
                 intent.putExtras(accessPointState);
-                mContext.startActivity(intent);
+                mContext.startActivity(
+                        intent, AnimationUtil.slideInFromRightOption(mContext).toBundle());
             }
         }
     };
@@ -132,7 +134,7 @@
     public AccessPointListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
             int viewType) {
         View v = LayoutInflater.from(parent.getContext())
-                .inflate(R.layout.list_item, parent, false);
+                .inflate(R.layout.icon_widget_line_item, parent, false);
         ViewHolder vh = new ViewHolder(v);
         return vh;
     }
diff --git a/src/com/android/car/settings/wifi/WifiSettingsActivity.java b/src/com/android/car/settings/wifi/WifiSettingsActivity.java
index 5f87784..9e80e3d 100644
--- a/src/com/android/car/settings/wifi/WifiSettingsActivity.java
+++ b/src/com/android/car/settings/wifi/WifiSettingsActivity.java
@@ -30,6 +30,7 @@
 
 import android.annotation.StringRes;
 
+import com.android.car.settings.common.AnimationUtil;
 import com.android.car.settings.common.CarSettingActivity;
 import com.android.car.settings.R;
 import com.android.car.view.PagedListView;
@@ -59,7 +60,7 @@
         mCarWifiManager = new CarWifiManager(this /* context */ , this /* listener */);
         setContentView(R.layout.wifi_list);
 
-        ((TextView) findViewById(R.id.action_bar_title)).setText(R.string.wifi_settings);
+        ((TextView) findViewById(R.id.title)).setText(R.string.wifi_settings);
         mProgressBar = (ProgressBar) findViewById(R.id.wifi_search_progress);
         mListView = (PagedListView) findViewById(R.id.list);
         mMessageView = (TextView) findViewById(R.id.message);
@@ -69,7 +70,8 @@
         mAddWifiTextView.setOnClickListener(v -> {
             Intent intent = new Intent(this /* context */, AddWifiActivity.class);
             intent.putExtra(AddWifiActivity.ADD_NETWORK_MODE, true);
-            startActivity(intent);
+            startActivity(intent, AnimationUtil.slideInFromRightOption(
+                    WifiSettingsActivity.this).toBundle());
         });
         setupWifiSwitch();
         if (mCarWifiManager.isWifiEnabled()) {
@@ -77,7 +79,7 @@
         } else {
             showMessage(R.string.wifi_disabled);
         }
-        mListView.setDefaultItemDecoration(new ItemDecoration(this));
+        mListView.setDefaultItemDecoration(new PagedListView.Decoration(this));
         // Set this to light mode, since the scroll bar buttons always appear
         // on top of a dark scrim.
         mListView.setDarkMode();
@@ -146,19 +148,6 @@
         mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
     }
 
-    /**
-     * Default {@link com.android.car.view.PagedListView.Decoration} for the {@link PagedListView}
-     * that removes the dividing lines between items.
-     */
-    private static class ItemDecoration extends PagedListView.Decoration {
-        public ItemDecoration(Context context) {
-            super(context);
-        }
-
-        @Override
-        public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {}
-    }
-
     private void showMessage(@StringRes int resId) {
         if (mViewSwitcher.getCurrentView() != mMessageView) {
             mViewSwitcher.showNext();