Fix city search UI
This commit is contained in:
parent
e35edc2b90
commit
9bbe2ed141
5 changed files with 155 additions and 72 deletions
|
@ -25,43 +25,7 @@
|
||||||
app:contentInsetLeft="54dp"
|
app:contentInsetLeft="54dp"
|
||||||
app:contentInsetStart="54dp">
|
app:contentInsetStart="54dp">
|
||||||
|
|
||||||
<LinearLayout
|
<include layout="@layout/search_text_layout"/>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="56dp"
|
|
||||||
android:focusableInTouchMode="true"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<EditText
|
|
||||||
android:id="@+id/searchEditText"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:background="@null"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:hint="@string/search_poi_category_hint"
|
|
||||||
android:lines="1"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:textColor="?attr/searchbar_text"
|
|
||||||
android:textColorHint="?attr/searchbar_text_hint"/>
|
|
||||||
|
|
||||||
<ProgressBar
|
|
||||||
android:id="@+id/searchProgressBar"
|
|
||||||
android:layout_width="32dp"
|
|
||||||
android:layout_height="32dp"
|
|
||||||
android:layout_marginRight="8dp"
|
|
||||||
android:indeterminate="true"
|
|
||||||
android:visibility="gone"/>
|
|
||||||
|
|
||||||
<ImageButton
|
|
||||||
android:id="@+id/clearButton"
|
|
||||||
style="@style/Widget.AppCompat.ActionButton"
|
|
||||||
android:layout_width="48dp"
|
|
||||||
android:layout_height="48dp"
|
|
||||||
android:contentDescription="@string/shared_string_close"
|
|
||||||
android:src="@drawable/ic_action_remove_dark"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</android.support.v7.widget.Toolbar>
|
</android.support.v7.widget.Toolbar>
|
||||||
|
|
||||||
|
|
38
OsmAnd/res/layout/search_text_layout.xml
Normal file
38
OsmAnd/res/layout/search_text_layout.xml
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="56dp"
|
||||||
|
android:focusableInTouchMode="true"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/searchEditText"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="@null"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:hint="@string/search_poi_category_hint"
|
||||||
|
android:lines="1"
|
||||||
|
android:singleLine="true"
|
||||||
|
android:textColor="?attr/searchbar_text"
|
||||||
|
android:textColorHint="?attr/searchbar_text_hint"/>
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/searchProgressBar"
|
||||||
|
android:layout_width="32dp"
|
||||||
|
android:layout_height="32dp"
|
||||||
|
android:layout_marginRight="8dp"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:visibility="gone"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/clearButton"
|
||||||
|
style="@style/Widget.AppCompat.ActionButton"
|
||||||
|
android:layout_width="48dp"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:contentDescription="@string/shared_string_close"
|
||||||
|
android:src="@drawable/ic_action_remove_dark"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
|
@ -10,6 +10,7 @@
|
||||||
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
|
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
|
||||||
-->
|
-->
|
||||||
|
|
||||||
|
<string name="search_map_hint">Search city or region</string>
|
||||||
<string name="route_roundabout_short">Take %1$d exit and go</string>
|
<string name="route_roundabout_short">Take %1$d exit and go</string>
|
||||||
<string name="upload_poi">Upload POI</string>
|
<string name="upload_poi">Upload POI</string>
|
||||||
<string name="route_calculation">Route calculation</string>
|
<string name="route_calculation">Route calculation</string>
|
||||||
|
|
|
@ -49,6 +49,7 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
|
||||||
private DownloadResourceGroup group;
|
private DownloadResourceGroup group;
|
||||||
private DownloadActivity activity;
|
private DownloadActivity activity;
|
||||||
private Toolbar toolbar;
|
private Toolbar toolbar;
|
||||||
|
private View searchView;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -101,6 +102,7 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
|
||||||
}
|
}
|
||||||
|
|
||||||
listView = (ExpandableListView) view.findViewById(android.R.id.list);
|
listView = (ExpandableListView) view.findViewById(android.R.id.list);
|
||||||
|
addSearchRow();
|
||||||
listView.setOnChildClickListener(this);
|
listView.setOnChildClickListener(this);
|
||||||
listAdapter = new DownloadResourceGroupAdapter(activity);
|
listAdapter = new DownloadResourceGroupAdapter(activity);
|
||||||
listView.setAdapter(listAdapter);
|
listView.setAdapter(listAdapter);
|
||||||
|
@ -108,6 +110,37 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void addSearchRow() {
|
||||||
|
if (!openAsDialog() ) {
|
||||||
|
searchView = activity.getLayoutInflater().inflate(R.layout.simple_list_menu_item, null);
|
||||||
|
searchView.setBackgroundResource(android.R.drawable.list_selector_background);
|
||||||
|
TextView title = (TextView) searchView.findViewById(R.id.title);
|
||||||
|
title.setCompoundDrawablesWithIntrinsicBounds(getMyApplication().getIconsCache().getThemedIcon(R.drawable.ic_action_search_dark), null, null, null);
|
||||||
|
title.setHint(R.string.search_map_hint);
|
||||||
|
searchView.setOnClickListener(new OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
getDownloadActivity().showDialog(getActivity(), SearchDialogFragment.createInstance(""));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
listView.addHeaderView(searchView);
|
||||||
|
listView.setHeaderDividersEnabled(false);
|
||||||
|
IndexItem worldBaseMapItem = activity.getDownloadThread().getIndexes().getWorldBaseMapItem();
|
||||||
|
if (worldBaseMapItem == null || !worldBaseMapItem.isDownloaded()) {
|
||||||
|
title.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateSearchView() {
|
||||||
|
if (searchView != null && searchView.findViewById(R.id.title).getVisibility() == View.GONE) {
|
||||||
|
IndexItem worldBaseMapItem = activity.getDownloadThread().getIndexes().getWorldBaseMapItem();
|
||||||
|
if (worldBaseMapItem != null && worldBaseMapItem.isDownloaded()) {
|
||||||
|
searchView.findViewById(R.id.title).setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
@ -133,6 +166,9 @@ public class DownloadResourceGroupFragment extends DialogFragment implements Dow
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reloadData() {
|
private void reloadData() {
|
||||||
|
if (!openAsDialog()) {
|
||||||
|
updateSearchView();
|
||||||
|
}
|
||||||
DownloadResources indexes = activity.getDownloadThread().getIndexes();
|
DownloadResources indexes = activity.getDownloadThread().getIndexes();
|
||||||
group = indexes.getGroupById(groupId);
|
group = indexes.getGroupById(groupId);
|
||||||
if (group != null) {
|
if (group != null) {
|
||||||
|
|
|
@ -1,13 +1,14 @@
|
||||||
package net.osmand.plus.download.ui;
|
package net.osmand.plus.download.ui;
|
||||||
|
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.support.v7.view.ContextThemeWrapper;
|
|
||||||
import android.support.v7.widget.SearchView;
|
|
||||||
import android.support.v7.widget.Toolbar;
|
import android.support.v7.widget.Toolbar;
|
||||||
|
import android.text.Editable;
|
||||||
|
import android.text.TextWatcher;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -15,13 +16,14 @@ import android.view.ViewGroup;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.AdapterView.OnItemClickListener;
|
import android.widget.AdapterView.OnItemClickListener;
|
||||||
import android.widget.BaseAdapter;
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.EditText;
|
||||||
import android.widget.ExpandableListView;
|
import android.widget.ExpandableListView;
|
||||||
import android.widget.Filter;
|
import android.widget.Filter;
|
||||||
import android.widget.Filterable;
|
import android.widget.Filterable;
|
||||||
|
import android.widget.ImageButton;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.ListView;
|
import android.widget.ListView;
|
||||||
import android.widget.RelativeLayout;
|
import android.widget.ProgressBar;
|
||||||
import android.widget.RelativeLayout.LayoutParams;
|
|
||||||
|
|
||||||
import net.osmand.Collator;
|
import net.osmand.Collator;
|
||||||
import net.osmand.CollatorStringMatcher;
|
import net.osmand.CollatorStringMatcher;
|
||||||
|
@ -67,7 +69,10 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
|
||||||
private SearchListAdapter listAdapter;
|
private SearchListAdapter listAdapter;
|
||||||
private BannerAndDownloadFreeVersion banner;
|
private BannerAndDownloadFreeVersion banner;
|
||||||
private String searchText;
|
private String searchText;
|
||||||
private SearchView searchView;
|
private View searchView;
|
||||||
|
private EditText searchEditText;
|
||||||
|
private ProgressBar progressBar;
|
||||||
|
private ImageButton clearButton;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -121,42 +126,48 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
|
||||||
|
|
||||||
TypedValue typedValue = new TypedValue();
|
TypedValue typedValue = new TypedValue();
|
||||||
getActivity().getTheme().resolveAttribute(R.attr.toolbar_theme, typedValue, true);
|
getActivity().getTheme().resolveAttribute(R.attr.toolbar_theme, typedValue, true);
|
||||||
searchView = new SearchView(new ContextThemeWrapper(getActivity(), typedValue.data));
|
|
||||||
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
|
searchView = inflater.inflate(R.layout.search_text_layout, toolbar, false);
|
||||||
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
|
|
||||||
params.setMargins(0, 0, 0, 0);
|
|
||||||
searchView.setLayoutParams(params);
|
|
||||||
toolbar.addView(searchView);
|
toolbar.addView(searchView);
|
||||||
|
|
||||||
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
|
searchEditText = (EditText) view.findViewById(R.id.searchEditText);
|
||||||
|
searchEditText.setHint(R.string.search_map_hint);
|
||||||
|
searchEditText.setTextColor(Color.WHITE);
|
||||||
|
boolean isLight = getMyApplication().getSettings().isLightContent();
|
||||||
|
searchEditText.setHintTextColor(isLight ?
|
||||||
|
getMyApplication().getResources().getColor(R.color.inactive_item_orange) : getMyApplication().getResources().getColor(R.color.searchbar_tab_inactive_dark));
|
||||||
|
|
||||||
|
progressBar = (ProgressBar) view.findViewById(R.id.searchProgressBar);
|
||||||
|
clearButton = (ImageButton) view.findViewById(R.id.clearButton);
|
||||||
|
clearButton.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
searchEditText.addTextChangedListener(new TextWatcher() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onClose() {
|
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
||||||
if (searchView.getQuery().length() == 0) {
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTextChanged(CharSequence s, int start, int before, int count) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterTextChanged(Editable s) {
|
||||||
|
updateSearchText(s.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clearButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (searchEditText.getText().length() == 0) {
|
||||||
dismiss();
|
dismiss();
|
||||||
return true;
|
} else {
|
||||||
|
searchEditText.setText("");
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
|
searchEditText.requestFocus();
|
||||||
@Override
|
|
||||||
public void onFocusChange(View v, boolean hasFocus) {
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onQueryTextSubmit(String query) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onQueryTextChange(String newText) {
|
|
||||||
updateSearchText(newText);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
@ -203,9 +214,8 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
|
||||||
@Override
|
@Override
|
||||||
public void onResume() {
|
public void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
searchView.setIconified(false);
|
|
||||||
if (!Algorithms.isEmpty(searchText)) {
|
if (!Algorithms.isEmpty(searchText)) {
|
||||||
searchView.setQuery(searchText, true);
|
searchEditText.setText(searchText);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,6 +258,24 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void showProgressBar() {
|
||||||
|
updateClearButtonVisibility(false);
|
||||||
|
progressBar.setVisibility(View.VISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hideProgressBar() {
|
||||||
|
updateClearButtonVisibility(true);
|
||||||
|
progressBar.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateClearButtonVisibility(boolean show) {
|
||||||
|
if (show) {
|
||||||
|
clearButton.setVisibility(searchEditText.length() > 0 ? View.VISIBLE : View.GONE);
|
||||||
|
} else {
|
||||||
|
clearButton.setVisibility(View.GONE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class SearchListAdapter extends BaseAdapter implements Filterable {
|
private class SearchListAdapter extends BaseAdapter implements Filterable {
|
||||||
|
|
||||||
private SearchIndexFilter mFilter;
|
private SearchIndexFilter mFilter;
|
||||||
|
@ -523,6 +551,14 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected FilterResults performFiltering(CharSequence constraint) {
|
protected FilterResults performFiltering(CharSequence constraint) {
|
||||||
|
|
||||||
|
getMyApplication().runInUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
showProgressBar();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
DownloadResources root = ctx.getDownloadThread().getIndexes();
|
DownloadResources root = ctx.getDownloadThread().getIndexes();
|
||||||
|
|
||||||
FilterResults results = new FilterResults();
|
FilterResults results = new FilterResults();
|
||||||
|
@ -593,6 +629,14 @@ public class SearchDialogFragment extends DialogFragment implements DownloadEven
|
||||||
results.values = filter;
|
results.values = filter;
|
||||||
results.count = filter.size();
|
results.count = filter.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMyApplication().runInUIThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
hideProgressBar();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue