summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
authorJames Kung <kingkung@google.com>2013-04-17 20:07:15 -0700
committerJames Kung <kingkung@google.com>2013-04-17 21:14:27 -0700
commita8dd2dfa92587e5fc11e6c24da91be9e7bf3afb7 (patch)
tree8013d0a11fc2c2aa40ca36d95c76e796f60b8b84 /src/com/android
parent213f8396f731cb5238b03aeda4d2538a7d64673d (diff)
downloadandroid_frameworks_opt_timezonepicker-a8dd2dfa92587e5fc11e6c24da91be9e7bf3afb7.tar.gz
android_frameworks_opt_timezonepicker-a8dd2dfa92587e5fc11e6c24da91be9e7bf3afb7.tar.bz2
android_frameworks_opt_timezonepicker-a8dd2dfa92587e5fc11e6c24da91be9e7bf3afb7.zip
Timezone picker UI improvements on rotation
Bug: 8643739 Change-Id: I92e25ffd8cf8fe7393ba6fcfdd725a26e2063bda
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/timezonepicker/TimeZoneFilterTypeAdapter.java24
-rw-r--r--src/com/android/timezonepicker/TimeZonePickerDialog.java34
-rw-r--r--src/com/android/timezonepicker/TimeZonePickerView.java67
-rw-r--r--src/com/android/timezonepicker/TimeZoneResultAdapter.java33
4 files changed, 145 insertions, 13 deletions
diff --git a/src/com/android/timezonepicker/TimeZoneFilterTypeAdapter.java b/src/com/android/timezonepicker/TimeZoneFilterTypeAdapter.java
index ffc699b..0303cab 100644
--- a/src/com/android/timezonepicker/TimeZoneFilterTypeAdapter.java
+++ b/src/com/android/timezonepicker/TimeZoneFilterTypeAdapter.java
@@ -33,6 +33,8 @@ import java.util.ArrayList;
public class TimeZoneFilterTypeAdapter extends BaseAdapter implements Filterable, OnClickListener {
public static final String TAG = "TimeZoneFilterTypeAdapter";
+ private static final boolean DEBUG = false;
+
public static final int FILTER_TYPE_EMPTY = -1;
public static final int FILTER_TYPE_NONE = 0;
public static final int FILTER_TYPE_COUNTRY = 1;
@@ -163,7 +165,9 @@ public class TimeZoneFilterTypeAdapter extends BaseAdapter implements Filterable
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
- Log.e(TAG, "performFiltering >>>> [" + prefix + "]");
+ if (DEBUG) {
+ Log.d(TAG, "performFiltering >>>> [" + prefix + "]");
+ }
FilterResults results = new FilterResults();
String prefixString = null;
@@ -233,7 +237,9 @@ public class TimeZoneFilterTypeAdapter extends BaseAdapter implements Filterable
// ////////////////////////////////////////
// TODO Search by state
// ////////////////////////////////////////
- Log.e(TAG, "performFiltering <<<< " + filtered.size() + "[" + prefix + "]");
+ if (DEBUG) {
+ Log.d(TAG, "performFiltering <<<< " + filtered.size() + "[" + prefix + "]");
+ }
results.values = filtered;
results.count = filtered.size();
@@ -369,7 +375,9 @@ public class TimeZoneFilterTypeAdapter extends BaseAdapter implements Filterable
return Integer.MIN_VALUE;
}
- Log.e(TAG, "Parsing " + str + " -> " + negativeMultiplier * num);
+ if (DEBUG) {
+ Log.d(TAG, "Parsing " + str + " -> " + negativeMultiplier * num);
+ }
return negativeMultiplier * num;
}
@@ -387,11 +395,15 @@ public class TimeZoneFilterTypeAdapter extends BaseAdapter implements Filterable
}
mListener.onSetFilter(filterType, null, 0);
}
- Log.e(TAG, "publishResults: " + results.count + " of null [" + constraint);
+ if (DEBUG) {
+ Log.d(TAG, "publishResults: " + results.count + " of null [" + constraint);
+ }
} else {
mLiveResults = (ArrayList<FilterTypeResult>) results.values;
- Log.e(TAG, "publishResults: " + results.count + " of " + mLiveResults.size() + " ["
- + constraint);
+ if (DEBUG) {
+ Log.d(TAG, "publishResults: " + results.count + " of " + mLiveResults.size()
+ + " [" + constraint);
+ }
}
mLiveResultsCount = results.count;
diff --git a/src/com/android/timezonepicker/TimeZonePickerDialog.java b/src/com/android/timezonepicker/TimeZonePickerDialog.java
index 4977be3..d00513e 100644
--- a/src/com/android/timezonepicker/TimeZonePickerDialog.java
+++ b/src/com/android/timezonepicker/TimeZonePickerDialog.java
@@ -30,7 +30,15 @@ public class TimeZonePickerDialog extends DialogFragment implements
public static final String BUNDLE_START_TIME_MILLIS = "bundle_event_start_time";
public static final String BUNDLE_TIME_ZONE = "bundle_event_time_zone";
+ private static final String KEY_HAS_RESULTS = "has_results";
+ private static final String KEY_LAST_FILTER_STRING = "last_filter_string";
+ private static final String KEY_LAST_FILTER_TYPE = "last_filter_type";
+ private static final String KEY_LAST_FILTER_TIME = "last_filter_time";
+ private static final String KEY_HIDE_FILTER_SEARCH = "hide_filter_search";
+
private OnTimeZoneSetListener mTimeZoneSetListener;
+ private TimeZonePickerView mView;
+ private boolean mHasCachedResults = false;
public interface OnTimeZoneSetListener {
void onTimeZoneSet(TimeZoneInfo tzi);
@@ -54,7 +62,31 @@ public class TimeZonePickerDialog extends DialogFragment implements
timeMillis = b.getLong(BUNDLE_START_TIME_MILLIS);
timeZone = b.getString(BUNDLE_TIME_ZONE);
}
- return new TimeZonePickerView(getActivity(), null, timeZone, timeMillis, this);
+ boolean hideFilterSearch = false;
+
+ if (savedInstanceState != null) {
+ hideFilterSearch = savedInstanceState.getBoolean(KEY_HIDE_FILTER_SEARCH);
+ }
+ mView = new TimeZonePickerView(getActivity(), null, timeZone, timeMillis, this,
+ hideFilterSearch);
+ if (savedInstanceState != null && savedInstanceState.getBoolean(KEY_HAS_RESULTS, false)) {
+ mView.showFilterResults(savedInstanceState.getInt(KEY_LAST_FILTER_TYPE),
+ savedInstanceState.getString(KEY_LAST_FILTER_STRING),
+ savedInstanceState.getInt(KEY_LAST_FILTER_TIME));
+ }
+ return mView;
+ }
+
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(KEY_HAS_RESULTS, mView != null && mView.hasResults());
+ if (mView != null) {
+ outState.putInt(KEY_LAST_FILTER_TYPE, mView.getLastFilterType());
+ outState.putString(KEY_LAST_FILTER_STRING, mView.getLastFilterString());
+ outState.putInt(KEY_LAST_FILTER_TIME, mView.getLastFilterTime());
+ outState.putBoolean(KEY_HIDE_FILTER_SEARCH, mView.getHideFilterSearchOnStart());
+ }
}
@Override
diff --git a/src/com/android/timezonepicker/TimeZonePickerView.java b/src/com/android/timezonepicker/TimeZonePickerView.java
index e41db2b..a56d95b 100644
--- a/src/com/android/timezonepicker/TimeZonePickerView.java
+++ b/src/com/android/timezonepicker/TimeZonePickerView.java
@@ -26,6 +26,7 @@ import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AutoCompleteTextView;
@@ -33,12 +34,15 @@ import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
-public class TimeZonePickerView extends LinearLayout implements TextWatcher, OnItemClickListener {
+public class TimeZonePickerView extends LinearLayout implements TextWatcher, OnItemClickListener,
+ OnClickListener {
private static final String TAG = "TimeZonePickerView";
private Context mContext;
private AutoCompleteTextView mAutoCompleteTextView;
private TimeZoneFilterTypeAdapter mFilterAdapter;
+ private boolean mHideFilterSearchOnStart = false;
+ private boolean mFirstTime = true;
TimeZoneResultAdapter mResultAdapter;
private ImageButton mClearButton;
@@ -48,13 +52,16 @@ public class TimeZonePickerView extends LinearLayout implements TextWatcher, OnI
}
public TimeZonePickerView(Context context, AttributeSet attrs,
- String timeZone, long timeMillis, OnTimeZoneSetListener l) {
+ String timeZone, long timeMillis, OnTimeZoneSetListener l,
+ boolean hideFilterSearch) {
super(context, attrs);
mContext = context;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.timezonepickerview, this, true);
+ mHideFilterSearchOnStart = hideFilterSearch;
+
TimeZoneData tzd = new TimeZoneData(mContext, timeZone, timeMillis);
mResultAdapter = new TimeZoneResultAdapter(mContext, tzd, l);
@@ -62,11 +69,12 @@ public class TimeZonePickerView extends LinearLayout implements TextWatcher, OnI
timeZoneList.setAdapter(mResultAdapter);
timeZoneList.setOnItemClickListener(mResultAdapter);
- mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.searchBox);
mFilterAdapter = new TimeZoneFilterTypeAdapter(mContext, tzd, mResultAdapter);
- mAutoCompleteTextView.setAdapter(mFilterAdapter);
+
+ mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.searchBox);
mAutoCompleteTextView.addTextChangedListener(this);
mAutoCompleteTextView.setOnItemClickListener(this);
+ mAutoCompleteTextView.setOnClickListener(this);
updateHint(R.string.hint_time_zone_search, R.drawable.ic_search_holo_light);
mClearButton = (ImageButton) findViewById(R.id.clear_search);
@@ -78,6 +86,32 @@ public class TimeZonePickerView extends LinearLayout implements TextWatcher, OnI
});
}
+ public void showFilterResults(int type, String string, int time) {
+ if (mResultAdapter != null) {
+ mResultAdapter.onSetFilter(type, string, time);
+ }
+ }
+
+ public boolean hasResults() {
+ return mResultAdapter != null && mResultAdapter.hasResults();
+ }
+
+ public int getLastFilterType() {
+ return mResultAdapter != null ? mResultAdapter.getLastFilterType() : -1;
+ }
+
+ public String getLastFilterString() {
+ return mResultAdapter != null ? mResultAdapter.getLastFilterString() : null;
+ }
+
+ public int getLastFilterTime() {
+ return mResultAdapter != null ? mResultAdapter.getLastFilterType() : -1;
+ }
+
+ public boolean getHideFilterSearchOnStart() {
+ return mHideFilterSearchOnStart;
+ }
+
private void updateHint(int hintTextId, int imageDrawableId) {
String hintText = getResources().getString(hintTextId);
Drawable searchIcon = getResources().getDrawable(imageDrawableId);
@@ -98,7 +132,11 @@ public class TimeZonePickerView extends LinearLayout implements TextWatcher, OnI
// Implementation of TextWatcher
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
- mFilterAdapter.getFilter().filter(s.toString());
+ if (mFirstTime && mHideFilterSearchOnStart) {
+ mFirstTime = false;
+ return;
+ }
+ filterOnString(s.toString());
}
// Implementation of TextWatcher
@@ -113,6 +151,25 @@ public class TimeZonePickerView extends LinearLayout implements TextWatcher, OnI
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// An onClickListener for the view item because I haven't figured out a
// way to update the AutoCompleteTextView without causing an infinite loop.
+ mHideFilterSearchOnStart = true;
mFilterAdapter.onClick(view);
}
+
+ @Override
+ public void onClick(View v) {
+ if (mAutoCompleteTextView != null && !mAutoCompleteTextView.isPopupShowing()) {
+ filterOnString(mAutoCompleteTextView.getText().toString());
+ }
+ }
+
+ // This method will set the adapter if no adapter has been set. The adapter is initialized
+ // here to prevent the drop-down from appearing uninvited on orientation change, as the
+ // AutoCompleteTextView.setText() will trigger the drop-down if the adapter has been set.
+ private void filterOnString(String string) {
+ if (mAutoCompleteTextView.getAdapter() == null) {
+ mAutoCompleteTextView.setAdapter(mFilterAdapter);
+ }
+ mHideFilterSearchOnStart = false;
+ mFilterAdapter.getFilter().filter(string);
+ }
}
diff --git a/src/com/android/timezonepicker/TimeZoneResultAdapter.java b/src/com/android/timezonepicker/TimeZoneResultAdapter.java
index 2b57f39..efc275e 100644
--- a/src/com/android/timezonepicker/TimeZoneResultAdapter.java
+++ b/src/com/android/timezonepicker/TimeZoneResultAdapter.java
@@ -38,12 +38,19 @@ import java.util.LinkedHashSet;
public class TimeZoneResultAdapter extends BaseAdapter implements OnItemClickListener,
OnSetFilterListener {
private static final String TAG = "TimeZoneResultAdapter";
+ private static final boolean DEBUG = false;
private static final int VIEW_TAG_TIME_ZONE = R.id.time_zone;
/** SharedPref name and key for recent time zones */
private static final String SHARED_PREFS_NAME = "com.android.calendar_preferences";
private static final String KEY_RECENT_TIMEZONES = "preferences_recent_timezones";
+ private int mLastFilterType;
+ private String mLastFilterString;
+ private int mLastFilterTime;
+
+ private boolean mHasResults = false;
+
/**
* The delimiter we use when serializing recent timezones to shared
* preferences
@@ -91,10 +98,32 @@ public class TimeZoneResultAdapter extends BaseAdapter implements OnItemClickLis
onSetFilter(TimeZoneFilterTypeAdapter.FILTER_TYPE_NONE, null, 0);
}
+ public boolean hasResults() {
+ return mHasResults;
+ }
+
+ public int getLastFilterType() {
+ return mLastFilterType;
+ }
+
+ public String getLastFilterString() {
+ return mLastFilterString;
+ }
+
+ public int getLastFilterTime() {
+ return mLastFilterTime;
+ }
+
// Implements OnSetFilterListener
@Override
public void onSetFilter(int filterType, String str, int time) {
- Log.d(TAG, "onSetFilter: " + filterType + " [" + str + "] " + time);
+ if (DEBUG) {
+ Log.d(TAG, "onSetFilter: " + filterType + " [" + str + "] " + time);
+ }
+
+ mLastFilterType = filterType;
+ mLastFilterString = str;
+ mLastFilterTime = time;
mFilteredTimeZoneLength = 0;
int idx = 0;
@@ -149,6 +178,8 @@ public class TimeZoneResultAdapter extends BaseAdapter implements OnItemClickLis
default:
throw new IllegalArgumentException();
}
+ mHasResults = mFilteredTimeZoneLength > 0;
+
notifyDataSetChanged();
}