diff --git a/app/build.gradle b/app/build.gradle index 35eacfea8..714fc10e5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -181,7 +181,6 @@ def preDexEnabled = "true".equals(System.getProperty("pre-dex", "true")) android { compileSdkVersion 24 buildToolsVersion '25.0.3' - useLibrary 'org.apache.http.legacy' buildTypes { // use proguard on debug too since we have unknowingly broken diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 517c234ec..159f2ab7d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -7,6 +7,8 @@ -dontwarn com.android.support.test.** -dontwarn javax.naming.** +-dontnote org.apache.http.** +-dontnote android.net.http.** -dontnote android.support.** -dontnote **ILicensingService diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java b/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java index 6f8060b9d..dafc33dc2 100644 --- a/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java +++ b/app/src/main/java/org/fdroid/fdroid/localrepo/SwapService.java @@ -1,5 +1,6 @@ package org.fdroid.fdroid.localrepo; +import android.annotation.SuppressLint; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; @@ -10,7 +11,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.net.Uri; -import android.net.http.AndroidHttpClient; import android.os.AsyncTask; import android.os.IBinder; import android.support.annotation.IntDef; @@ -20,11 +20,6 @@ import android.support.v4.app.NotificationCompat; import android.support.v4.content.LocalBroadcastManager; import android.text.TextUtils; import android.util.Log; -import org.apache.http.HttpHost; -import org.apache.http.NameValuePair; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.message.BasicNameValuePair; import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; @@ -47,13 +42,14 @@ import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import java.io.IOException; -import java.io.UnsupportedEncodingException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.ArrayList; +import java.net.HttpURLConnection; +import java.net.URL; import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.Timer; import java.util.TimerTask; @@ -208,55 +204,37 @@ public class SwapService extends Service { UpdateService.updateRepoNow(this, peer.getRepoAddress()); } + @SuppressLint("StaticFieldLeak") private void askServerToSwapWithUs(final Repo repo) { - askServerToSwapWithUs(repo.address); - } - - private void askServerToSwapWithUs(final String address) { new AsyncTask() { @Override protected Void doInBackground(Void... args) { - Uri repoUri = Uri.parse(address); String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString(); - - AndroidHttpClient client = AndroidHttpClient.newInstance("F-Droid", SwapService.this); - HttpPost request = new HttpPost("/request-swap"); - HttpHost host = new HttpHost(repoUri.getHost(), repoUri.getPort(), repoUri.getScheme()); - + HttpURLConnection conn = null; try { - Utils.debugLog(TAG, "Asking server at " + address + " to swap with us in return (by POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\")..."); - populatePostParams(swapBackUri, request); - client.execute(host, request); + URL url = new URL(repo.address.replace("/fdroid/repo", "/request-swap")); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setDoInput(true); + conn.setDoOutput(true); + + OutputStream outputStream = conn.getOutputStream(); + OutputStreamWriter writer = new OutputStreamWriter(outputStream); + writer.write("repo=" + swapBackUri); + writer.flush(); + writer.close(); + outputStream.close(); + + int responseCode = conn.getResponseCode(); + Utils.debugLog(TAG, "Asking server at " + repo.address + " to swap with us in return (by " + + "POSTing to \"/request-swap\" with repo \"" + swapBackUri + "\"): " + responseCode); } catch (IOException e) { - notifyOfErrorOnUiThread(); Log.e(TAG, "Error while asking server to swap with us", e); } finally { - client.close(); + conn.disconnect(); } return null; } - - private void populatePostParams(String swapBackUri, HttpPost request) throws UnsupportedEncodingException { - List params = new ArrayList<>(); - params.add(new BasicNameValuePair("repo", swapBackUri)); - UrlEncodedFormEntity encodedParams = new UrlEncodedFormEntity(params); - request.setEntity(encodedParams); - } - - private void notifyOfErrorOnUiThread() { - // TODO: Broadcast error message so that whoever wants to can display a relevant - // message in the UI. This service doesn't understand the concept of UI. - /*runOnUiThread(new Runnable() { - @Override - public void run() { - Toast.makeText( - SwapService.this, - R.string.swap_reciprocate_failed, - Toast.LENGTH_LONG - ).show(); - } - });*/ - } }.execute(); } diff --git a/app/src/main/java/org/fdroid/fdroid/views/swap/WifiQrView.java b/app/src/main/java/org/fdroid/fdroid/views/swap/WifiQrView.java index dd73267c6..8ec198c8b 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/swap/WifiQrView.java +++ b/app/src/main/java/org/fdroid/fdroid/views/swap/WifiQrView.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.graphics.LightingColorFilter; import android.net.Uri; +import android.os.Build; import android.support.annotation.ColorRes; import android.support.annotation.NonNull; import android.support.v4.content.LocalBroadcastManager; @@ -19,9 +20,6 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.ScrollView; import android.widget.TextView; - -import org.apache.http.NameValuePair; -import org.apache.http.client.utils.URLEncodedUtils; import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.QrGenAsyncTask; @@ -31,9 +29,8 @@ import org.fdroid.fdroid.localrepo.SwapService; import org.fdroid.fdroid.net.WifiStateChangeService; import org.fdroid.fdroid.views.swap.device.camera.CameraCharacteristicsChecker; -import java.net.URI; -import java.util.List; import java.util.Locale; +import java.util.Set; public class WifiQrView extends ScrollView implements SwapWorkflowActivity.InnerView { @@ -142,32 +139,34 @@ public class WifiQrView extends ScrollView implements SwapWorkflowActivity.Inner ipAddressView.setText(buttonLabel); Uri sharingUri = Utils.getSharingUri(FDroidApp.repo); - String qrUriString = scheme + sharingUri.getHost(); + StringBuilder qrUrlBuilder = new StringBuilder(scheme); + qrUrlBuilder.append(sharingUri.getHost()); if (sharingUri.getPort() != 80) { - qrUriString += ":" + sharingUri.getPort(); + qrUrlBuilder.append(':'); + qrUrlBuilder.append(sharingUri.getPort()); } - qrUriString += sharingUri.getPath(); + qrUrlBuilder.append(sharingUri.getPath()); boolean first = true; - // Andorid provides an API for getting the query parameters and iterating over them: - // Uri.getQueryParameterNames() - // But it is only available on later Android versions. As such we use URLEncodedUtils instead. - List parameters = URLEncodedUtils.parse(URI.create(sharingUri.toString()), "UTF-8"); - for (NameValuePair parameter : parameters) { - if (!"ssid".equals(parameter.getName())) { - if (first) { - qrUriString += "?"; - first = false; - } else { - qrUriString += "&"; + if (Build.VERSION.SDK_INT > 10) { + Set names = sharingUri.getQueryParameterNames(); + for (String name : names) { + if (!"ssid".equals(name)) { + if (first) { + qrUrlBuilder.append('?'); + first = false; + } else { + qrUrlBuilder.append('&'); + } + qrUrlBuilder.append(name.toUpperCase(Locale.ENGLISH)); + qrUrlBuilder.append('='); + qrUrlBuilder.append(sharingUri.getQueryParameter(name).toUpperCase(Locale.ENGLISH)); } - qrUriString += parameter.getName().toUpperCase(Locale.ENGLISH) + "=" + - parameter.getValue().toUpperCase(Locale.ENGLISH); } } + String qrUriString = qrUrlBuilder.toString(); Utils.debugLog(TAG, "Encoded swap URI in QR Code: " + qrUriString); - new QrGenAsyncTask(getActivity(), R.id.wifi_qr_code).execute(qrUriString); }