purge WifiSwap class in favor of Intents and Services
This commit is contained in:
		
							parent
							
								
									46472ba7a4
								
							
						
					
					
						commit
						effcf4bfa9
					
				@ -33,8 +33,6 @@ import org.fdroid.fdroid.data.Schema;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.peers.Peer;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.peers.PeerFinder;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.type.BluetoothSwap;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.type.SwapType;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.type.WifiSwap;
 | 
			
		||||
import org.fdroid.fdroid.net.Downloader;
 | 
			
		||||
import org.fdroid.fdroid.net.WifiStateChangeService;
 | 
			
		||||
import org.fdroid.fdroid.views.swap.SwapWorkflowActivity;
 | 
			
		||||
@ -336,27 +334,6 @@ public class SwapService extends Service {
 | 
			
		||||
        swapPreferences.edit().putBoolean(SwapService.KEY_WIFI_ENABLED_BEFORE_SWAP, visible).apply();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handles checking if the {@link SwapService} is running, and only restarts it if it was running.
 | 
			
		||||
     */
 | 
			
		||||
    public void stopWifiIfEnabled(final boolean restartAfterStopping) {
 | 
			
		||||
        if (wifiSwap.isConnected()) {
 | 
			
		||||
            new AsyncTask<Void, Void, Void>() {
 | 
			
		||||
                @Override
 | 
			
		||||
                protected Void doInBackground(Void... params) {
 | 
			
		||||
                    Utils.debugLog(TAG, "Stopping the currently running WiFi swap service (on background thread)");
 | 
			
		||||
                    wifiSwap.stop();
 | 
			
		||||
 | 
			
		||||
                    if (restartAfterStopping) {
 | 
			
		||||
                        Utils.debugLog(TAG, "Restarting WiFi swap service after stopping (still on background thread)");
 | 
			
		||||
                        wifiSwap.start();
 | 
			
		||||
                    }
 | 
			
		||||
                    return null;
 | 
			
		||||
                }
 | 
			
		||||
            }.execute();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isEnabled() {
 | 
			
		||||
        return bluetoothSwap.isConnected() || LocalHTTPDManager.isAlive();
 | 
			
		||||
    }
 | 
			
		||||
@ -373,9 +350,7 @@ public class SwapService extends Service {
 | 
			
		||||
    //        Old SwapService stuff being merged into that.
 | 
			
		||||
    // ===============================================================
 | 
			
		||||
 | 
			
		||||
    public static final String BONJOUR_STATE_CHANGE = "org.fdroid.fdroid.BONJOUR_STATE_CHANGE";
 | 
			
		||||
    public static final String BLUETOOTH_STATE_CHANGE = "org.fdroid.fdroid.BLUETOOTH_STATE_CHANGE";
 | 
			
		||||
    public static final String WIFI_STATE_CHANGE = "org.fdroid.fdroid.WIFI_STATE_CHANGE";
 | 
			
		||||
    public static final String EXTRA_STARTING = "STARTING";
 | 
			
		||||
    public static final String EXTRA_STARTED = "STARTED";
 | 
			
		||||
    public static final String EXTRA_STOPPING = "STOPPING";
 | 
			
		||||
@ -384,8 +359,7 @@ public class SwapService extends Service {
 | 
			
		||||
    private static final int NOTIFICATION = 1;
 | 
			
		||||
 | 
			
		||||
    private final Binder binder = new Binder();
 | 
			
		||||
    private SwapType bluetoothSwap;
 | 
			
		||||
    private WifiSwap wifiSwap;
 | 
			
		||||
    private BluetoothSwap bluetoothSwap;
 | 
			
		||||
 | 
			
		||||
    private static final int TIMEOUT = 15 * 60 * 1000; // 15 mins
 | 
			
		||||
 | 
			
		||||
@ -395,14 +369,10 @@ public class SwapService extends Service {
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private Timer timer;
 | 
			
		||||
 | 
			
		||||
    public SwapType getBluetoothSwap() {
 | 
			
		||||
    public BluetoothSwap getBluetoothSwap() {
 | 
			
		||||
        return bluetoothSwap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public WifiSwap getWifiSwap() {
 | 
			
		||||
        return wifiSwap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class Binder extends android.os.Binder {
 | 
			
		||||
        public SwapService getService() {
 | 
			
		||||
            return SwapService.this;
 | 
			
		||||
@ -415,6 +385,8 @@ public class SwapService extends Service {
 | 
			
		||||
        localBroadcastManager = LocalBroadcastManager.getInstance(this);
 | 
			
		||||
        swapPreferences = getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
 | 
			
		||||
 | 
			
		||||
        LocalHTTPDManager.start(this);
 | 
			
		||||
 | 
			
		||||
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
 | 
			
		||||
        if (bluetoothAdapter != null) {
 | 
			
		||||
            SwapService.putBluetoothEnabledBeforeSwap(bluetoothAdapter.isEnabled());
 | 
			
		||||
@ -427,7 +399,6 @@ public class SwapService extends Service {
 | 
			
		||||
 | 
			
		||||
        appsToSwap.addAll(deserializePackages(swapPreferences.getString(KEY_APPS_TO_SWAP, "")));
 | 
			
		||||
        bluetoothSwap = BluetoothSwap.create(this);
 | 
			
		||||
        wifiSwap = new WifiSwap(this, wifiManager);
 | 
			
		||||
 | 
			
		||||
        Preferences.get().registerLocalRepoHttpsListeners(httpsEnabledListener);
 | 
			
		||||
 | 
			
		||||
@ -435,8 +406,6 @@ public class SwapService extends Service {
 | 
			
		||||
                new IntentFilter(WifiStateChangeService.BROADCAST));
 | 
			
		||||
        localBroadcastManager.registerReceiver(onBluetoothSwapStateChange,
 | 
			
		||||
                new IntentFilter(SwapService.BLUETOOTH_STATE_CHANGE));
 | 
			
		||||
        localBroadcastManager.registerReceiver(onWifiSwapStateChange,
 | 
			
		||||
                new IntentFilter(SwapService.WIFI_STATE_CHANGE));
 | 
			
		||||
 | 
			
		||||
        if (getBluetoothVisibleUserPreference()) {
 | 
			
		||||
            Utils.debugLog(TAG, "Previously the user enabled Bluetooth swap, so enabling again automatically.");
 | 
			
		||||
@ -445,12 +414,8 @@ public class SwapService extends Service {
 | 
			
		||||
            Utils.debugLog(TAG, "Bluetooth was NOT enabled last time user swapped, starting not visible.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (getWifiVisibleUserPreference()) {
 | 
			
		||||
            Utils.debugLog(TAG, "Previously the user enabled WiFi swap, so enabling again automatically.");
 | 
			
		||||
            wifiSwap.startInBackground(); // TODO replace with Intent to SwapService
 | 
			
		||||
        } else {
 | 
			
		||||
            Utils.debugLog(TAG, "WiFi was NOT enabled last time user swapped, starting not visible.");
 | 
			
		||||
        }
 | 
			
		||||
        BonjourManager.start(this);
 | 
			
		||||
        BonjourManager.setVisible(this, getWifiVisibleUserPreference());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
@ -478,12 +443,12 @@ public class SwapService extends Service {
 | 
			
		||||
        Preferences.get().unregisterLocalRepoHttpsListeners(httpsEnabledListener);
 | 
			
		||||
        localBroadcastManager.unregisterReceiver(onWifiChange);
 | 
			
		||||
        localBroadcastManager.unregisterReceiver(onBluetoothSwapStateChange);
 | 
			
		||||
        localBroadcastManager.unregisterReceiver(onWifiSwapStateChange);
 | 
			
		||||
 | 
			
		||||
        if (bluetoothAdapter != null && !wasBluetoothEnabledBeforeSwap()) {
 | 
			
		||||
            bluetoothAdapter.disable();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        BonjourManager.stop(this);
 | 
			
		||||
        LocalHTTPDManager.stop(this);
 | 
			
		||||
        if (wifiManager != null && !wasWifiEnabledBeforeSwap()) {
 | 
			
		||||
            wifiManager.setWifiEnabled(false);
 | 
			
		||||
@ -492,7 +457,6 @@ public class SwapService extends Service {
 | 
			
		||||
        stopPollingConnectedSwapRepo();
 | 
			
		||||
 | 
			
		||||
        //TODO getBluetoothSwap().stopInBackground();
 | 
			
		||||
        getWifiSwap().stopInBackground();
 | 
			
		||||
 | 
			
		||||
        if (timer != null) {
 | 
			
		||||
            timer.cancel();
 | 
			
		||||
@ -574,24 +538,33 @@ public class SwapService extends Service {
 | 
			
		||||
        }, TIMEOUT);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void restartWiFiServices() {
 | 
			
		||||
        boolean hasIp = FDroidApp.ipAddressString != null;
 | 
			
		||||
        if (hasIp) {
 | 
			
		||||
            LocalHTTPDManager.restart(this);
 | 
			
		||||
            BonjourManager.restart(this);
 | 
			
		||||
            BonjourManager.setVisible(this, getWifiVisibleUserPreference());
 | 
			
		||||
        } else {
 | 
			
		||||
            BonjourManager.stop(this);
 | 
			
		||||
            LocalHTTPDManager.stop(this);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private final Preferences.ChangeListener httpsEnabledListener = new Preferences.ChangeListener() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onPreferenceChange() {
 | 
			
		||||
            Log.i(TAG, "Swap over HTTPS preference changed.");
 | 
			
		||||
            stopWifiIfEnabled(true);
 | 
			
		||||
            restartWiFiServices();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private final BroadcastReceiver onWifiChange = new BroadcastReceiver() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onReceive(Context context, Intent i) {
 | 
			
		||||
            boolean hasIp = FDroidApp.ipAddressString != null;
 | 
			
		||||
            stopWifiIfEnabled(hasIp);
 | 
			
		||||
            restartWiFiServices();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private final BroadcastReceiver onBluetoothSwapStateChange = new SwapStateChangeReceiver();
 | 
			
		||||
    private final BroadcastReceiver onWifiSwapStateChange = new SwapStateChangeReceiver();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * When swapping is setup, then start the index polling.
 | 
			
		||||
 | 
			
		||||
@ -5,15 +5,17 @@ import android.content.BroadcastReceiver;
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.content.IntentFilter;
 | 
			
		||||
import android.os.AsyncTask;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.annotation.Nullable;
 | 
			
		||||
import android.support.v4.content.LocalBroadcastManager;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
import org.fdroid.fdroid.Utils;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.SwapService;
 | 
			
		||||
import org.fdroid.fdroid.net.bluetooth.BluetoothServer;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings("LineLength")
 | 
			
		||||
public final class BluetoothSwap extends SwapType {
 | 
			
		||||
public class BluetoothSwap {
 | 
			
		||||
 | 
			
		||||
    private static final String TAG = "BluetoothSwap";
 | 
			
		||||
    public static final String BLUETOOTH_NAME_TAG = "FDroid:";
 | 
			
		||||
@ -24,12 +26,17 @@ public final class BluetoothSwap extends SwapType {
 | 
			
		||||
    private final BluetoothAdapter adapter;
 | 
			
		||||
    private boolean isDiscoverable;
 | 
			
		||||
 | 
			
		||||
    private boolean isConnected;
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    protected final Context context;
 | 
			
		||||
 | 
			
		||||
    @Nullable
 | 
			
		||||
    private BluetoothServer server;
 | 
			
		||||
 | 
			
		||||
    private String deviceBluetoothName;
 | 
			
		||||
 | 
			
		||||
    public static SwapType create(@NonNull Context context) {
 | 
			
		||||
    public static BluetoothSwap create(@NonNull Context context) {
 | 
			
		||||
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
 | 
			
		||||
        if (adapter == null) {
 | 
			
		||||
            return new NoBluetoothType(context);
 | 
			
		||||
@ -42,21 +49,18 @@ public final class BluetoothSwap extends SwapType {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private BluetoothSwap(@NonNull Context context, @NonNull BluetoothAdapter adapter) {
 | 
			
		||||
        super(context);
 | 
			
		||||
        this.context = context;
 | 
			
		||||
        this.adapter = adapter;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isDiscoverable() {
 | 
			
		||||
        return isDiscoverable;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isConnected() {
 | 
			
		||||
        return server != null && server.isRunning() && super.isConnected();
 | 
			
		||||
        return server != null && server.isRunning() && isConnected;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public synchronized void start() {
 | 
			
		||||
        if (isConnected()) {
 | 
			
		||||
            Utils.debugLog(TAG, "already running, quitting start()");
 | 
			
		||||
@ -128,26 +132,10 @@ public final class BluetoothSwap extends SwapType {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Don't try to start BT in the background. you can only start/stop a BT server once, else new connections don't work.
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void stopInBackground() {
 | 
			
		||||
        stop();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void stop() {
 | 
			
		||||
        if (server != null && server.isAlive()) {
 | 
			
		||||
            server.close();
 | 
			
		||||
            setConnected(false);
 | 
			
		||||
 | 
			
		||||
            /*
 | 
			
		||||
            if (receiver != null) {
 | 
			
		||||
                context.unregisterReceiver(receiver);
 | 
			
		||||
                receiver = null;
 | 
			
		||||
            }
 | 
			
		||||
            */
 | 
			
		||||
        } else {
 | 
			
		||||
            Log.i(TAG, "Attempting to stop Bluetooth swap, but it is not currently running.");
 | 
			
		||||
        }
 | 
			
		||||
@ -158,15 +146,50 @@ public final class BluetoothSwap extends SwapType {
 | 
			
		||||
        adapter.setName(deviceBluetoothName);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getBroadcastAction() {
 | 
			
		||||
    protected String getBroadcastAction() {
 | 
			
		||||
        return SwapService.BLUETOOTH_STATE_CHANGE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static class NoBluetoothType extends SwapType {
 | 
			
		||||
    protected final void setConnected(boolean connected) {
 | 
			
		||||
        if (connected) {
 | 
			
		||||
            isConnected = true;
 | 
			
		||||
            sendBroadcast(SwapService.EXTRA_STARTED);
 | 
			
		||||
        } else {
 | 
			
		||||
            isConnected = false;
 | 
			
		||||
            sendBroadcast(SwapService.EXTRA_STOPPED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends either a {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STARTING},
 | 
			
		||||
     * {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STARTED} or
 | 
			
		||||
     * {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STOPPED} broadcast.
 | 
			
		||||
     */
 | 
			
		||||
    protected final void sendBroadcast(String extra) {
 | 
			
		||||
        if (getBroadcastAction() != null) {
 | 
			
		||||
            Intent intent = new Intent(getBroadcastAction());
 | 
			
		||||
            intent.putExtra(extra, true);
 | 
			
		||||
            Utils.debugLog(TAG, "Sending broadcast " + extra + " from " + getClass().getSimpleName());
 | 
			
		||||
            LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void startInBackground() {
 | 
			
		||||
        // TODO switch to thread which is killed if still running, like WiFiStateChangeService
 | 
			
		||||
        new AsyncTask<Void, Void, Void>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            protected Void doInBackground(Void... params) {
 | 
			
		||||
                start();
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }.execute();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private static class NoBluetoothType extends BluetoothSwap {
 | 
			
		||||
 | 
			
		||||
        NoBluetoothType(@NonNull Context context) {
 | 
			
		||||
            super(context);
 | 
			
		||||
            super(context, null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        @Override
 | 
			
		||||
 | 
			
		||||
@ -1,109 +0,0 @@
 | 
			
		||||
package org.fdroid.fdroid.localrepo.type;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.content.Intent;
 | 
			
		||||
import android.os.AsyncTask;
 | 
			
		||||
import android.support.annotation.NonNull;
 | 
			
		||||
import android.support.v4.content.LocalBroadcastManager;
 | 
			
		||||
 | 
			
		||||
import org.fdroid.fdroid.Utils;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.SwapService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * There is lots of common functionality, and a common API among different communication protocols
 | 
			
		||||
 * associated with the swap process. This includes Bluetooth visability, Bonjour visability,
 | 
			
		||||
 * and the web server which serves info for swapping. This class provides a common API for
 | 
			
		||||
 * starting and stopping these services. In addition, it helps with the process of sending broadcast
 | 
			
		||||
 * intents in response to the thing starting or stopping.
 | 
			
		||||
 */
 | 
			
		||||
public abstract class SwapType {
 | 
			
		||||
 | 
			
		||||
    private static final String TAG = "SwapType";
 | 
			
		||||
 | 
			
		||||
    private boolean isConnected;
 | 
			
		||||
 | 
			
		||||
    @NonNull
 | 
			
		||||
    protected final Context context;
 | 
			
		||||
 | 
			
		||||
    public SwapType(@NonNull Context context) {
 | 
			
		||||
        this.context = context;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public abstract void start();
 | 
			
		||||
 | 
			
		||||
    public abstract void stop();
 | 
			
		||||
 | 
			
		||||
    protected abstract String getBroadcastAction();
 | 
			
		||||
 | 
			
		||||
    public boolean isDiscoverable() {
 | 
			
		||||
        return isConnected();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected final void setConnected(boolean connected) {
 | 
			
		||||
        if (connected) {
 | 
			
		||||
            isConnected = true;
 | 
			
		||||
            sendBroadcast(SwapService.EXTRA_STARTED);
 | 
			
		||||
        } else {
 | 
			
		||||
            isConnected = false;
 | 
			
		||||
            onStopped();
 | 
			
		||||
            sendBroadcast(SwapService.EXTRA_STOPPED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected void onStopped() { }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends either a {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STARTING},
 | 
			
		||||
     * {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STARTED} or
 | 
			
		||||
     * {@link org.fdroid.fdroid.localrepo.SwapService#EXTRA_STOPPED} broadcast.
 | 
			
		||||
     */
 | 
			
		||||
    protected final void sendBroadcast(String extra) {
 | 
			
		||||
        if (getBroadcastAction() != null) {
 | 
			
		||||
            Intent intent = new Intent(getBroadcastAction());
 | 
			
		||||
            intent.putExtra(extra, true);
 | 
			
		||||
            Utils.debugLog(TAG, "Sending broadcast " + extra + " from " + getClass().getSimpleName());
 | 
			
		||||
            LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public boolean isConnected() {
 | 
			
		||||
        return isConnected;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void startInBackground() {
 | 
			
		||||
        new AsyncTask<Void, Void, Void>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            protected Void doInBackground(Void... params) {
 | 
			
		||||
                start();
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }.execute();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void ensureRunning() {
 | 
			
		||||
        if (!isConnected()) {
 | 
			
		||||
            start();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void ensureRunningInBackground() {
 | 
			
		||||
        new AsyncTask<Void, Void, Void>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            protected Void doInBackground(Void... params) {
 | 
			
		||||
                ensureRunning();
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }.execute();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void stopInBackground() {
 | 
			
		||||
        new AsyncTask<Void, Void, Void>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            protected Void doInBackground(Void... params) {
 | 
			
		||||
                stop();
 | 
			
		||||
                return null;
 | 
			
		||||
            }
 | 
			
		||||
        }.execute();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -1,49 +0,0 @@
 | 
			
		||||
package org.fdroid.fdroid.localrepo.type;
 | 
			
		||||
 | 
			
		||||
import android.content.Context;
 | 
			
		||||
import android.net.wifi.WifiManager;
 | 
			
		||||
import org.fdroid.fdroid.FDroidApp;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.BonjourManager;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.LocalHTTPDManager;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.SwapService;
 | 
			
		||||
 | 
			
		||||
@SuppressWarnings("LineLength")
 | 
			
		||||
public class WifiSwap extends SwapType {
 | 
			
		||||
 | 
			
		||||
    private static final String TAG = "WifiSwap";
 | 
			
		||||
 | 
			
		||||
    private final WifiManager wifiManager;
 | 
			
		||||
 | 
			
		||||
    public WifiSwap(Context context, WifiManager wifiManager) {
 | 
			
		||||
        super(context);
 | 
			
		||||
        this.wifiManager = wifiManager;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    protected String getBroadcastAction() {
 | 
			
		||||
        return SwapService.WIFI_STATE_CHANGE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void start() {
 | 
			
		||||
        sendBroadcast(SwapService.EXTRA_STARTING);
 | 
			
		||||
        wifiManager.setWifiEnabled(true);
 | 
			
		||||
        LocalHTTPDManager.start(context);
 | 
			
		||||
        BonjourManager.start(context);
 | 
			
		||||
        BonjourManager.setVisible(context, SwapService.getWifiVisibleUserPreference());
 | 
			
		||||
 | 
			
		||||
        if (FDroidApp.ipAddressString == null) {
 | 
			
		||||
            setConnected(false);
 | 
			
		||||
        } else {
 | 
			
		||||
            setConnected(true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void stop() {
 | 
			
		||||
        sendBroadcast(SwapService.EXTRA_STOPPING); // This needs to be per-SwapType
 | 
			
		||||
        LocalHTTPDManager.stop(context);
 | 
			
		||||
        BonjourManager.stop(context);
 | 
			
		||||
        setConnected(false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -59,10 +59,12 @@ public class WifiStateChangeService extends IntentService {
 | 
			
		||||
    private static final String TAG = "WifiStateChangeService";
 | 
			
		||||
 | 
			
		||||
    public static final String BROADCAST = "org.fdroid.fdroid.action.WIFI_CHANGE";
 | 
			
		||||
    public static final String EXTRA_STATUS = "wifiStateChangeStatus";
 | 
			
		||||
 | 
			
		||||
    private WifiManager wifiManager;
 | 
			
		||||
    private static WifiInfoThread wifiInfoThread;
 | 
			
		||||
    private static int previousWifiState = Integer.MIN_VALUE;
 | 
			
		||||
    private static int wifiState;
 | 
			
		||||
 | 
			
		||||
    public WifiStateChangeService() {
 | 
			
		||||
        super("WifiStateChangeService");
 | 
			
		||||
@ -86,7 +88,7 @@ public class WifiStateChangeService extends IntentService {
 | 
			
		||||
        Utils.debugLog(TAG, "WiFi change service started.");
 | 
			
		||||
        NetworkInfo ni = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
 | 
			
		||||
        wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
 | 
			
		||||
        int wifiState = wifiManager.getWifiState();
 | 
			
		||||
        wifiState = wifiManager.getWifiState();
 | 
			
		||||
        if (ni == null || ni.isConnected()) {
 | 
			
		||||
            Utils.debugLog(TAG, "ni == " + ni + "  wifiState == " + printWifiState(wifiState));
 | 
			
		||||
            if (previousWifiState != wifiState &&
 | 
			
		||||
@ -219,6 +221,7 @@ public class WifiStateChangeService extends IntentService {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            Intent intent = new Intent(BROADCAST);
 | 
			
		||||
            intent.putExtra(EXTRA_STATUS, wifiState);
 | 
			
		||||
            LocalBroadcastManager.getInstance(WifiStateChangeService.this).sendBroadcast(intent);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,6 @@ import cc.mvdan.accesspoint.WifiApControl;
 | 
			
		||||
import org.fdroid.fdroid.FDroidApp;
 | 
			
		||||
import org.fdroid.fdroid.R;
 | 
			
		||||
import org.fdroid.fdroid.Utils;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.BonjourManager;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.SwapService;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.SwapView;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.peers.Peer;
 | 
			
		||||
@ -82,9 +81,7 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
    @Nullable /* Emulators typically don't have bluetooth adapters */
 | 
			
		||||
    private final BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
 | 
			
		||||
 | 
			
		||||
    private SwitchCompat wifiSwitch;
 | 
			
		||||
    private SwitchCompat bluetoothSwitch;
 | 
			
		||||
    private TextView textWifiVisible;
 | 
			
		||||
    private TextView viewBluetoothId;
 | 
			
		||||
    private TextView textBluetoothVisible;
 | 
			
		||||
    private TextView viewWifiId;
 | 
			
		||||
@ -134,15 +131,10 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
            peerFinderSubscription = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (wifiSwitch != null) {
 | 
			
		||||
            wifiSwitch.setOnCheckedChangeListener(null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (bluetoothSwitch != null) {
 | 
			
		||||
            bluetoothSwitch.setOnCheckedChangeListener(null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(onWifiSwapStateChanged);
 | 
			
		||||
        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(onBluetoothSwapStateChanged);
 | 
			
		||||
        LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(onWifiNetworkChanged);
 | 
			
		||||
    }
 | 
			
		||||
@ -159,7 +151,6 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
        uiInitBluetooth();
 | 
			
		||||
        uiInitWifi();
 | 
			
		||||
        uiInitButtons();
 | 
			
		||||
        uiShowSearchingForPeers();
 | 
			
		||||
 | 
			
		||||
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(
 | 
			
		||||
                onWifiNetworkChanged, new IntentFilter(WifiStateChangeService.BROADCAST));
 | 
			
		||||
@ -210,11 +201,6 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void uiShowSearchingForPeers() {
 | 
			
		||||
        peopleNearbyText.setText(getContext().getString(R.string.swap_scanning_for_peers));
 | 
			
		||||
        peopleNearbyProgress.setVisibility(View.VISIBLE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void uiShowNotSearchingForPeers() {
 | 
			
		||||
        peopleNearbyProgress.setVisibility(View.GONE);
 | 
			
		||||
        if (peopleNearbyList.getAdapter().getCount() > 0) {
 | 
			
		||||
@ -253,9 +239,6 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @see StartSwapView#onWifiSwapStateChanged
 | 
			
		||||
     */
 | 
			
		||||
    private final BroadcastReceiver onBluetoothSwapStateChanged = new BroadcastReceiver() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onReceive(Context context, Intent intent) {
 | 
			
		||||
@ -279,9 +262,6 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @see StartSwapView#setWifiSwitchState(boolean, boolean)
 | 
			
		||||
     */
 | 
			
		||||
    private void setBluetoothSwitchState(boolean isChecked, boolean isEnabled) {
 | 
			
		||||
        bluetoothSwitch.setOnCheckedChangeListener(null);
 | 
			
		||||
        bluetoothSwitch.setChecked(isChecked);
 | 
			
		||||
@ -289,9 +269,6 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
        bluetoothSwitch.setOnCheckedChangeListener(onBluetoothSwitchToggled);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @see StartSwapView#onWifiSwitchToggled
 | 
			
		||||
     */
 | 
			
		||||
    private final CompoundButton.OnCheckedChangeListener onBluetoothSwitchToggled = new CompoundButton.OnCheckedChangeListener() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 | 
			
		||||
@ -318,109 +295,9 @@ public class StartSwapView extends SwapView {
 | 
			
		||||
        viewWifiId = (TextView) findViewById(R.id.device_id_wifi);
 | 
			
		||||
        viewWifiNetwork = (TextView) findViewById(R.id.wifi_network);
 | 
			
		||||
 | 
			
		||||
        wifiSwitch = (SwitchCompat) findViewById(R.id.switch_wifi);
 | 
			
		||||
        wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 | 
			
		||||
                BonjourManager.setVisible(getContext(), isChecked);
 | 
			
		||||
                SwapService.putWifiVisibleUserPreference(isChecked);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        textWifiVisible = findViewById(R.id.wifi_visible);
 | 
			
		||||
 | 
			
		||||
        // Note that this is only listening for the WifiSwap, whereas we start both the WifiSwap
 | 
			
		||||
        // and the Bonjour service at the same time. Technically swap will work fine without
 | 
			
		||||
        // Bonjour, and that is more of a convenience. Thus, we should show feedback once wifi
 | 
			
		||||
        // is ready, even if Bonjour is not yet.
 | 
			
		||||
        LocalBroadcastManager.getInstance(getContext()).registerReceiver(onWifiSwapStateChanged,
 | 
			
		||||
                new IntentFilter(SwapService.WIFI_STATE_CHANGE));
 | 
			
		||||
 | 
			
		||||
        viewWifiNetwork.setOnClickListener(new OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                getActivity().promptToSelectWifiNetwork();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        uiUpdateWifiNetwork();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * When the WiFi swap service is started or stopped, update the UI appropriately.
 | 
			
		||||
     * This includes both the in-transit states of "Starting" and "Stopping". In these two cases,
 | 
			
		||||
     * the UI should be disabled to prevent the user quickly switching back and forth - causing
 | 
			
		||||
     * multiple start/stop actions to be sent to the swap service.
 | 
			
		||||
     */
 | 
			
		||||
    private final BroadcastReceiver onWifiSwapStateChanged = new BroadcastReceiver() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onReceive(Context context, Intent intent) {
 | 
			
		||||
            if (intent.hasExtra(SwapService.EXTRA_STARTING)) {
 | 
			
		||||
                Utils.debugLog(TAG, "WiFi service is starting (setting toggle to checked, but disabled).");
 | 
			
		||||
                textWifiVisible.setText(R.string.swap_setting_up_wifi);
 | 
			
		||||
                setWifiSwitchState(true, false);
 | 
			
		||||
            } else if (intent.hasExtra(SwapService.EXTRA_STOPPING)) {
 | 
			
		||||
                Utils.debugLog(TAG, "WiFi service is stopping (setting toggle to unchecked and disabled).");
 | 
			
		||||
                textWifiVisible.setText(R.string.swap_stopping_wifi);
 | 
			
		||||
                setWifiSwitchState(false, false);
 | 
			
		||||
            } else {
 | 
			
		||||
                if (intent.hasExtra(SwapService.EXTRA_STARTED)) {
 | 
			
		||||
                    Utils.debugLog(TAG, "WiFi service has started (setting toggle to visible).");
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_visible_wifi);
 | 
			
		||||
                    setWifiSwitchState(true, true);
 | 
			
		||||
                } else {
 | 
			
		||||
                    Utils.debugLog(TAG, "WiFi service has stopped (setting toggle to not-visible).");
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_not_visible_wifi);
 | 
			
		||||
                    setWifiSwitchState(false, true);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            uiUpdateWifiNetwork();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Helper function to set the "enable wifi" switch, but prevents the listeners from
 | 
			
		||||
     * being notified. This enables the UI to be updated without triggering further enable/disable
 | 
			
		||||
     * events being queued.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * This is required because the SwitchCompat and its parent classes will always try to notify
 | 
			
		||||
     * their listeners if there is one (e.g. http://stackoverflow.com/a/15523518).
 | 
			
		||||
     * <p>
 | 
			
		||||
     * The fact that this method also deals with enabling/disabling the switch is more of a convenience
 | 
			
		||||
     * Nigh on all times this UI wants to change the state of the switch, it is also interested in
 | 
			
		||||
     * ensuring the enabled state of the switch.
 | 
			
		||||
     */
 | 
			
		||||
    private void setWifiSwitchState(boolean isChecked, boolean isEnabled) {
 | 
			
		||||
        wifiSwitch.setOnCheckedChangeListener(null);
 | 
			
		||||
        wifiSwitch.setChecked(isChecked);
 | 
			
		||||
        wifiSwitch.setEnabled(isEnabled);
 | 
			
		||||
        wifiSwitch.setOnCheckedChangeListener(onWifiSwitchToggled);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * When the wifi switch is:
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Toggled on: Ask the swap service to ensure wifi swap is running.
 | 
			
		||||
     * Toggled off: Ask the swap service to prevent the wifi swap service from running.
 | 
			
		||||
     * <p>
 | 
			
		||||
     * Both of these actions will be performed in a background thread which will send broadcast
 | 
			
		||||
     * intents when they are completed.
 | 
			
		||||
     */
 | 
			
		||||
    private final CompoundButton.OnCheckedChangeListener onWifiSwitchToggled = new CompoundButton.OnCheckedChangeListener() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 | 
			
		||||
            if (isChecked) {
 | 
			
		||||
                Utils.debugLog(TAG, "Received onCheckChanged(true) for WiFi swap, asking in background thread to ensure WiFi swap is running.");
 | 
			
		||||
                getActivity().getSwapService().getWifiSwap().ensureRunningInBackground();
 | 
			
		||||
            } else {
 | 
			
		||||
                Utils.debugLog(TAG, "Received onCheckChanged(false) for WiFi swap, disabling WiFi swap in background thread.");
 | 
			
		||||
                getActivity().getSwapService().getWifiSwap().stopInBackground();
 | 
			
		||||
            }
 | 
			
		||||
            SwapService.putWifiVisibleUserPreference(isChecked);
 | 
			
		||||
            uiUpdateWifiNetwork();
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private void uiUpdateWifiNetwork() {
 | 
			
		||||
 | 
			
		||||
        viewWifiId.setText(FDroidApp.ipAddressString);
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ import android.support.v4.view.MenuItemCompat;
 | 
			
		||||
import android.support.v7.app.AlertDialog;
 | 
			
		||||
import android.support.v7.app.AppCompatActivity;
 | 
			
		||||
import android.support.v7.widget.SearchView;
 | 
			
		||||
import android.support.v7.widget.SwitchCompat;
 | 
			
		||||
import android.support.v7.widget.Toolbar;
 | 
			
		||||
import android.text.TextUtils;
 | 
			
		||||
import android.util.Log;
 | 
			
		||||
@ -61,6 +62,8 @@ import org.fdroid.fdroid.data.Repo;
 | 
			
		||||
import org.fdroid.fdroid.data.RepoProvider;
 | 
			
		||||
import org.fdroid.fdroid.installer.InstallManagerService;
 | 
			
		||||
import org.fdroid.fdroid.installer.Installer;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.BonjourManager;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.LocalHTTPDManager;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.LocalRepoService;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.SwapService;
 | 
			
		||||
import org.fdroid.fdroid.localrepo.SwapView;
 | 
			
		||||
@ -343,6 +346,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
                new IntentFilter(SwapWorkflowActivity.PrepareSwapRepo.ACTION));
 | 
			
		||||
        localBroadcastManager.registerReceiver(repoUpdateReceiver,
 | 
			
		||||
                new IntentFilter(UpdateService.LOCAL_ACTION_STATUS));
 | 
			
		||||
        localBroadcastManager.registerReceiver(bonjourStatus, new IntentFilter(BonjourManager.ACTION_STATUS));
 | 
			
		||||
 | 
			
		||||
        checkIncomingIntent();
 | 
			
		||||
 | 
			
		||||
@ -359,6 +363,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
        localBroadcastManager.unregisterReceiver(onWifiStateChanged);
 | 
			
		||||
        localBroadcastManager.unregisterReceiver(prepareSwapReceiver);
 | 
			
		||||
        localBroadcastManager.unregisterReceiver(repoUpdateReceiver);
 | 
			
		||||
        localBroadcastManager.unregisterReceiver(bonjourStatus);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@ -388,17 +393,6 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public void promptToSelectWifiNetwork() {
 | 
			
		||||
        //
 | 
			
		||||
        // On Android >= 5.0, the neutral button is the one by itself off to the left of a dialog
 | 
			
		||||
        // (not the negative button). Thus, the layout of this dialogs buttons should be:
 | 
			
		||||
        //
 | 
			
		||||
        // |                                 |
 | 
			
		||||
        // +---------------------------------+
 | 
			
		||||
        // | Cancel           Hotspot   WiFi |
 | 
			
		||||
        // +---------------------------------+
 | 
			
		||||
        //
 | 
			
		||||
        // TODO: Investigate if this should be set dynamically for earlier APIs.
 | 
			
		||||
        //
 | 
			
		||||
        new AlertDialog.Builder(this)
 | 
			
		||||
                .setTitle(R.string.swap_join_same_wifi)
 | 
			
		||||
                .setMessage(R.string.swap_join_same_wifi_desc)
 | 
			
		||||
@ -505,6 +499,9 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
            case R.layout.swap_connecting:
 | 
			
		||||
                setUpConnectingView();
 | 
			
		||||
                break;
 | 
			
		||||
            case R.layout.swap_start_swap:
 | 
			
		||||
                setUpStartVisibility();
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -568,7 +565,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
 | 
			
		||||
        if (adapter == null
 | 
			
		||||
                || Build.VERSION.SDK_INT >= 23 // TODO make Bluetooth work with content:// URIs
 | 
			
		||||
                || (!adapter.isEnabled() && getSwapService().getWifiSwap().isConnected())) {
 | 
			
		||||
                || (!adapter.isEnabled() && LocalHTTPDManager.isAlive())) {
 | 
			
		||||
            inflateSwapView(R.layout.swap_send_fdroid);
 | 
			
		||||
        } else {
 | 
			
		||||
            sendFDroidBluetooth();
 | 
			
		||||
@ -814,8 +811,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
            if (service == null) {
 | 
			
		||||
                message = "No swap service";
 | 
			
		||||
            } else {
 | 
			
		||||
                String bluetooth = service.getBluetoothSwap().isConnected() ? "Y" : " N";
 | 
			
		||||
                String wifi = service.getWifiSwap().isConnected() ? "Y" : " N";
 | 
			
		||||
                String bluetooth = getSwapService().getBluetoothSwap().isConnected() ? "Y" : " N";
 | 
			
		||||
 | 
			
		||||
                BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
 | 
			
		||||
                bluetooth = "N/A";
 | 
			
		||||
@ -826,12 +822,11 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
                    scanModes.put(BluetoothAdapter.SCAN_MODE_NONE, "NONE");
 | 
			
		||||
                    bluetooth = "\"" + adapter.getName() + "\" - " + scanModes.get(adapter.getScanMode());
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                message += "Find { BT: " + bluetooth + ", WiFi: " + wifi + "}";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Date now = new Date();
 | 
			
		||||
            Utils.debugLog("Swap Status", now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds() + " " + message);
 | 
			
		||||
            Utils.debugLog("SWAP_STATUS",
 | 
			
		||||
                    now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds() + " " + message);
 | 
			
		||||
 | 
			
		||||
            new Timer().schedule(new TimerTask() {
 | 
			
		||||
                                     @Override
 | 
			
		||||
@ -888,6 +883,26 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onReceive(Context context, Intent intent) {
 | 
			
		||||
            setUpFromWifi();
 | 
			
		||||
 | 
			
		||||
            int wifiStatus = -1;
 | 
			
		||||
            TextView textWifiVisible = container.findViewById(R.id.wifi_visible);
 | 
			
		||||
            if (textWifiVisible != null) {
 | 
			
		||||
                intent.getIntExtra(WifiStateChangeService.EXTRA_STATUS, -1);
 | 
			
		||||
            }
 | 
			
		||||
            switch (wifiStatus) {
 | 
			
		||||
                case WifiManager.WIFI_STATE_ENABLING:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_setting_up_wifi);
 | 
			
		||||
                    break;
 | 
			
		||||
                case WifiManager.WIFI_STATE_ENABLED:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_not_visible_wifi);
 | 
			
		||||
                    break;
 | 
			
		||||
                case WifiManager.WIFI_STATE_DISABLING:
 | 
			
		||||
                case WifiManager.WIFI_STATE_DISABLED:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_stopping_wifi);
 | 
			
		||||
                    break;
 | 
			
		||||
                case WifiManager.WIFI_STATE_UNKNOWN:
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@ -988,6 +1003,100 @@ public class SwapWorkflowActivity extends AppCompatActivity {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void setUpStartVisibility() {
 | 
			
		||||
        TextView viewWifiNetwork = findViewById(R.id.wifi_network);
 | 
			
		||||
 | 
			
		||||
        viewWifiNetwork.setOnClickListener(new View.OnClickListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onClick(View v) {
 | 
			
		||||
                promptToSelectWifiNetwork();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        SwitchCompat wifiSwitch = findViewById(R.id.switch_wifi);
 | 
			
		||||
        wifiSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 | 
			
		||||
                Context context = getApplicationContext();
 | 
			
		||||
                if (isChecked) {
 | 
			
		||||
                    wifiManager.setWifiEnabled(true);
 | 
			
		||||
                    BonjourManager.start(context);
 | 
			
		||||
                }
 | 
			
		||||
                BonjourManager.setVisible(context, isChecked);
 | 
			
		||||
                SwapService.putWifiVisibleUserPreference(isChecked);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        if (SwapService.getWifiVisibleUserPreference()) {
 | 
			
		||||
            wifiSwitch.setChecked(true);
 | 
			
		||||
        } else {
 | 
			
		||||
            wifiSwitch.setChecked(false);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private final BroadcastReceiver bonjourStatus = new BroadcastReceiver() {
 | 
			
		||||
        @Override
 | 
			
		||||
        public void onReceive(Context context, Intent intent) {
 | 
			
		||||
            TextView textWifiVisible = container.findViewById(R.id.wifi_visible);
 | 
			
		||||
            TextView peopleNearbyText = container.findViewById(R.id.text_people_nearby);
 | 
			
		||||
            ProgressBar peopleNearbyProgress = container.findViewById(R.id.searching_people_nearby);
 | 
			
		||||
            if (textWifiVisible == null || peopleNearbyText == null || peopleNearbyProgress == null
 | 
			
		||||
                    || !BonjourManager.ACTION_STATUS.equals(intent.getAction())) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            int status = intent.getIntExtra(BonjourManager.EXTRA_STATUS, -1);
 | 
			
		||||
            Log.i(TAG, "BonjourManager.EXTRA_STATUS: " + status);
 | 
			
		||||
            switch (status) {
 | 
			
		||||
                case BonjourManager.STATUS_STARTING:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_setting_up_wifi);
 | 
			
		||||
                    peopleNearbyText.setText(R.string.swap_starting);
 | 
			
		||||
                    peopleNearbyText.setVisibility(View.VISIBLE);
 | 
			
		||||
                    peopleNearbyProgress.setVisibility(View.VISIBLE);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BonjourManager.STATUS_STARTED:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_not_visible_wifi);
 | 
			
		||||
                    peopleNearbyText.setText(R.string.swap_scanning_for_peers);
 | 
			
		||||
                    peopleNearbyText.setVisibility(View.VISIBLE);
 | 
			
		||||
                    peopleNearbyProgress.setVisibility(View.VISIBLE);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BonjourManager.STATUS_NOT_VISIBLE:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_not_visible_wifi);
 | 
			
		||||
                    peopleNearbyText.setText(R.string.swap_scanning_for_peers);
 | 
			
		||||
                    peopleNearbyText.setVisibility(View.VISIBLE);
 | 
			
		||||
                    peopleNearbyProgress.setVisibility(View.VISIBLE);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BonjourManager.STATUS_VISIBLE:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_visible_wifi);
 | 
			
		||||
                    peopleNearbyText.setText(R.string.swap_scanning_for_peers);
 | 
			
		||||
                    peopleNearbyText.setVisibility(View.VISIBLE);
 | 
			
		||||
                    peopleNearbyProgress.setVisibility(View.VISIBLE);
 | 
			
		||||
                    break;
 | 
			
		||||
                case BonjourManager.STATUS_STOPPING:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_stopping_wifi);
 | 
			
		||||
                    if (!BluetoothManager.isAlive()) {
 | 
			
		||||
                        peopleNearbyText.setText(R.string.swap_stopping);
 | 
			
		||||
                        peopleNearbyText.setVisibility(View.VISIBLE);
 | 
			
		||||
                        peopleNearbyProgress.setVisibility(View.VISIBLE);
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case BonjourManager.STATUS_STOPPED:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_not_visible_wifi);
 | 
			
		||||
                    if (!BluetoothManager.isAlive()) {
 | 
			
		||||
                        peopleNearbyText.setVisibility(View.GONE);
 | 
			
		||||
                        peopleNearbyProgress.setVisibility(View.GONE);
 | 
			
		||||
                    }
 | 
			
		||||
                    break;
 | 
			
		||||
                case BonjourManager.STATUS_ERROR:
 | 
			
		||||
                    textWifiVisible.setText(R.string.swap_not_visible_wifi);
 | 
			
		||||
                    peopleNearbyText.setText(intent.getStringExtra(Intent.EXTRA_TEXT));
 | 
			
		||||
                    peopleNearbyText.setVisibility(View.VISIBLE);
 | 
			
		||||
                    peopleNearbyProgress.setVisibility(View.GONE);
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new IllegalArgumentException("Bad intent: " + intent);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    private void setUpUseBluetoothButton() {
 | 
			
		||||
        Button useBluetooth = findViewById(R.id.btn_use_bluetooth);
 | 
			
		||||
        if (useBluetooth != null) {
 | 
			
		||||
 | 
			
		||||
@ -91,7 +91,7 @@
 | 
			
		||||
                    android:id="@+id/wifi_visible"
 | 
			
		||||
                    android:layout_width="wrap_content"
 | 
			
		||||
                    android:layout_height="wrap_content"
 | 
			
		||||
                    tools:text="@string/swap_not_visible_wifi"
 | 
			
		||||
                    tools:text="@string/swap_starting"
 | 
			
		||||
                    android:textSize="18sp"/>
 | 
			
		||||
 | 
			
		||||
            <TextView
 | 
			
		||||
@ -114,7 +114,6 @@
 | 
			
		||||
        <android.support.v7.widget.SwitchCompat
 | 
			
		||||
                android:layout_width="wrap_content"
 | 
			
		||||
                android:layout_height="wrap_content"
 | 
			
		||||
                android:enabled="false"
 | 
			
		||||
                android:id="@+id/switch_wifi"/>
 | 
			
		||||
 | 
			
		||||
    </LinearLayout>
 | 
			
		||||
 | 
			
		||||
@ -488,6 +488,8 @@ This often occurs with apps installed via Google Play or other sources, if they
 | 
			
		||||
    <!-- This is a screen title, it should be maximum 25 characters -->
 | 
			
		||||
    <string name="swap_nearby">Nearby Swap</string>
 | 
			
		||||
    <string name="swap_intro">Connect and trade apps with people near you.</string>
 | 
			
		||||
    <string name="swap_starting">Starting…</string>
 | 
			
		||||
    <string name="swap_stopping">Stopping…</string>
 | 
			
		||||
    <string name="swap_visible_bluetooth">Visible via Bluetooth</string>
 | 
			
		||||
    <string name="swap_setting_up_bluetooth">Setting up Bluetooth…</string>
 | 
			
		||||
    <string name="swap_not_visible_bluetooth">Not visible via Bluetooth</string>
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user