diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f25b64016..44248cfcf 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -23,6 +23,7 @@
+
diff --git a/src/org/fdroid/fdroid/ManageRepo.java b/src/org/fdroid/fdroid/ManageRepo.java
index 8bc0735c3..47beedbf4 100644
--- a/src/org/fdroid/fdroid/ManageRepo.java
+++ b/src/org/fdroid/fdroid/ManageRepo.java
@@ -237,27 +237,31 @@ class RepoListFragment extends ListFragment
Toast.makeText(getActivity(), msg, Toast.LENGTH_LONG).show();
return;
}
+ if (scheme.equals("FDROIDREPO") || scheme.equals("FDROIDREPOS")) {
+ /*
+ * QRCodes are more efficient in all upper case, so QR URIs are
+ * encoded in all upper case, then forced to lower case.
+ * Checking if the special F-Droid scheme being all is upper
+ * case means it should be downcased.
+ */
+ uri = Uri.parse(uri.toString().toLowerCase(Locale.ENGLISH));
+ }
+ // make scheme and host lowercase so they're readable in dialogs
scheme = scheme.toLowerCase(Locale.ENGLISH);
host = host.toLowerCase(Locale.ENGLISH);
- String fingerprint = uri.getUserInfo();
+ String fingerprint = uri.getQueryParameter("fingerprint");
if (scheme.equals("fdroidrepos") || scheme.equals("fdroidrepo")
|| scheme.equals("https") || scheme.equals("http")) {
isImportingRepo = true;
- // QRCode are more efficient in all upper case, so some incoming
- // URLs might be encoded in all upper case. Therefore, we allow
- // the standard paths to be encoded all upper case, then they'll
- // be forced to lower case. The scheme and host are downcased
- // just to make them more readable in the dialog.
+ /* sanitize and format for function and readability */
String uriString = uri.toString()
- .replace(fingerprint + "@", "") // remove fingerprint
+ .replaceAll("\\?.*$", "") // remove the whole query
.replaceAll("/*$", "") // remove all trailing slashes
- .replaceAll("/FDROID/REPO$", "/fdroid/repo")
- .replaceAll("/FDROID/ARCHIVE$", "/fdroid/archive")
.replace(uri.getHost(), host) // downcase host name
.replace(intent.getScheme(), scheme) // downcase scheme
- .replace("fdroidrepo", "http"); // make proper URL
+ .replace("fdroidrepo", "http"); // proper repo address
showAddRepo(uriString, fingerprint);
}
}
diff --git a/src/org/fdroid/fdroid/views/RepoDetailsActivity.java b/src/org/fdroid/fdroid/views/RepoDetailsActivity.java
index 988138591..2ec73b7b7 100644
--- a/src/org/fdroid/fdroid/views/RepoDetailsActivity.java
+++ b/src/org/fdroid/fdroid/views/RepoDetailsActivity.java
@@ -1,7 +1,12 @@
+
package org.fdroid.fdroid.views;
+import android.net.Uri;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
+import android.text.TextUtils;
import org.fdroid.fdroid.compat.ActionBarCompat;
import org.fdroid.fdroid.data.Repo;
@@ -10,6 +15,9 @@ import org.fdroid.fdroid.views.fragments.RepoDetailsFragment;
public class RepoDetailsActivity extends FragmentActivity {
+ private WifiManager wifiManager;
+ private Repo repo;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -25,11 +33,31 @@ public class RepoDetailsActivity extends FragmentActivity {
.commit();
}
- String[] projection = new String[] { RepoProvider.DataColumns.NAME };
- Repo repo = RepoProvider.Helper.findById(getContentResolver(), repoId, projection);
+ String[] projection = new String[] {
+ RepoProvider.DataColumns.NAME,
+ RepoProvider.DataColumns.ADDRESS,
+ RepoProvider.DataColumns.FINGERPRINT
+ };
+ repo = RepoProvider.Helper.findById(getContentResolver(), repoId, projection);
ActionBarCompat.create(this).setDisplayHomeAsUpEnabled(true);
setTitle(repo.getName());
+
+ wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
}
+ protected Uri getSharingUri() {
+ Uri uri = Uri.parse(repo.address.replaceFirst("http", "fdroidrepo"));
+ Uri.Builder b = uri.buildUpon();
+ b.appendQueryParameter("fingerprint", repo.fingerprint);
+ WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+ String ssid = wifiInfo.getSSID().replaceAll("^\"(.*)\"$", "$1");
+ String bssid = wifiInfo.getBSSID();
+ if (!TextUtils.isEmpty(bssid)) {
+ b.appendQueryParameter("bssid", Uri.encode(bssid));
+ if (!TextUtils.isEmpty(ssid))
+ b.appendQueryParameter("ssid", Uri.encode(ssid));
+ }
+ return b.build();
+ }
}