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 @Override
public void saveState(Bundle outState) {} 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 @Override
public void search( public void search(
String query, String query,

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

@ -3,36 +3,95 @@ package org.tasks.location;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull; 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.DiffUtil.ItemCallback;
import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.ListUpdateCallback;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import java.util.List;
import org.tasks.R; 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 OnPredictionPicked callback;
private final AsyncListDiffer<PlaceSearchResult> differ;
LocationSearchAdapter(OnPredictionPicked callback) { LocationSearchAdapter(@DrawableRes int attributionRes, OnPredictionPicked callback) {
super(new DiffCallback()); this.attributionRes = attributionRes;
this.callback = callback; this.callback = callback;
differ =
new AsyncListDiffer<>(this, new AsyncDifferConfig.Builder<>(new DiffCallback()).build());
} }
@NonNull @NonNull
@Override @Override
public SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new SearchViewHolder( return viewType == 0
LayoutInflater.from(parent.getContext()).inflate(R.layout.row_place, parent, false), ? new SearchViewHolder(
callback); 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 @Override
public void onBindViewHolder(@NonNull SearchViewHolder holder, int position) { public int getItemCount() {
holder.bind(getItem(position)); 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 { public interface OnPredictionPicked {
@ -57,7 +116,9 @@ public class LocationSearchAdapter extends ListAdapter<PlaceSearchResult, Search
CharSequence name = prediction.getName(); CharSequence name = prediction.getName();
CharSequence address = prediction.getAddress(); CharSequence address = prediction.getAddress();
this.name.setText(name); 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); this.address.setVisibility(View.GONE);
} else { } else {
this.address.setText(address); 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> { public static class DiffCallback extends ItemCallback<PlaceSearchResult> {
@Override @Override

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

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