diff --git a/res/drawable-hdpi/ic_menu_3d_globe.png b/res/drawable-hdpi/ic_menu_3d_globe.png
deleted file mode 100644
index 1b55f09..0000000
--- a/res/drawable-hdpi/ic_menu_3d_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_menu_3d_globe.png b/res/drawable-mdpi/ic_menu_3d_globe.png
deleted file mode 100644
index 6755d5e..0000000
--- a/res/drawable-mdpi/ic_menu_3d_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_menu_3d_globe.png b/res/drawable-xhdpi/ic_menu_3d_globe.png
deleted file mode 100644
index 1fda0a2..0000000
--- a/res/drawable-xhdpi/ic_menu_3d_globe.png
+++ /dev/null
Binary files differ
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 34b23e7..533c130 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -774,16 +774,8 @@
     <string name="date_time_search_region">Search region</string>
     <!-- Setting option title to select region in time zone setting screen [CHAR LIMIT=30] -->
     <string name="date_time_select_region">Region</string>
-    <!-- Setting option title to select time zone in time zone setting screen [CHAR LIMIT=30]-->
-    <string name="date_time_select_zone">Time Zone</string>
-    <!-- Setting option title to select time zone in a region -->
-    <string name="date_time_set_timezone_in_region">Time zones in <xliff:g id="region" example="United States">%1$s</xliff:g></string>
     <!-- Setting option title in time zone setting screen [CHAR LIMIT=30] -->
     <string name="date_time_select_fixed_offset_time_zones">Select UTC offset</string>
-    <!-- Menu item on Select time zone screen -->
-    <string name="zone_list_menu_sort_alphabetically">Sort alphabetically</string>
-    <!-- Menu item on Select time zone screen -->
-    <string name="zone_list_menu_sort_by_timezone">Sort by time zone</string>
     <!-- Label describing when a given time zone changes to DST or standard time -->
     <string name="zone_change_to_from_dst"><xliff:g id="time_type" example="Pacific Summer Time">%1$s</xliff:g> starts on <xliff:g id="transition_date" example="Mar 11 2018">%2$s</xliff:g>.</string>
     <!-- Label describing a exemplar location and time zone offset[CHAR LIMIT=NONE] -->
diff --git a/res/xml/date_time_prefs.xml b/res/xml/date_time_prefs.xml
index 511b39f..edda1ba 100644
--- a/res/xml/date_time_prefs.xml
+++ b/res/xml/date_time_prefs.xml
@@ -56,7 +56,7 @@
             settings:userRestriction="no_config_date_time" />
 
         <com.android.settingslib.RestrictedPreference
-            android:fragment="com.android.settings.datetime.ZonePicker"
+            android:fragment="com.android.settings.datetime.timezone.TimeZoneSettings"
             android:key="timezone"
             android:title="@string/date_time_set_timezone"
             android:summary="@string/summary_placeholder"
diff --git a/src/com/android/settings/datetime/TimeZonePreferenceController.java b/src/com/android/settings/datetime/TimeZonePreferenceController.java
index 743cb33..92169e6 100644
--- a/src/com/android/settings/datetime/TimeZonePreferenceController.java
+++ b/src/com/android/settings/datetime/TimeZonePreferenceController.java
@@ -21,9 +21,7 @@
 import androidx.preference.Preference;
 import android.util.FeatureFlagUtils;
 
-import com.android.settings.core.FeatureFlags;
 import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.datetime.timezone.TimeZoneSettings;
 import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.datetime.ZoneGetter;
@@ -36,13 +34,11 @@
     private static final String KEY_TIMEZONE = "timezone";
 
     private final AutoTimeZonePreferenceController mAutoTimeZonePreferenceController;
-    private final boolean mZonePickerV2;
 
     public TimeZonePreferenceController(Context context,
             AutoTimeZonePreferenceController autoTimeZonePreferenceController) {
         super(context);
         mAutoTimeZonePreferenceController = autoTimeZonePreferenceController;
-        mZonePickerV2 = FeatureFlagUtils.isEnabled(mContext, FeatureFlags.ZONE_PICKER_V2);
     }
 
     @Override
@@ -50,9 +46,6 @@
         if (!(preference instanceof RestrictedPreference)) {
             return;
         }
-        if (mZonePickerV2) {
-            preference.setFragment(TimeZoneSettings.class.getName());
-        }
         preference.setSummary(getTimeZoneOffsetAndName());
         if( !((RestrictedPreference) preference).isDisabledByAdmin()) {
             preference.setEnabled(!mAutoTimeZonePreferenceController.isEnabled());
diff --git a/src/com/android/settings/datetime/ZonePicker.java b/src/com/android/settings/datetime/ZonePicker.java
deleted file mode 100644
index 559a8b3..0000000
--- a/src/com/android/settings/datetime/ZonePicker.java
+++ /dev/null
@@ -1,306 +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.settings.datetime;
-
-import android.annotation.NonNull;
-import android.app.Activity;
-import android.app.AlarmManager;
-import android.app.ListFragment;
-import android.content.Context;
-import android.os.Bundle;
-import androidx.annotation.VisibleForTesting;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ListView;
-import android.widget.SimpleAdapter;
-import android.widget.TextView;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.core.instrumentation.Instrumentable;
-import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
-import com.android.settingslib.datetime.ZoneGetter;
-
-import java.text.Collator;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.TimeZone;
-
-/**
- * The class displaying a list of time zones that match a filter string
- * such as "Africa", "Europe", etc. Choosing an item from the list will set
- * the time zone. Pressing Back without choosing from the list will not
- * result in a change in the time zone setting.
- */
-public class ZonePicker extends ListFragment implements Instrumentable {
-
-    private static final int MENU_TIMEZONE = Menu.FIRST+1;
-    private static final int MENU_ALPHABETICAL = Menu.FIRST;
-    private VisibilityLoggerMixin mVisibilityLoggerMixin;
-
-    private boolean mSortedByTimezone;
-
-    private SimpleAdapter mTimezoneSortedAdapter;
-    private SimpleAdapter mAlphabeticalAdapter;
-
-    /**
-     * Constructs an adapter with TimeZone list. Sorted by TimeZone in default.
-     *
-     * @param sortedByName use Name for sorting the list.
-     */
-    public static SimpleAdapter constructTimezoneAdapter(Context context,
-            boolean sortedByName) {
-        return constructTimezoneAdapter(context, sortedByName,
-                R.layout.date_time_custom_list_item_2);
-    }
-
-    /**
-     * Constructs an adapter with TimeZone list. Sorted by TimeZone in default.
-     *
-     * @param sortedByName use Name for sorting the list.
-     */
-    public static SimpleAdapter constructTimezoneAdapter(Context context,
-            boolean sortedByName, int layoutId) {
-        final String[] from = new String[] {
-                ZoneGetter.KEY_DISPLAY_LABEL,
-                ZoneGetter.KEY_OFFSET_LABEL
-        };
-        final int[] to = new int[] {android.R.id.text1, android.R.id.text2};
-
-        final String sortKey = (sortedByName
-                ? ZoneGetter.KEY_DISPLAY_LABEL
-                : ZoneGetter.KEY_OFFSET);
-        final MyComparator comparator = new MyComparator(sortKey);
-        final List<Map<String, Object>> sortedList = ZoneGetter.getZonesList(context);
-        Collections.sort(sortedList, comparator);
-        final SimpleAdapter adapter = new SimpleAdapter(context,
-                sortedList,
-                layoutId,
-                from,
-                to);
-        adapter.setViewBinder(new TimeZoneViewBinder());
-        return adapter;
-    }
-
-    private static class TimeZoneViewBinder implements SimpleAdapter.ViewBinder {
-
-        /**
-         * Set the text to the given {@link CharSequence} as is, instead of calling toString, so
-         * that additional information stored in the CharSequence is, like spans added to a
-         * {@link android.text.SpannableString} are preserved.
-         */
-        @Override
-        public boolean setViewValue(View view, Object data, String textRepresentation) {
-            TextView textView = (TextView) view;
-            textView.setText((CharSequence) data);
-            return true;
-        }
-    }
-
-    /**
-     * Searches {@link TimeZone} from the given {@link SimpleAdapter} object, and returns
-     * the index for the TimeZone.
-     *
-     * @param adapter SimpleAdapter constructed by
-     * {@link #constructTimezoneAdapter(Context, boolean)}.
-     * @param tz TimeZone to be searched.
-     * @return Index for the given TimeZone. -1 when there's no corresponding list item.
-     * returned.
-     */
-    public static int getTimeZoneIndex(SimpleAdapter adapter, TimeZone tz) {
-        final String defaultId = tz.getID();
-        final int listSize = adapter.getCount();
-        for (int i = 0; i < listSize; i++) {
-            // Using HashMap<String, Object> induces unnecessary warning.
-            final HashMap<?,?> map = (HashMap<?,?>)adapter.getItem(i);
-            final String id = (String)map.get(ZoneGetter.KEY_ID);
-            if (defaultId.equals(id)) {
-                // If current timezone is in this list, move focus to it
-                return i;
-            }
-        }
-        return -1;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.ZONE_PICKER;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        final Activity activity = getActivity();
-        mTimezoneSortedAdapter = constructTimezoneAdapter(activity, false);
-        mAlphabeticalAdapter = constructTimezoneAdapter(activity, true);
-
-        // Sets the adapter
-        setSorting(true);
-        setHasOptionsMenu(true);
-        activity.setTitle(R.string.date_time_set_timezone);
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(),
-            FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider());
-    }
-
-    @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        final View view = super.onCreateView(inflater, container, savedInstanceState);
-        final ListView list = view.findViewById(android.R.id.list);
-        prepareCustomPreferencesList(list);
-        return view;
-    }
-
-    @Override
-    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        menu.add(0, MENU_ALPHABETICAL, 0, R.string.zone_list_menu_sort_alphabetically)
-            .setIcon(android.R.drawable.ic_menu_sort_alphabetically);
-        menu.add(0, MENU_TIMEZONE, 0, R.string.zone_list_menu_sort_by_timezone)
-            .setIcon(R.drawable.ic_menu_3d_globe);
-        super.onCreateOptionsMenu(menu, inflater);
-    }
-
-    @Override
-    public void onPrepareOptionsMenu(Menu menu) {
-        if (mSortedByTimezone) {
-            menu.findItem(MENU_TIMEZONE).setVisible(false);
-            menu.findItem(MENU_ALPHABETICAL).setVisible(true);
-        } else {
-            menu.findItem(MENU_TIMEZONE).setVisible(true);
-            menu.findItem(MENU_ALPHABETICAL).setVisible(false);
-        }
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        mVisibilityLoggerMixin.onResume();
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-
-            case MENU_TIMEZONE:
-                setSorting(true);
-                return true;
-
-            case MENU_ALPHABETICAL:
-                setSorting(false);
-                return true;
-
-            default:
-                return false;
-        }
-    }
-
-    static void prepareCustomPreferencesList(ListView list) {
-        list.setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
-        list.setClipToPadding(false);
-        list.setDivider(null);
-    }
-
-    private void setSorting(boolean sortByTimezone) {
-        final SimpleAdapter adapter =
-                sortByTimezone ? mTimezoneSortedAdapter : mAlphabeticalAdapter;
-        setListAdapter(adapter);
-        mSortedByTimezone = sortByTimezone;
-        final int defaultIndex = getTimeZoneIndex(adapter, TimeZone.getDefault());
-        if (defaultIndex >= 0) {
-            setSelection(defaultIndex);
-        }
-    }
-
-    @Override
-    public void onListItemClick(ListView listView, View v, int position, long id) {
-        // Ignore extra clicks
-        if (!isResumed()) return;
-        final Map<?, ?> map = (Map<?, ?>)listView.getItemAtPosition(position);
-        final String tzId = (String) map.get(ZoneGetter.KEY_ID);
-
-        // Update the system timezone value
-        final Activity activity = getActivity();
-        final AlarmManager alarm = (AlarmManager) activity.getSystemService(Context.ALARM_SERVICE);
-        alarm.setTimeZone(tzId);
-
-        getActivity().onBackPressed();
-
-    }
-
-    @Override
-    public void onPause() {
-        super.onPause();
-        mVisibilityLoggerMixin.onPause();
-    }
-
-    @VisibleForTesting
-    static class MyComparator implements Comparator<Map<?, ?>> {
-        private final Collator mCollator;
-        private String mSortingKey;
-        private boolean mSortedByName;
-
-        public MyComparator(String sortingKey) {
-            mCollator = Collator.getInstance();
-            mSortingKey = sortingKey;
-            mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey);
-        }
-
-        public void setSortingKey(String sortingKey) {
-            mSortingKey = sortingKey;
-            mSortedByName = ZoneGetter.KEY_DISPLAY_LABEL.equals(sortingKey);
-        }
-
-        public int compare(Map<?, ?> map1, Map<?, ?> map2) {
-            Object value1 = map1.get(mSortingKey);
-            Object value2 = map2.get(mSortingKey);
-
-            /*
-             * This should never happen, but just in-case, put non-comparable
-             * items at the end.
-             */
-            if (!isComparable(value1)) {
-                return isComparable(value2) ? 1 : 0;
-            } else if (!isComparable(value2)) {
-                return -1;
-            }
-
-            if (mSortedByName) {
-                return mCollator.compare(value1, value2);
-            } else {
-                return ((Comparable) value1).compareTo(value2);
-            }
-        }
-
-        private boolean isComparable(Object value) {
-            return (value != null) && (value instanceof Comparable);
-        }
-    }
-}
diff --git a/src/com/android/settings/network/ApnPreference.java b/src/com/android/settings/network/ApnPreference.java
index ee53ca9..27d275f 100755
--- a/src/com/android/settings/network/ApnPreference.java
+++ b/src/com/android/settings/network/ApnPreference.java
@@ -27,15 +27,12 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.widget.CompoundButton;
 import android.widget.RadioButton;
