Add place search attribution

pull/795/head
Alex Baker 5 years ago
parent b398f306b3
commit 648240246b

@ -43,6 +43,13 @@ public class GooglePlacesSearchProvider implements PlaceSearchProvider {
@Override
public void saveState(Bundle outState) {}
@Override
public int getAttributionRes(boolean dark) {
return dark
? R.drawable.places_powered_by_google_dark
: R.drawable.places_powered_by_google_light;
}
@Override
public void search(
String query,

@ -122,7 +122,7 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
private CompositeDisposable disposables;
private MapPosition mapPosition;
private LocationPickerAdapter recentsAdapter = new LocationPickerAdapter(this);
private LocationSearchAdapter searchAdapter = new LocationSearchAdapter(this);
private LocationSearchAdapter searchAdapter;
private List<PlaceUsage> places = Collections.emptyList();
private int offset;
private MenuItem search;
@ -202,7 +202,8 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
themeColor.applyToStatusBarIcons(this);
themeColor.applyToNavigationBar(this);
map.init(getSupportFragmentManager(), this, theme.getThemeBase().isDarkTheme(this));
boolean dark = theme.getThemeBase().isDarkTheme(this);
map.init(getSupportFragmentManager(), this, dark);
CoordinatorLayout.LayoutParams params =
(CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
@ -244,6 +245,7 @@ public class LocationPickerActivity extends InjectingAppCompatActivity
findViewById(map.getMarkerId()).setVisibility(View.VISIBLE);
searchAdapter = new LocationSearchAdapter(searchProvider.getAttributionRes(dark), this);
recentsAdapter.setHasStableIds(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(search.isActionViewExpanded() ? searchAdapter : recentsAdapter);

@ -3,36 +3,95 @@ package org.tasks.location;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.AsyncDifferConfig;
import androidx.recyclerview.widget.AsyncListDiffer;
import androidx.recyclerview.widget.DiffUtil.ItemCallback;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.google.common.base.Strings;
import java.util.List;
import org.tasks.R;
import org.tasks.location.LocationSearchAdapter.SearchViewHolder;
public class LocationSearchAdapter extends ListAdapter<PlaceSearchResult, SearchViewHolder> {
public class LocationSearchAdapter extends RecyclerView.Adapter<ViewHolder>
implements ListUpdateCallback {
private final int attributionRes;
private final OnPredictionPicked callback;
private final AsyncListDiffer<PlaceSearchResult> differ;
LocationSearchAdapter(OnPredictionPicked callback) {
super(new DiffCallback());
LocationSearchAdapter(@DrawableRes int attributionRes, OnPredictionPicked callback) {
this.attributionRes = attributionRes;
this.callback = callback;
differ =
new AsyncListDiffer<>(this, new AsyncDifferConfig.Builder<>(new DiffCallback()).build());
}
@NonNull
@Override
public SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new SearchViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.row_place, parent, false),
callback);
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return viewType == 0
? new SearchViewHolder(
LayoutInflater.from(parent.getContext()).inflate(R.layout.row_place, parent, false),
callback)
: new FooterViewHolder(
LayoutInflater.from(parent.getContext())
.inflate(R.layout.row_place_footer, parent, false),
attributionRes);
}
void submitList(@Nullable List<PlaceSearchResult> list) {
differ.submitList(list);
}
@Override
public void onBindViewHolder(@NonNull SearchViewHolder holder, int position) {
holder.bind(getItem(position));
public int getItemCount() {
return differ.getCurrentList().size() + 1;
}
@Override
public int getItemViewType(int position) {
return position < getItemCount() - 1 ? 0 : 1;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
if (getItemViewType(position) == 0) {
((SearchViewHolder) holder).bind(differ.getCurrentList().get(position));
} else {
((FooterViewHolder) holder).bind(position);
}
}
@Override
public void onInserted(int position, int count) {
notifyItemRangeInserted(position, count);
updateFooter();
}
@Override
public void onRemoved(int position, int count) {
notifyItemRangeRemoved(position, count);
updateFooter();
}
@Override
public void onMoved(int fromPosition, int toPosition) {
notifyItemMoved(fromPosition, toPosition);
}
@Override
public void onChanged(int position, int count, Object payload) {
notifyItemRangeChanged(position, count, payload);
}
private void updateFooter() {
notifyItemChanged(getItemCount() - 1);
}
public interface OnPredictionPicked {
@ -57,7 +116,9 @@ public class LocationSearchAdapter extends ListAdapter<PlaceSearchResult, Search
CharSequence name = prediction.getName();
CharSequence address = prediction.getAddress();
this.name.setText(name);
if (address == null || Strings.isNullOrEmpty(address.toString()) || address.toString().equals(name.toString())) {
if (address == null
|| Strings.isNullOrEmpty(address.toString())
|| address.toString().equals(name.toString())) {
this.address.setVisibility(View.GONE);
} else {
this.address.setText(address);
@ -66,6 +127,22 @@ public class LocationSearchAdapter extends ListAdapter<PlaceSearchResult, Search
}
}
public static class FooterViewHolder extends RecyclerView.ViewHolder {
View divider;
FooterViewHolder(@NonNull View itemView, @DrawableRes int attributionRes) {
super(itemView);
((ImageView) itemView.findViewById(R.id.place_attribution)).setImageResource(attributionRes);
divider = itemView.findViewById(R.id.divider);
}
void bind(int position) {
divider.setVisibility(position == 0 ? View.GONE : View.VISIBLE);
}
}
public static class DiffCallback extends ItemCallback<PlaceSearchResult> {
@Override

@ -33,6 +33,11 @@ public class MapboxSearchProvider implements PlaceSearchProvider {
@Override
public void saveState(Bundle outState) {}
@Override
public int getAttributionRes(boolean dark) {
return R.drawable.mapbox_logo_icon;
}
@Override
public void search(
String query,

@ -1,6 +1,7 @@
package org.tasks.location;
import android.os.Bundle;
import androidx.annotation.DrawableRes;
import java.util.List;
import org.tasks.Callback;
import org.tasks.data.Place;
@ -10,6 +11,8 @@ public interface PlaceSearchProvider {
void saveState(Bundle outState);
@DrawableRes int getAttributionRes(boolean dark);
void search(
String query,
MapPosition bias,

@ -0,0 +1,22 @@
<?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="wrap_content"
android:orientation="vertical">
<View
android:id="@+id/divider"
style="@style/task_edit_row_divider"/>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/place_attribution"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/keyline_first"
android:paddingStart="@dimen/keyline_content_inset"
android:paddingEnd="@dimen/keyline_second"
android:paddingLeft="@dimen/keyline_content_inset"
android:paddingRight="@dimen/keyline_second"
android:src="@drawable/mapbox_logo_icon"/>
</LinearLayout>
Loading…
Cancel
Save