summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/BitmaskTileService.java13
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java12
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java36
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/fragments/TetheringDialog.java13
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/base/models/ProviderObservable.java24
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EIP.java10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java20
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java11
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/firewall/FirewallManager.java14
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ObfsVpnClient.java10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ShapeshifterClient.java13
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java26
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java10
-rw-r--r--app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java40
-rw-r--r--app/src/test/java/se/leap/bitmaskclient/tor/TorStatusObservableTest.java6
17 files changed, 176 insertions, 102 deletions
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskTileService.java b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskTileService.java
index 370a7af6..d85e0a75 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/BitmaskTileService.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/BitmaskTileService.java
@@ -8,6 +8,8 @@ import android.os.Build;
import android.service.quicksettings.Tile;
import android.service.quicksettings.TileService;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.util.Observable;
import java.util.Observer;
@@ -19,7 +21,7 @@ import se.leap.bitmaskclient.base.models.ProviderObservable;
@TargetApi(Build.VERSION_CODES.N)
-public class BitmaskTileService extends TileService implements Observer {
+public class BitmaskTileService extends TileService implements PropertyChangeListener {
@SuppressLint("Override")
@TargetApi(Build.VERSION_CODES.N)
@@ -59,7 +61,7 @@ public class BitmaskTileService extends TileService implements Observer {
public void onStartListening() {
super.onStartListening();
EipStatus.getInstance().addObserver(this);
- update(EipStatus.getInstance(), null);
+ propertyChange(new PropertyChangeEvent(EipStatus.getInstance(), EipStatus.PROPERTY_CHANGE, null, EipStatus.getInstance()));
}
@Override
@@ -69,16 +71,15 @@ public class BitmaskTileService extends TileService implements Observer {
}
@Override
- public void update(Observable o, Object arg) {
+ public void propertyChange(PropertyChangeEvent evt) {
Tile t = getQsTile();
// Tile t should never be null according to https://developer.android.com/reference/kotlin/android/service/quicksettings/TileService.
// Hovever we've got crash reports.
if (t == null) {
return;
}
-
- if (o instanceof EipStatus) {
- EipStatus status = (EipStatus) o;
+ if (EipStatus.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ EipStatus status = (EipStatus) evt.getNewValue();
Icon icon;
String title;
if (status.isConnecting() || status.isReconnecting()) {
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java
index 5da238d4..3f541d8d 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/MainActivity.java
@@ -59,8 +59,8 @@ import androidx.fragment.app.FragmentTransaction;
import org.json.JSONException;
import org.json.JSONObject;
-import java.util.Observable;
-import java.util.Observer;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
@@ -80,7 +80,7 @@ import se.leap.bitmaskclient.eip.EipSetupListener;
import se.leap.bitmaskclient.eip.EipSetupObserver;
import se.leap.bitmaskclient.providersetup.ProviderAPI;
-public class MainActivity extends AppCompatActivity implements EipSetupListener, Observer {
+public class MainActivity extends AppCompatActivity implements EipSetupListener, PropertyChangeListener {
public final static String TAG = MainActivity.class.getSimpleName();
@@ -354,9 +354,9 @@ public class MainActivity extends AppCompatActivity implements EipSetupListener,
}
@Override
- public void update(Observable o, Object arg) {
- if (o instanceof ProviderObservable) {
- this.provider = ((ProviderObservable) o).getCurrentProvider();
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (ProviderObservable.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ this.provider = (Provider) evt.getNewValue();
}
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java
index f4e09e62..fb93796e 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/EipFragment.java
@@ -56,8 +56,8 @@ import androidx.fragment.app.FragmentTransaction;
import androidx.vectordrawable.graphics.drawable.Animatable2Compat.AnimationCallback;
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
-import java.util.Observable;
-import java.util.Observer;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.VpnStatus;
@@ -80,7 +80,7 @@ import se.leap.bitmaskclient.providersetup.activities.SetupActivity;
import se.leap.bitmaskclient.tor.TorServiceCommand;
import se.leap.bitmaskclient.tor.TorStatusObservable;
-public class EipFragment extends Fragment implements Observer {
+public class EipFragment extends Fragment implements PropertyChangeListener {
public final static String TAG = EipFragment.class.getSimpleName();
@@ -375,17 +375,27 @@ public class EipFragment extends Fragment implements Observer {
}
+
@Override
- public void update(Observable observable, Object data) {
- if (observable instanceof EipStatus) {
- previousEipLevel = eipStatus.getEipLevel();
- eipStatus = (EipStatus) observable;
- handleNewStateOnMain();
-
- } else if (observable instanceof ProviderObservable) {
- provider = ((ProviderObservable) observable).getCurrentProvider();
- } else if (observable instanceof TorStatusObservable && EipStatus.getInstance().isUpdatingVpnCert()) {
- handleNewStateOnMain();
+ public void propertyChange(PropertyChangeEvent evt) {
+ switch (evt.getPropertyName()) {
+ case ProviderObservable.PROPERTY_CHANGE: {
+ provider = ((Provider) evt.getNewValue());
+ break;
+ }
+ case TorStatusObservable.PROPERTY_CHANGE: {
+ if (EipStatus.getInstance().isUpdatingVpnCert()) {
+ handleNewStateOnMain();
+ }
+ break;
+ }
+ case EipStatus.PROPERTY_CHANGE: {
+ previousEipLevel = eipStatus.getEipLevel();
+ eipStatus = (EipStatus) evt.getNewValue();
+ handleNewStateOnMain();
+ break;
+ }
+ default: {}
}
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java
index 99b1ac39..bb5a06c4 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/GatewaySelectionFragment.java
@@ -44,6 +44,8 @@ import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.lang.ref.WeakReference;
import java.util.List;
import java.util.Observable;
@@ -64,7 +66,7 @@ interface LocationListSelectionListener {
void onLocationManuallySelected(Location location);
}
-public class GatewaySelectionFragment extends Fragment implements Observer, LocationListSelectionListener, SharedPreferences.OnSharedPreferenceChangeListener {
+public class GatewaySelectionFragment extends Fragment implements PropertyChangeListener, LocationListSelectionListener, SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = GatewaySelectionFragment.class.getSimpleName();
@@ -197,9 +199,9 @@ public class GatewaySelectionFragment extends Fragment implements Observer, Loca
}
@Override
- public void update(Observable o, Object arg) {
- if (o instanceof EipStatus) {
- eipStatus = (EipStatus) o;
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (EipStatus.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ eipStatus = (EipStatus) evt.getNewValue();
Activity activity = getActivity();
if (activity != null) {
activity.runOnUiThread(this::updateRecommendedLocation);
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
index 60c21c40..e74d70a2 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/NavigationDrawerFragment.java
@@ -53,8 +53,8 @@ import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
-import java.util.Observable;
-import java.util.Observer;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import se.leap.bitmaskclient.BuildConfig;
import se.leap.bitmaskclient.R;
@@ -74,7 +74,7 @@ import se.leap.bitmaskclient.tethering.TetheringObservable;
* See the <a href="https://developer.android.com/design/patterns/navigation-drawer.html#Interaction">
* design guidelines</a> for a complete explanation of the behaviors implemented here.
*/
-public class NavigationDrawerFragment extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener, Observer {
+public class NavigationDrawerFragment extends Fragment implements SharedPreferences.OnSharedPreferenceChangeListener, PropertyChangeListener {
/**
* Per the design guidelines, you should show the drawer on launch until the user manually
@@ -444,8 +444,8 @@ public class NavigationDrawerFragment extends Fragment implements SharedPreferen
}
@Override
- public void update(Observable o, Object arg) {
- if (o instanceof TetheringObservable || o instanceof EipStatus) {
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (EipStatus.PROPERTY_CHANGE.equals(evt.getPropertyName()) || TetheringObservable.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
try {
getActivity().runOnUiThread(() ->
enableSaveBatteryEntry(!TetheringObservable.getInstance().getTetheringState().isVpnTetheringRunning()));
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/fragments/TetheringDialog.java b/app/src/main/java/se/leap/bitmaskclient/base/fragments/TetheringDialog.java
index 588daa3f..05744bc9 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/fragments/TetheringDialog.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/fragments/TetheringDialog.java
@@ -22,8 +22,8 @@ import androidx.appcompat.app.AppCompatDialogFragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
-import java.util.Observable;
-import java.util.Observer;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -52,7 +52,7 @@ import se.leap.bitmaskclient.tethering.TetheringObservable;
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-public class TetheringDialog extends AppCompatDialogFragment implements Observer {
+public class TetheringDialog extends AppCompatDialogFragment implements PropertyChangeListener {
public final static String TAG = TetheringDialog.class.getName();
@@ -241,9 +241,9 @@ public class TetheringDialog extends AppCompatDialogFragment implements Observer
}
@Override
- public void update(Observable o, Object arg) {
- if (o instanceof TetheringObservable) {
- TetheringObservable observable = (TetheringObservable) o;
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (TetheringObservable.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ TetheringObservable observable = (TetheringObservable) evt.getNewValue();
Log.d(TAG, "TetheringObservable is updated");
dataset[0].enabled = observable.isWifiTetheringEnabled();
dataset[1].enabled = observable.isUsbTetheringEnabled();
@@ -251,5 +251,4 @@ public class TetheringDialog extends AppCompatDialogFragment implements Observer
adapter.notifyDataSetChanged();
}
}
-
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/base/models/ProviderObservable.java b/app/src/main/java/se/leap/bitmaskclient/base/models/ProviderObservable.java
index 3e1e1fcc..6e28ac3e 100644
--- a/app/src/main/java/se/leap/bitmaskclient/base/models/ProviderObservable.java
+++ b/app/src/main/java/se/leap/bitmaskclient/base/models/ProviderObservable.java
@@ -2,13 +2,17 @@ package se.leap.bitmaskclient.base.models;
import androidx.annotation.NonNull;
-import java.util.Observable;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
/**
* Created by cyberta on 05.12.18.
*/
-public class ProviderObservable extends Observable {
+public class ProviderObservable {
private static ProviderObservable instance;
+ private final PropertyChangeSupport changeSupport;
+ public static final String PROPERTY_CHANGE = "ProviderObservable";
+
private Provider currentProvider;
private Provider providerForDns;
@@ -19,11 +23,23 @@ public class ProviderObservable extends Observable {
return instance;
}
+ private ProviderObservable() {
+ changeSupport = new PropertyChangeSupport(this);
+ currentProvider = new Provider();
+ }
+
+ public void addObserver(PropertyChangeListener propertyChangeListener) {
+ changeSupport.addPropertyChangeListener(propertyChangeListener);
+ }
+
+ public void deleteObserver(PropertyChangeListener propertyChangeListener) {
+ changeSupport.removePropertyChangeListener(propertyChangeListener);
+ }
+
public synchronized void updateProvider(@NonNull Provider provider) {
instance.currentProvider = provider;
instance.providerForDns = null;
- instance.setChanged();
- instance.notifyObservers();
+ instance.changeSupport.firePropertyChange(PROPERTY_CHANGE, null, provider);
}
public Provider getCurrentProvider() {
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
index d8905bca..ed61ca13 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EIP.java
@@ -67,6 +67,8 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.json.JSONException;
import org.json.JSONObject;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.io.Closeable;
import java.lang.ref.WeakReference;
import java.util.Observable;
@@ -97,7 +99,7 @@ import se.leap.bitmaskclient.eip.GatewaysManager.GatewayOptions;
* @author Sean Leonard <meanderingcode@aetherislands.net>
* @author Parménides GV <parmegv@sdf.org>
*/
-public final class EIP extends JobIntentService implements Observer {
+public final class EIP extends JobIntentService implements PropertyChangeListener {
public final static String TAG = EIP.class.getSimpleName(),
@@ -160,9 +162,9 @@ public final class EIP extends JobIntentService implements Observer {
* update eipStatus whenever it changes
*/
@Override
- public void update(Observable observable, Object data) {
- if (observable instanceof EipStatus) {
- eipStatus = (EipStatus) observable;
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (EipStatus.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ eipStatus = (EipStatus) evt.getNewValue();
}
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
index 8182cab9..c2ba8af3 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/EipStatus.java
@@ -20,10 +20,10 @@ import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_NONETWORK;
import android.content.Context;
import android.os.AsyncTask;
-import androidx.annotation.VisibleForTesting;
import android.util.Log;
-import java.util.Observable;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.LogItem;
@@ -34,7 +34,7 @@ import de.blinkt.openvpn.core.VpnStatus;
* EipStatus changes it's state (EipLevel) when ConnectionStatus gets updated by OpenVpnService or
* by VoidVpnService.
*/
-public class EipStatus extends Observable implements VpnStatus.StateListener {
+public class EipStatus implements VpnStatus.StateListener {
public static String TAG = EipStatus.class.getSimpleName();
private static EipStatus currentStatus;
@@ -60,6 +60,9 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
private int localizedResId;
private boolean isUpdatingVPNCertificate;
+ private final PropertyChangeSupport propertyChange;
+ public static final String PROPERTY_CHANGE = "EipStatus";
+
public static EipStatus getInstance() {
if (currentStatus == null) {
currentStatus = new EipStatus();
@@ -69,6 +72,7 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
}
private EipStatus() {
+ propertyChange = new PropertyChangeSupport(this);
}
@Override
@@ -300,8 +304,14 @@ public class EipStatus extends Observable implements VpnStatus.StateListener {
}
public static void refresh() {
- getInstance().setChanged();
- getInstance().notifyObservers();
+ currentStatus.propertyChange.firePropertyChange(PROPERTY_CHANGE, null, currentStatus);
+ }
+
+ public void addObserver(PropertyChangeListener propertyChangeListener) {
+ propertyChange.addPropertyChangeListener(propertyChangeListener);
}
+ public void deleteObserver(PropertyChangeListener propertyChangeListener) {
+ propertyChange.removePropertyChangeListener(propertyChangeListener);
+ }
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java b/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java
index b32671ae..f08371c6 100644
--- a/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java
+++ b/app/src/main/java/se/leap/bitmaskclient/eip/VoidVpnService.java
@@ -33,6 +33,8 @@ import android.os.ParcelFileDescriptor;
import android.system.OsConstants;
import android.util.Log;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.Observable;
import java.util.Observer;
@@ -43,7 +45,7 @@ import se.leap.bitmaskclient.R;
import se.leap.bitmaskclient.base.utils.PreferenceHelper;
-public class VoidVpnService extends VpnService implements Observer, VpnNotificationManager.VpnServiceCallback {
+public class VoidVpnService extends VpnService implements PropertyChangeListener, VpnNotificationManager.VpnServiceCallback {
static final String TAG = VoidVpnService.class.getSimpleName();
private ParcelFileDescriptor fd;
@@ -183,10 +185,11 @@ public class VoidVpnService extends VpnService implements Observer, VpnNotificat
getApplicationContext().startService(startEIP);
}
+
@Override
- public void update(Observable observable, Object arg) {
- if (observable instanceof EipStatus) {
- eipStatus = (EipStatus) observable;
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (EipStatus.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ eipStatus = (EipStatus) evt.getNewValue();
}
if (handlerThread.isInterrupted() || !handlerThread.isAlive()) {
return;
diff --git a/app/src/main/java/se/leap/bitmaskclient/firewall/FirewallManager.java b/app/src/main/java/se/leap/bitmaskclient/firewall/FirewallManager.java
index 8df1638c..c7a7040f 100644
--- a/app/src/main/java/se/leap/bitmaskclient/firewall/FirewallManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/firewall/FirewallManager.java
@@ -21,16 +21,16 @@ import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;
-import java.util.Observable;
-import java.util.Observer;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import de.blinkt.openvpn.core.VpnStatus;
import se.leap.bitmaskclient.R;
+import se.leap.bitmaskclient.base.utils.PreferenceHelper;
import se.leap.bitmaskclient.tethering.TetheringObservable;
import se.leap.bitmaskclient.tethering.TetheringState;
-import se.leap.bitmaskclient.base.utils.PreferenceHelper;
-public class FirewallManager implements FirewallCallback, Observer {
+public class FirewallManager implements FirewallCallback, PropertyChangeListener {
public static String BITMASK_CHAIN = "bitmask_fw";
public static String BITMASK_FORWARD = "bitmask_forward";
public static String BITMASK_POSTROUTING = "bitmask_postrouting";
@@ -150,9 +150,9 @@ public class FirewallManager implements FirewallCallback, Observer {
}
@Override
- public void update(Observable o, Object arg) {
- if (o instanceof TetheringObservable) {
- TetheringObservable observable = (TetheringObservable) o;
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (TetheringObservable.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ TetheringObservable observable = (TetheringObservable) evt.getNewValue();
TetheringState state = observable.getTetheringState();
if (state.hasAnyVpnTetheringAllowed() && state.hasAnyDeviceTetheringEnabled()) {
startTethering();
diff --git a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ObfsVpnClient.java b/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ObfsVpnClient.java
index 9d5ddcf9..685349ed 100644
--- a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ObfsVpnClient.java
+++ b/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ObfsVpnClient.java
@@ -4,6 +4,8 @@ import static se.leap.bitmaskclient.base.models.Constants.KCP;
import android.util.Log;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -14,7 +16,7 @@ import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.VpnStatus;
import se.leap.bitmaskclient.eip.EipStatus;
-public class ObfsVpnClient implements Observer, PtClientInterface {
+public class ObfsVpnClient implements PropertyChangeListener, PtClientInterface {
public static final AtomicInteger SOCKS_PORT = new AtomicInteger(4430);
public static final String SOCKS_IP = "127.0.0.1";
@@ -114,9 +116,9 @@ public class ObfsVpnClient implements Observer, PtClientInterface {
// TODO: register observer!
@Override
- public void update(Observable observable, Object arg) {
- if (observable instanceof EipStatus) {
- EipStatus status = (EipStatus) observable;
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (EipStatus.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ EipStatus status = (EipStatus) evt.getNewValue();
if (status.getLevel() == ConnectionStatus.LEVEL_NONETWORK) {
noNetwork = true;
} else {
diff --git a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ShapeshifterClient.java b/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ShapeshifterClient.java
index 102dcf35..e57401f8 100644
--- a/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ShapeshifterClient.java
+++ b/app/src/main/java/se/leap/bitmaskclient/pluggableTransports/ShapeshifterClient.java
@@ -21,14 +21,14 @@ import android.os.Handler;
import android.os.Looper;
import android.util.Log;
-import java.util.Observable;
-import java.util.Observer;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import de.blinkt.openvpn.core.ConnectionStatus;
import de.blinkt.openvpn.core.VpnStatus;
import se.leap.bitmaskclient.eip.EipStatus;
-public class ShapeshifterClient implements Observer {
+public class ShapeshifterClient implements PropertyChangeListener {
public static final String DISPATCHER_PORT = "4430";
public static final String DISPATCHER_IP = "127.0.0.1";
@@ -123,10 +123,11 @@ public class ShapeshifterClient implements Observer {
return false;
}
+
@Override
- public void update(Observable observable, Object arg) {
- if (observable instanceof EipStatus) {
- EipStatus status = (EipStatus) observable;
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (EipStatus.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
+ EipStatus status = (EipStatus) evt.getNewValue();
if (status.getLevel() == ConnectionStatus.LEVEL_NONETWORK) {
noNetwork = true;
} else {
diff --git a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java
index a25f8c85..5d62b081 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tethering/TetheringObservable.java
@@ -18,15 +18,19 @@ package se.leap.bitmaskclient.tethering;
import androidx.annotation.NonNull;
-import java.util.Observable;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
-public class TetheringObservable extends Observable {
+public class TetheringObservable {
private static TetheringObservable instance;
private TetheringState tetheringState;
+ private final PropertyChangeSupport changeSupport;
+ public static final String PROPERTY_CHANGE = "TetheringObservable";
private TetheringObservable() {
tetheringState = new TetheringState();
+ changeSupport = new PropertyChangeSupport(this);
}
public static TetheringObservable getInstance() {
@@ -36,10 +40,17 @@ public class TetheringObservable extends Observable {
return instance;
}
+ public void addObserver(PropertyChangeListener propertyChangeListener) {
+ changeSupport.addPropertyChangeListener(propertyChangeListener);
+ }
+
+ public void deleteObserver(PropertyChangeListener propertyChangeListener) {
+ changeSupport.removePropertyChangeListener(propertyChangeListener);
+ }
+
public static void allowVpnWifiTethering(boolean enabled) {
if (getInstance().tetheringState.isVpnWifiTetheringAllowed != enabled) {
getInstance().tetheringState.isVpnWifiTetheringAllowed = enabled;
- getInstance().setChanged();
getInstance().notifyObservers();
}
}
@@ -47,7 +58,6 @@ public class TetheringObservable extends Observable {
public static void allowVpnUsbTethering(boolean enabled) {
if (getInstance().tetheringState.isVpnUsbTetheringAllowed != enabled) {
getInstance().tetheringState.isVpnUsbTetheringAllowed = enabled;
- getInstance().setChanged();
getInstance().notifyObservers();
}
}
@@ -55,7 +65,6 @@ public class TetheringObservable extends Observable {
public static void allowVpnBluetoothTethering(boolean enabled) {
if (getInstance().tetheringState.isVpnBluetoothTetheringAllowed != enabled) {
getInstance().tetheringState.isVpnBluetoothTetheringAllowed = enabled;
- getInstance().setChanged();
getInstance().notifyObservers();
}
}
@@ -70,7 +79,6 @@ public class TetheringObservable extends Observable {
state.wifiAddress = address;
state.lastSeenWifiAddress = address.isEmpty() ? state.lastSeenWifiAddress : address;
state.lastSeenWifiInterface = interfaceName.isEmpty() ? state.lastSeenWifiInterface : interfaceName;
- getInstance().setChanged();
getInstance().notifyObservers();
}
@@ -86,7 +94,6 @@ public class TetheringObservable extends Observable {
state.usbInterface = interfaceName;
state.lastSeenUsbAddress = address.isEmpty() ? state.lastSeenUsbAddress : address;
state.lastSeenUsbInterface = interfaceName.isEmpty() ? state.lastSeenUsbInterface : interfaceName;
- getInstance().setChanged();
getInstance().notifyObservers();
}
}
@@ -101,7 +108,6 @@ public class TetheringObservable extends Observable {
state.bluetoothInterface = interfaceName;
state.lastSeenBluetoothAddress = address.isEmpty() ? state.lastSeenBluetoothAddress : address;
state.lastSeenBluetoothInterface = interfaceName.isEmpty() ? state.lastSeenBluetoothInterface : interfaceName;
- getInstance().setChanged();
getInstance().notifyObservers();
}
}
@@ -121,4 +127,8 @@ public class TetheringObservable extends Observable {
public TetheringState getTetheringState() {
return tetheringState;
}
+
+ private void notifyObservers() {
+ changeSupport.firePropertyChange(PROPERTY_CHANGE, null, getInstance());
+ }
}
diff --git a/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java b/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java
index b1c4ca83..f13eb70e 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tor/ClientTransportPlugin.java
@@ -30,6 +30,8 @@ import androidx.annotation.Nullable;
import org.torproject.jni.ClientTransportPluginInterface;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
@@ -38,8 +40,6 @@ import java.io.InputStreamReader;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.HashMap;
-import java.util.Observable;
-import java.util.Observer;
import java.util.Random;
import java.util.Scanner;
import java.util.Vector;
@@ -49,7 +49,7 @@ import java.util.regex.Pattern;
import IPtProxy.IPtProxy;
-public class ClientTransportPlugin implements ClientTransportPluginInterface, Observer {
+public class ClientTransportPlugin implements ClientTransportPluginInterface, PropertyChangeListener {
public static String TAG = ClientTransportPlugin.class.getSimpleName();
private HashMap<String, String> mFronts;
@@ -221,8 +221,8 @@ public class ClientTransportPlugin implements ClientTransportPluginInterface, Ob
}
@Override
- public void update(Observable o, Object arg) {
- if (o instanceof TorStatusObservable) {
+ public void propertyChange(PropertyChangeEvent evt) {
+ if(TorStatusObservable.PROPERTY_CHANGE.equals(evt.getPropertyName())) {
TorStatusObservable.SnowflakeStatus snowflakeStatus = TorStatusObservable.getSnowflakeStatus();
if (snowflakeStatus == this.snowflakeStatus) {
return;
diff --git a/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java b/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java
index 8bb41dd2..b1ad6084 100644
--- a/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java
+++ b/app/src/main/java/se/leap/bitmaskclient/tor/TorStatusObservable.java
@@ -29,8 +29,8 @@ import android.util.Log;
import androidx.annotation.Nullable;
-import java.util.Observable;
-import java.util.Observer;
+import java.beans.PropertyChangeListener;
+import java.beans.PropertyChangeSupport;
import java.util.Vector;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -39,10 +39,13 @@ import java.util.concurrent.atomic.AtomicBoolean;
import se.leap.bitmaskclient.R;
-public class TorStatusObservable extends Observable {
+public class TorStatusObservable {
private static final String TAG = TorStatusObservable.class.getSimpleName();
+ private final PropertyChangeSupport propertyChange;
+ public static final String PROPERTY_CHANGE = "TorStatusObservable";
+
public interface StatusCondition {
boolean met();
}
@@ -98,6 +101,7 @@ public class TorStatusObservable extends Observable {
private TorStatusObservable() {
torNotificationManager = new TorNotificationManager();
+ propertyChange = new PropertyChangeSupport(this);
}
public static TorStatusObservable getInstance() {
@@ -126,11 +130,11 @@ public class TorStatusObservable extends Observable {
public static boolean waitUntil(StatusCondition condition, int timeout) throws InterruptedException, TimeoutException {
CountDownLatch countDownLatch = new CountDownLatch(1);
final AtomicBoolean conditionMet = new AtomicBoolean(false);
- Observer observer = (o, arg) -> {
- if (condition.met()) {
- countDownLatch.countDown();
- conditionMet.set(true);
- }
+ PropertyChangeListener observer = evt -> {
+ if (condition.met()) {
+ countDownLatch.countDown();
+ conditionMet.set(true);
+ }
};
if (condition.met()) {
// no need to wait
@@ -145,6 +149,14 @@ public class TorStatusObservable extends Observable {
return true;
}
+ public void addObserver(PropertyChangeListener propertyChangeListener) {
+ propertyChange.addPropertyChangeListener(propertyChangeListener);
+ }
+
+ public void deleteObserver(PropertyChangeListener propertyChangeListener) {
+ propertyChange.removePropertyChangeListener(propertyChangeListener);
+ }
+
public static void logSnowflakeMessage(Context context, String message) {
addLog(message);
if (getInstance().status != TorStatus.OFF) {
@@ -191,7 +203,6 @@ public class TorStatusObservable extends Observable {
getInstance().lastSnowflakeLog = context.getString(R.string.snowflake_sending_data);
}
Log.d(TAG, "snowflake status " + getInstance().snowflakeStatus);
- instance.setChanged();
instance.notifyObservers();
}
@@ -230,7 +241,7 @@ public class TorStatusObservable extends Observable {
public static void updateState(Context context, String status, int bootstrapPercent, @Nullable String logKey) {
try {
- Log.d(TAG, "update tor state: " + status + " " + bootstrapPercent + " "+ logKey);
+ // Log.d(TAG, "update tor state: " + status + " " + bootstrapPercent + " "+ logKey);
getInstance().status = TorStatus.valueOf(status);
if (bootstrapPercent != -1) {
getInstance().bootstrapPercent = bootstrapPercent;
@@ -247,7 +258,7 @@ public class TorStatusObservable extends Observable {
getInstance().torNotificationManager.buildTorNotification(context, getStringForCurrentStatus(context), getNotificationLog(), getBootstrapProgress());
}
- instance.setChanged();
+
instance.notifyObservers();
} catch (IllegalStateException e) {
@@ -255,6 +266,10 @@ public class TorStatusObservable extends Observable {
}
}
+ private void notifyObservers() {
+ instance.propertyChange.firePropertyChange(PROPERTY_CHANGE, null, instance);
+ }
+
private static String getStringFor(Context context, String key) {
switch (key) {
case "conn_pt":
@@ -294,13 +309,11 @@ public class TorStatusObservable extends Observable {
public static void setLastError(String error) {
getInstance().lastError = error;
- instance.setChanged();
instance.notifyObservers();
}
public static void setProxyPort(int port) {
getInstance().port = port;
- instance.setChanged();
instance.notifyObservers();
}
@@ -345,7 +358,6 @@ public class TorStatusObservable extends Observable {
if (!getInstance().cancelled) {
getInstance().cancelled = true;
getInstance().port = -1;
- getInstance().setChanged();
getInstance().notifyObservers();
}
}
diff --git a/app/src/test/java/se/leap/bitmaskclient/tor/TorStatusObservableTest.java b/app/src/test/java/se/leap/bitmaskclient/tor/TorStatusObservableTest.java
new file mode 100644
index 00000000..bdf8f6ac
--- /dev/null
+++ b/app/src/test/java/se/leap/bitmaskclient/tor/TorStatusObservableTest.java
@@ -0,0 +1,6 @@
+package se.leap.bitmaskclient.tor;
+
+import static org.junit.Assert.*;
+public class TorStatusObservableTest {
+
+} \ No newline at end of file