From edb3564e29f135b5ce86aa2db63bef89bfe36985 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 9 May 2015 12:10:41 -0400 Subject: [PATCH] unified IP/Wifi state handling in WifiStateChangeService To handle hotspots, this code will become more complicated. Therefore, first simplify things by putting all of the logic into one place, rather than spread out across FDroidApp, the receiver, and the service --- F-Droid/src/org/fdroid/fdroid/FDroidApp.java | 6 +--- .../fdroid/net/WifiStateChangeService.java | 36 +++++++++++++++---- .../receiver/WifiStateChangeReceiver.java | 12 ++----- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/F-Droid/src/org/fdroid/fdroid/FDroidApp.java b/F-Droid/src/org/fdroid/fdroid/FDroidApp.java index a64d837af..6f99b3106 100644 --- a/F-Droid/src/org/fdroid/fdroid/FDroidApp.java +++ b/F-Droid/src/org/fdroid/fdroid/FDroidApp.java @@ -33,7 +33,6 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.net.Uri; -import android.net.wifi.WifiManager; import android.os.Build; import android.os.IBinder; import android.os.Message; @@ -239,10 +238,7 @@ public class FDroidApp extends Application { // initialized the local repo information FDroidApp.initWifiSettings(); - WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); - int wifiState = wifiManager.getWifiState(); - if (wifiState == WifiManager.WIFI_STATE_ENABLED) - startService(new Intent(this, WifiStateChangeService.class)); + startService(new Intent(this, WifiStateChangeService.class)); // if the HTTPS pref changes, then update all affected things Preferences.get().registerLocalRepoHttpsListeners(new ChangeListener() { @Override diff --git a/F-Droid/src/org/fdroid/fdroid/net/WifiStateChangeService.java b/F-Droid/src/org/fdroid/fdroid/net/WifiStateChangeService.java index 7b4cbb7c1..95a81b7d4 100644 --- a/F-Droid/src/org/fdroid/fdroid/net/WifiStateChangeService.java +++ b/F-Droid/src/org/fdroid/fdroid/net/WifiStateChangeService.java @@ -21,26 +21,48 @@ import java.security.cert.Certificate; import java.util.Locale; public class WifiStateChangeService extends Service { + private static final String TAG = "WifiStateChangeService"; + public static final String BROADCAST = "org.fdroid.fdroid.action.WIFI_CHANGE"; + private WifiManager wifiManager; private static WaitForWifiAsyncTask asyncTask; @Override public int onStartCommand(Intent intent, int flags, int startId) { - if (asyncTask != null) - asyncTask.cancel(true); - asyncTask = new WaitForWifiAsyncTask(); - asyncTask.execute(); + NetworkInfo ni = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); + wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); + if (ni == null) { + // this app just started up, NetworkInfo is only passed via WifiStateChangeReceiver + int wifiState = wifiManager.getWifiState(); + if (wifiState == WifiManager.WIFI_STATE_ENABLED) { + startAsyncTask(); + } + } else if (ni.isConnected()) { + Log.i(TAG, "ni.isConnected()"); + startAsyncTask(); + } else { + Log.i("WifiStateChangeReceiver", "ni != null && !ni.isConnected()"); + FDroidApp.initWifiSettings(); + } return START_NOT_STICKY; } + private void startAsyncTask() { + Log.i(TAG, "startAsyncTask"); + if (asyncTask != null) { + Log.i(TAG, "asyncTask.cancel"); + asyncTask.cancel(true); + } + asyncTask = new WaitForWifiAsyncTask(); + asyncTask.execute(); + } + public class WaitForWifiAsyncTask extends AsyncTask { - private static final String TAG = "WifiStateChangeService.WaitForWifiAsyncTask"; - private WifiManager wifiManager; + private static final String TAG = "WaitForWifiAsyncTask"; @Override protected Void doInBackground(Void... params) { - wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); try { while (!wifiManager.isWifiEnabled()) { FDroidApp.initWifiSettings(); diff --git a/F-Droid/src/org/fdroid/fdroid/receiver/WifiStateChangeReceiver.java b/F-Droid/src/org/fdroid/fdroid/receiver/WifiStateChangeReceiver.java index 1a736386a..67dfe38d8 100644 --- a/F-Droid/src/org/fdroid/fdroid/receiver/WifiStateChangeReceiver.java +++ b/F-Droid/src/org/fdroid/fdroid/receiver/WifiStateChangeReceiver.java @@ -1,23 +1,17 @@ package org.fdroid.fdroid.receiver; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; -import android.net.NetworkInfo; -import android.net.wifi.WifiManager; -import org.fdroid.fdroid.FDroidApp; 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)); - } else { - FDroidApp.initWifiSettings(); - } + intent.setComponent(new ComponentName(context, WifiStateChangeService.class)); + context.startService(intent); } }