-import android.widget.RelativeLayout;
 
 import com.android.settings.R;
 
-public class ApnPreference extends Preference implements
-        CompoundButton.OnCheckedChangeListener, OnClickListener {
+public class ApnPreference extends Preference implements CompoundButton.OnCheckedChangeListener {
     final static String TAG = "ApnPreference";
 
     private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -81,11 +78,6 @@
                 rb.setVisibility(View.GONE);
             }
         }
-
-        View textLayout = view.findViewById(R.id.text_layout);
-        if ((textLayout != null) && textLayout instanceof RelativeLayout) {
-            textLayout.setOnClickListener(this);
-        }
     }
 
     public boolean isChecked() {
@@ -115,16 +107,16 @@
         }
     }
 
-    public void onClick(android.view.View v) {
-        if ((v != null) && (R.id.text_layout == v.getId())) {
-            Context context = getContext();
-            if (context != null) {
-                int pos = Integer.parseInt(getKey());
-                Uri url = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, pos);
-                Intent editIntent = new Intent(Intent.ACTION_EDIT, url);
-                editIntent.putExtra(ApnSettings.SUB_ID, mSubId);
-                context.startActivity(editIntent);
-            }
+    @Override
+    protected void onClick() {
+        super.onClick();
+        Context context = getContext();
+        if (context != null) {
+            int pos = Integer.parseInt(getKey());
+            Uri url = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, pos);
+            Intent editIntent = new Intent(Intent.ACTION_EDIT, url);
+            editIntent.putExtra(ApnSettings.SUB_ID, mSubId);
+            context.startActivity(editIntent);
         }
     }
 
