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);