From 85cff19020d2b37e21c2c863176f747728d2c5fc Mon Sep 17 00:00:00 2001 From: Gabriel Calero Date: Fri, 18 May 2018 18:32:04 -0300 Subject: [PATCH] Use domain thumbnail for the last visited location --- android/app/src/main/cpp/native.cpp | 7 ++++ .../hifiinterface/fragment/HomeFragment.java | 4 ++- .../hifiinterface/view/DomainAdapter.java | 30 +++++++++++++++--- .../main/res/drawable/domain_placeholder.png | Bin 0 -> 5701 bytes .../res/drawable/thumbnail_default_place.png | Bin 5523 -> 0 bytes 5 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 android/app/src/main/res/drawable/domain_placeholder.png delete mode 100644 android/app/src/main/res/drawable/thumbnail_default_place.png diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 2a82f3e3a2..437505be3f 100644 --- a/android/app/src/main/cpp/native.cpp +++ b/android/app/src/main/cpp/native.cpp @@ -22,6 +22,7 @@ #include #include "AndroidHelper.h" #include +#include QAndroidJniObject __interfaceActivity; QAndroidJniObject __loginCompletedListener; @@ -210,6 +211,12 @@ JNIEXPORT jstring JNICALL Java_io_highfidelity_hifiinterface_HifiUtils_protocolV return env->NewStringUTF(protocolVersionsSignatureBase64().toLatin1().data()); } +JNIEXPORT jstring JNICALL Java_io_highfidelity_hifiinterface_fragment_HomeFragment_nativeGetLastLocation(JNIEnv *env, jobject instance) { + Setting::Handle currentAddressHandle(QStringList() << "AddressManager" << "address", QString()); + QUrl lastLocation = currentAddressHandle.get(); + return env->NewStringUTF(lastLocation.toString().toLatin1().data()); +} + JNIEXPORT void JNICALL Java_io_highfidelity_hifiinterface_fragment_LoginFragment_nativeLogin(JNIEnv *env, jobject instance, jstring username_, jstring password_, diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/HomeFragment.java b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/HomeFragment.java index 606dbca123..e05b25f3c3 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/HomeFragment.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/fragment/HomeFragment.java @@ -33,6 +33,8 @@ public class HomeFragment extends Fragment { private OnHomeInteractionListener mListener; + public native String nativeGetLastLocation(); + public HomeFragment() { // Required empty public constructor } @@ -60,7 +62,7 @@ public class HomeFragment extends Fragment { int numberOfColumns = 1; GridLayoutManager gridLayoutMgr = new GridLayoutManager(getContext(), numberOfColumns); mDomainsView.setLayoutManager(gridLayoutMgr); - mDomainAdapter = new DomainAdapter(getContext(), HifiUtils.getInstance().protocolVersionSignature()); + mDomainAdapter = new DomainAdapter(getContext(), HifiUtils.getInstance().protocolVersionSignature(), nativeGetLastLocation()); mDomainAdapter.setClickListener((view, position, domain) -> { new Handler(getActivity().getMainLooper()).postDelayed(() -> mListener.onSelectedDomain(domain.url), 400); // a delay so the ripple effect can be seen }); diff --git a/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java b/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java index 907433d938..268bfdef3a 100644 --- a/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java +++ b/android/app/src/main/java/io/highfidelity/hifiinterface/view/DomainAdapter.java @@ -24,21 +24,23 @@ import io.highfidelity.hifiinterface.provider.UserStoryDomainProvider; public class DomainAdapter extends RecyclerView.Adapter { private static final String TAG = "HiFi Interface"; - private static final String DEFAULT_THUMBNAIL_PLACE = "android.resource://io.highfidelity.hifiinterface/" + R.drawable.thumbnail_default_place; + private static final String DEFAULT_THUMBNAIL_PLACE = "android.resource://io.highfidelity.hifiinterface/" + R.drawable.domain_placeholder; private Context mContext; private LayoutInflater mInflater; private ItemClickListener mClickListener; private String mProtocol; + private String mLastLocation; private UserStoryDomainProvider domainProvider; private AdapterListener mAdapterListener; // references to our domains private Domain[] mDomains = {}; - public DomainAdapter(Context c, String protocol) { + public DomainAdapter(Context c, String protocol, String lastLocation) { mContext = c; this.mInflater = LayoutInflater.from(mContext); mProtocol = protocol; + mLastLocation = lastLocation; domainProvider = new UserStoryDomainProvider(mProtocol); loadDomains(""); } @@ -51,9 +53,29 @@ public class DomainAdapter extends RecyclerView.Adapter domain) { - if (filterText.length() == 0) { - domain.add(0, new Domain(mContext.getString(R.string.your_last_location), "", DEFAULT_THUMBNAIL_PLACE)); + Domain lastVisitedDomain = new Domain(mContext.getString(R.string.your_last_location), mLastLocation, DEFAULT_THUMBNAIL_PLACE); + if (!mLastLocation.isEmpty() && mLastLocation.contains("://")) { + int startIndex = mLastLocation.indexOf("://"); + int endIndex = mLastLocation.indexOf("/", startIndex + 3); + String toSearch = mLastLocation.substring(0, endIndex + 1).toLowerCase(); + for (Domain d : domain) { + if (d.url.toLowerCase().startsWith(toSearch)) { + lastVisitedDomain.thumbnail = d.thumbnail; + } + } } + + if (filterText.length() == 0) { + domain.add(0, lastVisitedDomain); + } + + for (Domain d : domain) { + if (d.thumbnail != null && + d.thumbnail.endsWith("assets/places/thumbnail-default-place-e5a3f33e773ab699495774990a562f9f7693dc48ef90d8be6985c645a0280f75.png")) { + d.thumbnail = DEFAULT_THUMBNAIL_PLACE; + } + } + mDomains = new Domain[domain.size()]; mDomains = domain.toArray(mDomains); notifyDataSetChanged(); diff --git a/android/app/src/main/res/drawable/domain_placeholder.png b/android/app/src/main/res/drawable/domain_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..7852ec473ff4cb8c95ebe376f9e0ca9ce4dc6633 GIT binary patch literal 5701 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 PPKmXy>#G;4*@XNTsP|TT literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/thumbnail_default_place.png b/android/app/src/main/res/drawable/thumbnail_default_place.png deleted file mode 100644 index 1bd7d02ffb9aed2e70cfb03653ea2cf84777d858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5523 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