diff --git a/src/com/android/settings/network/ApnSettings.java b/src/com/android/settings/network/ApnSettings.java
index 013ae8c..5bc52cc 100755
--- a/src/com/android/settings/network/ApnSettings.java
+++ b/src/com/android/settings/network/ApnSettings.java
@@ -21,7 +21,6 @@
 import android.app.ProgressDialog;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
-import android.content.ContentUris;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
@@ -64,8 +63,7 @@
 
 import java.util.ArrayList;
 
-public class ApnSettings extends RestrictedSettingsFragment implements
-        Preference.OnPreferenceChangeListener {
+public class ApnSettings extends RestrictedSettingsFragment {
     static final String TAG = "ApnSettings";
 
     public static final String EXTRA_POSITION = "position";
@@ -312,7 +310,6 @@
                 pref.setTitle(name);
                 pref.setSummary(apn);
                 pref.setPersistent(false);
-                pref.setOnPreferenceChangeListener(this);
                 pref.setSubId(subId);
 
                 boolean selectable = ((type == null) || !type.equals("mms"));
@@ -404,14 +401,6 @@
         startActivity(intent);
     }
 
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        int pos = Integer.parseInt(preference.getKey());
-        Uri url = ContentUris.withAppendedId(Telephony.Carriers.CONTENT_URI, pos);
-        startActivity(new Intent(Intent.ACTION_EDIT, url));
-        return true;
-    }
-
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         Log.d(TAG, "onPreferenceChange(): Preference - " + preference
                 + ", newValue - " + newValue + ", newValue type - "
diff --git a/tests/robotests/src/com/android/settings/ZonePickerTest.java b/tests/robotests/src/com/android/settings/ZonePickerTest.java
deleted file mode 100644
index 7816a58..0000000
--- a/tests/robotests/src/com/android/settings/ZonePickerTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2016 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;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.text.Spanned;
-import android.text.style.TtsSpan;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-import android.widget.SimpleAdapter;
-import android.widget.TextView;
-
-import com.android.settings.datetime.ZonePicker;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowLibcoreTimeZoneNames;
-import com.android.settings.testutils.shadow.ShadowTimeZoneNames;
-import com.android.settings.testutils.shadow.ShadowZoneGetterData;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(shadows = {
-    ShadowLibcoreTimeZoneNames.class,
-    ShadowLibcoreTimeZoneNames.ShadowZoneStringsCache.class,
-    ShadowTimeZoneNames.class,
-    ShadowZoneGetterData.class,
-}
-)
-public class ZonePickerTest {
-
-    @Test
-    public void testConstructTimeZoneAdapter() {
-        final SimpleAdapter adapter =
-                ZonePicker.constructTimezoneAdapter(RuntimeEnvironment.application, true);
-        assertThat(adapter).isNotNull();
-
-        ViewGroup parent = new FrameLayout(RuntimeEnvironment.application);
-        ViewGroup convertView = new FrameLayout(RuntimeEnvironment.application);
-        TextView text1 = new TextView(RuntimeEnvironment.application);
-        text1.setId(android.R.id.text1);
-        convertView.addView(text1);
-        TextView text2 = new TextView(RuntimeEnvironment.application);
-        text2.setId(android.R.id.text2);
-        convertView.addView(text2);
-
-        adapter.getView(0, convertView, parent);
-        final CharSequence text = text2.getText();
-        assertThat(text).isInstanceOf(Spanned.class);
-        final TtsSpan[] spans = ((Spanned) text).getSpans(0, text.length(), TtsSpan.class);
-        // GMT offset label should have TTS spans
-        assertThat(spans.length).isGreaterThan(0);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/datetime/ZonePickerComparatorTest.java b/tests/robotests/src/com/android/settings/datetime/ZonePickerComparatorTest.java
deleted file mode 100644
index 5e07308..0000000
--- a/tests/robotests/src/com/android/settings/datetime/ZonePickerComparatorTest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.android.settings.datetime;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.datetime.ZoneGetter;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class ZonePickerComparatorTest {
-
-    // Strings in Chinese are sorted by alphabet order of their Pinyin.
-    // "伦敦" -> "lundun";  "纽约" -> "niuyue";  "悉尼" -> "xini"
-    // "开罗" -> "kailuo";  "雅典" -> "yadian";  "上海" -> "shanghai"
-    private static final String[] TEST_CHINESE_NAME =
-            {"伦敦", "纽约", "悉尼", "开罗", "雅典", "上海"};
-    private static final String[] ORDERED_CHINESE_NAME =
-            {"开罗", "伦敦", "纽约", "上海", "悉尼", "雅典"};
-
-    private static final String[] TEST_ENGLISH_NAME =
-            {"London", "New York", "Sydney", "Cairo", "Athens", "Shanghai"};
-    private static final String[] ORDERED_ENGLISH_NAME =
-            {"Athens", "Cairo", "London", "New York", "Shanghai", "Sydney"};
-
-    private static final Locale INIT_LOCALE = Locale.getDefault();
-
-    private Map<String, List<String>> mTestDataMap;
-    private List<Map<String, Object>> mTestList;
-
-    @Before
-    public void setUp() {
-        mTestDataMap = new HashMap<>();
-        mTestDataMap.put("zh_CN", Arrays.asList(TEST_CHINESE_NAME));
-        mTestDataMap.put("en_US", Arrays.asList(TEST_ENGLISH_NAME));
-    }
-
-    @After
-    public void tearDown() {
-        Locale.setDefault(INIT_LOCALE);
-    }
-
-    @Test
-    public void testComparator_sortChineseString() {
-        String sortKey = ZoneGetter.KEY_DISPLAY_LABEL;
-        mTestList = getMockZonesList("zh_CN");
-        Locale.setDefault(new Locale("zh"));
-        mTestList.sort(new ZonePicker.MyComparator(sortKey));
-        for (int i = 0; i < mTestList.size(); i++) {
-            assertThat(mTestList.get(i).get(sortKey).toString()).isEqualTo(ORDERED_CHINESE_NAME[i]);
-        }
-    }
-
-    @Test
-    public void testComparator_sortEnglishString() {
-        String sortKey = ZoneGetter.KEY_DISPLAY_LABEL;
-        mTestList = getMockZonesList("en_US");
-        Locale.setDefault(new Locale("en"));
-        mTestList.sort(new ZonePicker.MyComparator(sortKey));
-        for (int i = 0; i < mTestList.size(); i++) {
-            assertThat(mTestList.get(i).get(sortKey).toString()).isEqualTo(ORDERED_ENGLISH_NAME[i]);
-        }
-    }
-
-    @Test
-    public void testComparator_sortInteger() {
-        String sortKey = ZoneGetter.KEY_OFFSET;
-        // TestList of any locale can be selected to test integer sorting.
-        mTestList = getMockZonesList("en_US");
-        mTestList.sort(new ZonePicker.MyComparator(sortKey));
-        for (int i = 0; i < mTestList.size(); i++) {
-            assertThat(mTestList.get(i).get(sortKey)).isEqualTo(i);
-        }
-    }
-
-    private List<Map<String, Object>> getMockZonesList(String locale) {
-         List<Map<String, Object>> zones = new ArrayList<>();
-         List<String> testData = mTestDataMap.get(locale);
-         TimeZone tz = TimeZone.getDefault();
-         int testSize = testData.size();
-         for (int i = 0; i < testSize; i++) {
-             zones.add(createMockDisplayEntry(tz, "GMT+08:00", testData.get(i), testSize - i - 1));
-         }
-         return zones;
-    }
-
-    private Map<String, Object> createMockDisplayEntry(
-            TimeZone tz, CharSequence gmtOffsetText, CharSequence displayName, int offsetMillis) {
-         Map<String, Object> map = new HashMap<>();
-         map.put(ZoneGetter.KEY_ID, tz.getID());
-         map.put(ZoneGetter.KEY_DISPLAYNAME, displayName.toString());
-         map.put(ZoneGetter.KEY_DISPLAY_LABEL, displayName);
-         map.put(ZoneGetter.KEY_GMT, gmtOffsetText.toString());
-         map.put(ZoneGetter.KEY_OFFSET_LABEL, gmtOffsetText);
-         map.put(ZoneGetter.KEY_OFFSET, offsetMillis);
-         return map;
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/datetime/ZonePickerTest.java b/tests/robotests/src/com/android/settings/datetime/ZonePickerTest.java
deleted file mode 100644
index e6a9ca7..0000000
--- a/tests/robotests/src/com/android/settings/datetime/ZonePickerTest.java
+++ /dev/null
@@ -1,66 +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.settings.datetime;
-
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.ViewGroup;
-
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settings.testutils.shadow.ShadowZoneGetter;
-import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-public class ZonePickerTest {
-
-    private Activity mActivity;
-    private ZonePicker mZonePicker;
-
-    @Before
-    public void setUp() {
-        mActivity = Robolectric.setupActivity(Activity.class);
-        mZonePicker = spy(ZonePicker.class);
-        ReflectionHelpers.setField(mZonePicker, "mVisibilityLoggerMixin",
-                mock(VisibilityLoggerMixin.class));
-    }
-
-    @Test
-    @Config(shadows = ShadowZoneGetter.class)
-    public void testLaunch() {
-        // Shouldn't crash
-        mActivity.getFragmentManager().beginTransaction().add(mZonePicker, "test_tag").commit();
-
-        // Should render
-        verify(mZonePicker).onCreateView(
-                nullable(LayoutInflater.class),
-                nullable(ViewGroup.class),
-                nullable(Bundle.class));
-    }
-}
