diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index fda382daf..9999f809b 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -136,125 +136,6 @@
android:windowSoftInputMode="adjustResize"
android:configChanges="layoutDirection|locale|keyboardHidden|orientation|screenSize" >
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -506,6 +387,129 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java
index 78aea486f..c8c3e777b 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListActivity.java
@@ -25,6 +25,7 @@ import org.fdroid.fdroid.data.Schema;
public class AppListActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks, CategoryTextWatcher.SearchTermsChangedListener {
public static final String EXTRA_CATEGORY = "org.fdroid.fdroid.views.apps.AppListActivity.EXTRA_CATEGORY";
+ public static final String EXTRA_SEARCH_TERMS = "org.fdroid.fdroid.views.apps.AppListActivity.EXTRA_SEARCH_TERMS";
private RecyclerView appView;
private AppListAdapter appAdapter;
private String category;
@@ -85,8 +86,9 @@ public class AppListActivity extends AppCompatActivity implements LoaderManager.
Intent intent = getIntent();
category = intent.hasExtra(EXTRA_CATEGORY) ? intent.getStringExtra(EXTRA_CATEGORY) : null;
+ searchTerms = intent.hasExtra(EXTRA_SEARCH_TERMS) ? intent.getStringExtra(EXTRA_SEARCH_TERMS) : null;
- searchInput.setText(getSearchText(category, null));
+ searchInput.setText(getSearchText(category, searchTerms));
searchInput.setSelection(searchInput.getText().length());
if (category != null) {
diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
index 3b1ffdd83..03e0f55b9 100644
--- a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java
@@ -1,20 +1,28 @@
package org.fdroid.fdroid.views.main;
+import android.app.SearchManager;
import android.content.Context;
+import android.content.Intent;
import android.content.SharedPreferences;
+import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
+import android.text.TextUtils;
import android.view.MenuItem;
import android.support.v7.widget.RecyclerView;
+import org.fdroid.fdroid.AppDetails;
+import org.fdroid.fdroid.AppDetails2;
import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.NfcHelper;
import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils;
+import org.fdroid.fdroid.compat.UriCompat;
+import org.fdroid.fdroid.views.apps.AppListActivity;
/**
* Main view shown to users upon starting F-Droid.
@@ -56,6 +64,9 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationV
bottomNavigation.setOnNavigationItemSelectedListener(this);
initialRepoUpdateIfRequired();
+
+ Intent intent = getIntent();
+ handleSearchOrAppViewIntent(intent);
}
/**
@@ -85,16 +96,126 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationV
pager.scrollToPosition(adapter.adapterPositionFromItemId(R.id.my_apps));
}
- // AppDetails and RepoDetailsActivity set different NFC actions, so reset here
+ // AppDetails 2 and RepoDetailsActivity set different NFC actions, so reset here
NfcHelper.setAndroidBeam(this, getApplication().getPackageName());
}
+ @Override
+ protected void onNewIntent(Intent intent) {
+ super.onNewIntent(intent);
+ handleSearchOrAppViewIntent(intent);
+ }
+
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
pager.scrollToPosition(((MainViewAdapter) pager.getAdapter()).adapterPositionFromItemId(item.getItemId()));
return true;
}
+ private void handleSearchOrAppViewIntent(Intent intent) {
+ if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
+ String query = intent.getStringExtra(SearchManager.QUERY);
+ performSearch(query);
+ return;
+ }
+
+ final Uri data = intent.getData();
+ if (data == null) {
+ return;
+ }
+
+ final String scheme = data.getScheme();
+ final String path = data.getPath();
+ String packageName = null;
+ String query = null;
+ if (data.isHierarchical()) {
+ final String host = data.getHost();
+ if (host == null) {
+ return;
+ }
+ switch (host) {
+ case "f-droid.org":
+ if (path.startsWith("/repository/browse")) {
+ // http://f-droid.org/repository/browse?fdfilter=search+query
+ query = UriCompat.getQueryParameter(data, "fdfilter");
+
+ // http://f-droid.org/repository/browse?fdid=packageName
+ packageName = UriCompat.getQueryParameter(data, "fdid");
+ } else if (path.startsWith("/app")) {
+ // http://f-droid.org/app/packageName
+ packageName = data.getLastPathSegment();
+ if ("app".equals(packageName)) {
+ packageName = null;
+ }
+ }
+ break;
+ case "details":
+ // market://details?id=app.id
+ packageName = UriCompat.getQueryParameter(data, "id");
+ break;
+ case "search":
+ // market://search?q=query
+ query = UriCompat.getQueryParameter(data, "q");
+ break;
+ case "play.google.com":
+ if (path.startsWith("/store/apps/details")) {
+ // http://play.google.com/store/apps/details?id=app.id
+ packageName = UriCompat.getQueryParameter(data, "id");
+ } else if (path.startsWith("/store/search")) {
+ // http://play.google.com/store/search?q=foo
+ query = UriCompat.getQueryParameter(data, "q");
+ }
+ break;
+ case "apps":
+ case "amazon.com":
+ case "www.amazon.com":
+ // amzn://apps/android?p=app.id
+ // http://amazon.com/gp/mas/dl/android?s=app.id
+ packageName = UriCompat.getQueryParameter(data, "p");
+ query = UriCompat.getQueryParameter(data, "s");
+ break;
+ }
+ } else if ("fdroid.app".equals(scheme)) {
+ // fdroid.app:app.id
+ packageName = data.getSchemeSpecificPart();
+ } else if ("fdroid.search".equals(scheme)) {
+ // fdroid.search:query
+ query = data.getSchemeSpecificPart();
+ }
+
+ if (!TextUtils.isEmpty(query)) {
+ // an old format for querying via packageName
+ if (query.startsWith("pname:")) {
+ packageName = query.split(":")[1];
+ }
+
+ // sometimes, search URLs include pub: or other things before the query string
+ if (query.contains(":")) {
+ query = query.split(":")[1];
+ }
+ }
+
+ if (!TextUtils.isEmpty(packageName)) {
+ Utils.debugLog(TAG, "FDroid launched via app link for '" + packageName + "'");
+ Intent intentToInvoke = new Intent(this, AppDetails2.class);
+ intentToInvoke.putExtra(AppDetails.EXTRA_APPID, packageName);
+ startActivity(intentToInvoke);
+ finish();
+ } else if (!TextUtils.isEmpty(query)) {
+ Utils.debugLog(TAG, "FDroid launched via search link for '" + query + "'");
+ performSearch(query);
+ }
+ }
+
+ /**
+ * Initiates the {@link AppListActivity} with the relevant search terms passed in via the query arg.
+ */
+ private void performSearch(String query) {
+ Intent searchIntent = new Intent(this, AppListActivity.class);
+ searchIntent.putExtra(AppListActivity.EXTRA_SEARCH_TERMS, query);
+ startActivity(searchIntent);
+ }
+
private static class NonScrollingHorizontalLayoutManager extends LinearLayoutManager {
NonScrollingHorizontalLayoutManager(Context context) {
super(context, LinearLayoutManager.HORIZONTAL, false);