Use 24-hour settings for time formatting

Test: m RunSettingsRoboTests
Bug: 72311296
Change-Id: I7c1458dbc2e4e15765f703c35a0113341b912a2b
This commit is contained in:
Victor Chang
2018-02-01 17:54:16 +00:00
parent fbf05e93d6
commit e226c9a8bf
2 changed files with 71 additions and 4 deletions

View File

@@ -35,6 +35,7 @@ import com.android.settings.R;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Locale;
/** /**
* Adapter for showing {@link TimeZoneInfo} objects in a recycler view. * Adapter for showing {@link TimeZoneInfo} objects in a recycler view.
@@ -55,7 +56,11 @@ class TimeZoneAdapter extends RecyclerView.Adapter {
TimeZoneAdapter(View.OnClickListener onClickListener, Context context) { TimeZoneAdapter(View.OnClickListener onClickListener, Context context) {
mOnClickListener = onClickListener; mOnClickListener = onClickListener;
mContext = context; mContext = context;
mTimeFormat = DateFormat.getTimeInstance(SimpleDateFormat.SHORT); // Use android.text.format.DateFormat to observe 24-hour settings and find the best pattern
// using ICU with skeleton.
mTimeFormat = new SimpleDateFormat(
android.text.format.DateFormat.getTimeFormatString(context),
Locale.getDefault());
mDateFormat = DateFormat.getDateInstance(SimpleDateFormat.MEDIUM); mDateFormat = DateFormat.getDateInstance(SimpleDateFormat.MEDIUM);
mDateFormat.setContext(DisplayContext.CAPITALIZATION_NONE); mDateFormat.setContext(DisplayContext.CAPITALIZATION_NONE);
mCurrentTimeZone = TimeZone.getDefault().getID(); mCurrentTimeZone = TimeZone.getDefault().getID();

View File

@@ -15,13 +15,18 @@
*/ */
package com.android.settings.datetime.timezone; package com.android.settings.datetime.timezone;
import android.content.Context;
import android.icu.util.TimeZone; import android.icu.util.TimeZone;
import android.provider.Settings;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.View; import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import com.android.settings.TestConfig; import com.android.settings.TestConfig;
import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.SettingsRobolectricTestRunner;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@@ -29,8 +34,11 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import java.util.Collections; import java.util.Collections;
import java.util.Locale;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
@@ -38,17 +46,39 @@ import static com.google.common.truth.Truth.assertThat;
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION, @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION,
shadows = { shadows = {
SettingsShadowResources.class, SettingsShadowResources.class,
SettingsShadowResources.SettingsShadowTheme.class}) SettingsShadowResources.SettingsShadowTheme.class,
TimeZoneAdapterTest.ShadowDataFormat.class})
public class TimeZoneAdapterTest { public class TimeZoneAdapterTest {
@Mock @Mock
private View.OnClickListener mOnClickListener; private View.OnClickListener mOnClickListener;
private TimeZoneAdapter mTimeZoneAdapter; private TimeZoneAdapter mTimeZoneAdapter;
private Context mContext;
private Locale mDefaultLocale;
@Before @Before
public void setUp() { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, RuntimeEnvironment.application); mContext = RuntimeEnvironment.application;
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, mContext);
mDefaultLocale = Locale.getDefault();
}
@After
public void tearDown() throws Exception {
Locale.setDefault(mDefaultLocale);
}
@Implements(android.text.format.DateFormat.class)
public static class ShadowDataFormat {
public static String mTimeFormatString = "";
@Implementation
public static String getTimeFormatString(Context context) {
return mTimeFormatString;
}
} }
@Test @Test
@@ -89,6 +119,38 @@ public class TimeZoneAdapterTest {
assertThat(viewHolder.mDstView.getVisibility()).isEqualTo(View.GONE); assertThat(viewHolder.mDstView.getVisibility()).isEqualTo(View.GONE);
} }
@Test
public void bindViewHolder_on24Hour() {
Locale.setDefault(Locale.US);
ShadowDataFormat.mTimeFormatString = "HH:mm";
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, mContext);
final TimeZoneInfo tzi = dummyTimeZoneInfo(TimeZone.getTimeZone("Etc/UTC"));
mTimeZoneAdapter.setTimeZoneInfos(Collections.singletonList(tzi));
final FrameLayout parent = new FrameLayout(RuntimeEnvironment.application);
final ViewHolder viewHolder = (ViewHolder) mTimeZoneAdapter.createViewHolder(parent, TimeZoneAdapter.VIEW_TYPE_NORMAL);
mTimeZoneAdapter.bindViewHolder(viewHolder, 0);
assertThat(viewHolder.mTimeView.getText().toString()).hasLength(5);
}
@Test
public void bindViewHolder_on12Hour() {
Locale.setDefault(Locale.US);
ShadowDataFormat.mTimeFormatString = "hh:mm a";
mTimeZoneAdapter = new TimeZoneAdapter(mOnClickListener, mContext);
final TimeZoneInfo tzi = dummyTimeZoneInfo(TimeZone.getTimeZone("Etc/UTC"));
mTimeZoneAdapter.setTimeZoneInfos(Collections.singletonList(tzi));
final FrameLayout parent = new FrameLayout(RuntimeEnvironment.application);
final ViewHolder viewHolder = (ViewHolder) mTimeZoneAdapter.createViewHolder(parent, TimeZoneAdapter.VIEW_TYPE_NORMAL);
mTimeZoneAdapter.bindViewHolder(viewHolder, 0);
assertThat(viewHolder.mTimeView.getText().toString()).hasLength(8);
}
// Pick an arbitrary time zone that's not the current default. // Pick an arbitrary time zone that's not the current default.
private static TimeZone getNonDefaultTimeZone() { private static TimeZone getNonDefaultTimeZone() {
final String[] availableIDs = TimeZone.getAvailableIDs(); final String[] availableIDs = TimeZone.getAvailableIDs();