diff --git a/android/app/src/main/cpp/native.cpp b/android/app/src/main/cpp/native.cpp index 3179534b34..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; @@ -172,7 +173,7 @@ JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnDest JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeGotoUrl(JNIEnv* env, jobject obj, jstring url) { QAndroidJniObject jniUrl("java/lang/String", "(Ljava/lang/String;)V", url); - DependencyManager::get()->handleLookupString(jniUrl.toString()); + DependencyManager::get()->loadSettings(jniUrl.toString()); } JNIEXPORT void Java_io_highfidelity_hifiinterface_InterfaceActivity_nativeOnPause(JNIEnv* env, jobject obj) { @@ -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 461b71eb7c..97558d2681 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 @@ -12,13 +12,6 @@ import android.widget.TextView; import com.squareup.picasso.Picasso; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; import java.util.List; import io.highfidelity.hifiinterface.R; @@ -31,20 +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.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(""); } @@ -57,6 +53,29 @@ public class DomainAdapter extends RecyclerView.Adapter domain) { + if (filterText.length() == 0) { + 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; + } + } + } + domain.add(0, lastVisitedDomain); + } + + for (Domain d : domain) { + // we override the default picture added in the server by an android specific version + 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 0000000000..7852ec473f Binary files /dev/null and b/android/app/src/main/res/drawable/domain_placeholder.png differ diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 9646fe0a7e..4f5f29e671 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -20,5 +20,6 @@ Loading places… No places exist with that name Privacy Policy + Your Last Location diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 467c8c9a2c..5aabca93b6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -3312,19 +3312,18 @@ void Application::handleSandboxStatus(QNetworkReply* reply) { // If this is a first run we short-circuit the address passed in if (firstRun.get()) { -#if defined(Q_OS_ANDROID) - qCDebug(interfaceapp) << "First run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("default location") : addressLookupString); - DependencyManager::get()->loadSettings(addressLookupString); -#else +#if !defined(Q_OS_ANDROID) DependencyManager::get()->goToEntry(); sentTo = SENT_TO_ENTRY; #endif firstRun.set(false); } else { +#if !defined(Q_OS_ANDROID) qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); DependencyManager::get()->loadSettings(addressLookupString); sentTo = SENT_TO_PREVIOUS_LOCATION; +#endif } UserActivityLogger::getInstance().logAction("startup_sent_to", {