diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 86c0946fa..e4d28bff9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -33,6 +33,7 @@
+
@@ -303,8 +304,14 @@
+
+
+
+
+
+
diff --git a/src/org/fdroid/fdroid/FDroidApp.java b/src/org/fdroid/fdroid/FDroidApp.java
index 1a4a02600..4c01e72cb 100644
--- a/src/org/fdroid/fdroid/FDroidApp.java
+++ b/src/org/fdroid/fdroid/FDroidApp.java
@@ -23,6 +23,8 @@ import android.app.Activity;
import android.app.Application;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothManager;
+import android.content.ComponentName;
+import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.ApplicationInfo;
@@ -30,7 +32,11 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.net.Uri;
+import android.net.wifi.WifiManager;
import android.os.Build;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.RemoteException;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;
@@ -46,19 +52,36 @@ import de.duenndns.ssl.MemorizingTrustManager;
import org.fdroid.fdroid.compat.PRNGFixes;
import org.fdroid.fdroid.data.AppProvider;
import org.fdroid.fdroid.data.InstalledAppCacheUpdater;
+import org.fdroid.fdroid.data.Repo;
+import org.fdroid.fdroid.net.WifiStateChangeService;
import org.thoughtcrime.ssl.pinning.PinningTrustManager;
import org.thoughtcrime.ssl.pinning.SystemKeyStore;
-import javax.net.ssl.*;
import java.io.File;
-import java.lang.Thread;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
public class FDroidApp extends Application {
+ // for the local repo on this device, all static since there is only one
+ public static int ipAddress = 0;
+ public static int port = 8888;
+ public static String ipAddressString = null;
+ public static String ssid = "";
+ public static String bssid = "";
+ public static Repo repo = new Repo();
+ static Set selectedApps = new HashSet();
+
BluetoothAdapter bluetoothAdapter = null;
private static enum Theme {
@@ -196,6 +219,13 @@ public class FDroidApp extends Application {
} catch (KeyStoreException e) {
Log.e("FDroid", "Unable to set up trust manager chain. KeyStoreException");
}
+
+ // initialized the local repo information
+ WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
+ int wifiState = wifiManager.getWifiState();
+ if (wifiState == WifiManager.WIFI_STATE_ENABLING
+ || wifiState == WifiManager.WIFI_STATE_ENABLED)
+ startService(new Intent(this, WifiStateChangeService.class));
}
@TargetApi(18)
diff --git a/src/org/fdroid/fdroid/Utils.java b/src/org/fdroid/fdroid/Utils.java
index 39edc418e..6d0957028 100644
--- a/src/org/fdroid/fdroid/Utils.java
+++ b/src/org/fdroid/fdroid/Utils.java
@@ -197,15 +197,12 @@ public final class Utils {
return Uri.parse("http://wifi-not-enabled");
Uri uri = Uri.parse(repo.address.replaceFirst("http", "fdroidrepo"));
Uri.Builder b = uri.buildUpon();
- b.appendQueryParameter("fingerprint", repo.fingerprint);
- WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- 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));
+ if (!TextUtils.isEmpty(repo.fingerprint))
+ b.appendQueryParameter("fingerprint", repo.fingerprint);
+ if (!TextUtils.isEmpty(FDroidApp.bssid)) {
+ b.appendQueryParameter("bssid", Uri.encode(FDroidApp.bssid));
+ if (!TextUtils.isEmpty(FDroidApp.ssid))
+ b.appendQueryParameter("ssid", Uri.encode(FDroidApp.ssid));
}
return b.build();
}
diff --git a/src/org/fdroid/fdroid/WifiStateChangeReceiver.java b/src/org/fdroid/fdroid/WifiStateChangeReceiver.java
new file mode 100644
index 000000000..ad2a856dc
--- /dev/null
+++ b/src/org/fdroid/fdroid/WifiStateChangeReceiver.java
@@ -0,0 +1,21 @@
+
+package org.fdroid.fdroid;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.NetworkInfo;
+import android.net.wifi.WifiManager;
+
+import org.fdroid.fdroid.net.WifiStateChangeService;
+
+public class WifiStateChangeReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ NetworkInfo ni = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
+ if (ni.isConnected()) {
+ context.startService(new Intent(context, WifiStateChangeService.class));
+ }
+ }
+}
diff --git a/src/org/fdroid/fdroid/net/WifiStateChangeService.java b/src/org/fdroid/fdroid/net/WifiStateChangeService.java
new file mode 100644
index 000000000..afab55923
--- /dev/null
+++ b/src/org/fdroid/fdroid/net/WifiStateChangeService.java
@@ -0,0 +1,88 @@
+
+package org.fdroid.fdroid.net;
+
+import android.app.Service;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.os.AsyncTask;
+import android.os.IBinder;
+import android.preference.PreferenceManager;
+import android.support.v4.content.LocalBroadcastManager;
+import android.util.Log;
+
+import org.fdroid.fdroid.FDroidApp;
+
+import java.util.Locale;
+
+public class WifiStateChangeService extends Service {
+ public static final String BROADCAST = "org.fdroid.fdroid.action.WIFI_CHANGE";
+
+ private Context context;
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ context = this;
+ new WaitForWifiAsyncTask().execute();
+ return START_NOT_STICKY;
+ }
+
+ public class WaitForWifiAsyncTask extends AsyncTask {
+ private static final String TAG = "WaitForWifiAsyncTask";
+ private WifiManager wifiManager;
+
+ @Override
+ protected Void doInBackground(Void... params) {
+ wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
+ try {
+ while (!wifiManager.isWifiEnabled()) {
+ Log.i(TAG, "waiting for the wifi to be enabled...");
+ Thread.sleep(3000);
+ }
+ FDroidApp.ipAddress = wifiManager.getConnectionInfo().getIpAddress();
+ while (FDroidApp.ipAddress == 0) {
+ Log.i(TAG, "waiting for an IP address...");
+ Thread.sleep(3000);
+ FDroidApp.ipAddress = wifiManager.getConnectionInfo().getIpAddress();
+ }
+ WifiInfo wifiInfo = wifiManager.getConnectionInfo();
+ FDroidApp.ipAddress = wifiInfo.getIpAddress();
+ FDroidApp.ipAddressString = String.format(Locale.ENGLISH, "%d.%d.%d.%d",
+ (FDroidApp.ipAddress & 0xff),
+ (FDroidApp.ipAddress >> 8 & 0xff),
+ (FDroidApp.ipAddress >> 16 & 0xff),
+ (FDroidApp.ipAddress >> 24 & 0xff));
+
+ FDroidApp.ssid = wifiInfo.getSSID().replaceAll("^\"(.*)\"$", "$1");
+ FDroidApp.bssid = wifiInfo.getBSSID();
+
+ String scheme;
+ SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
+ if (prefs.getBoolean("use_https", false))
+ scheme = "https";
+ else
+ scheme = "http";
+ FDroidApp.repo.address = String.format(Locale.ENGLISH, "%s://%s:%d/fdroid/repo",
+ scheme, FDroidApp.ipAddressString, FDroidApp.port);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Void result) {
+ Intent intent = new Intent(BROADCAST);
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+ WifiStateChangeService.this.stopSelf();
+ }
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+}