Merge "Use 24-hour settings for time formatting"
This commit is contained in:
@@ -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();
|
||||||
|
@@ -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();
|
||||||
|
Reference in New Issue
Block a user