diff options
author | Samuel Holland <samuel@sholland.org> | 2018-01-01 02:06:37 -0600 |
---|---|---|
committer | Samuel Holland <samuel@sholland.org> | 2018-01-06 04:09:29 -0600 |
commit | 609194fae2332e6f2ccd7a4464bfa492ad661a6f (patch) | |
tree | 96a7cd9846a093dfcdacfef285b0a4d77000edf0 /app/src/main/java/com/wireguard/android/activity/BaseActivity.java | |
parent | 4c0869393e2d8f52b9bcf312286dca8ced2e1900 (diff) |
Serviceless rewrite, part 1
Signed-off-by: Samuel Holland <samuel@sholland.org>
Diffstat (limited to 'app/src/main/java/com/wireguard/android/activity/BaseActivity.java')
-rw-r--r-- | app/src/main/java/com/wireguard/android/activity/BaseActivity.java | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/activity/BaseActivity.java b/app/src/main/java/com/wireguard/android/activity/BaseActivity.java new file mode 100644 index 00000000..4bd3407e --- /dev/null +++ b/app/src/main/java/com/wireguard/android/activity/BaseActivity.java @@ -0,0 +1,94 @@ +package com.wireguard.android.activity; + +import android.app.Activity; +import android.databinding.CallbackRegistry; +import android.databinding.CallbackRegistry.NotifierCallback; +import android.os.Bundle; + +import com.wireguard.android.Application; +import com.wireguard.android.model.Tunnel; +import com.wireguard.android.model.TunnelManager; + +import java.util.Objects; + +/** + * Base class for activities that need to remember the currently-selected tunnel. + */ + +public abstract class BaseActivity extends Activity { + private static final String TAG = BaseActivity.class.getSimpleName(); + + private final SelectionChangeRegistry selectionChangeRegistry = new SelectionChangeRegistry(); + private Tunnel selectedTunnel; + + public void addOnSelectedTunnelChangedListener( + final OnSelectedTunnelChangedListener listener) { + selectionChangeRegistry.add(listener); + } + + public Tunnel getSelectedTunnel() { + return selectedTunnel; + } + + @Override + protected void onCreate(final Bundle savedInstanceState) { + // Restore the saved tunnel if there is one; otherwise grab it from the arguments. + String savedTunnelName = null; + if (savedInstanceState != null) + savedTunnelName = savedInstanceState.getString(TunnelManager.KEY_SELECTED_TUNNEL); + else if (getIntent() != null) + savedTunnelName = getIntent().getStringExtra(TunnelManager.KEY_SELECTED_TUNNEL); + if (savedTunnelName != null) { + final TunnelManager manager = Application.getComponent().getTunnelManager(); + selectedTunnel = manager.getTunnels().get(savedTunnelName); + } + // The selected tunnel must be set before the superclass method recreates fragments. + super.onCreate(savedInstanceState); + } + + @Override + protected void onSaveInstanceState(final Bundle outState) { + if (selectedTunnel != null) + outState.putString(TunnelManager.KEY_SELECTED_TUNNEL, selectedTunnel.getName()); + super.onSaveInstanceState(outState); + } + + protected abstract Tunnel onSelectedTunnelChanged(Tunnel oldTunnel, Tunnel newTunnel); + + public void removeOnSelectedTunnelChangedListener( + final OnSelectedTunnelChangedListener listener) { + selectionChangeRegistry.remove(listener); + } + + public void setSelectedTunnel(final Tunnel tunnel) { + final Tunnel oldTunnel = selectedTunnel; + if (Objects.equals(oldTunnel, tunnel)) + return; + // Give the activity a chance to override the tunnel change. + selectedTunnel = onSelectedTunnelChanged(oldTunnel, tunnel); + if (Objects.equals(oldTunnel, selectedTunnel)) + return; + selectionChangeRegistry.notifyCallbacks(oldTunnel, 0, selectedTunnel); + } + + public interface OnSelectedTunnelChangedListener { + void onSelectedTunnelChanged(Tunnel oldTunnel, Tunnel newTunnel); + } + + private static final class SelectionChangeNotifier + extends NotifierCallback<OnSelectedTunnelChangedListener, Tunnel, Tunnel> { + @Override + public void onNotifyCallback(final OnSelectedTunnelChangedListener listener, + final Tunnel oldTunnel, final int ignored, + final Tunnel newTunnel) { + listener.onSelectedTunnelChanged(oldTunnel, newTunnel); + } + } + + private static final class SelectionChangeRegistry + extends CallbackRegistry<OnSelectedTunnelChangedListener, Tunnel, Tunnel> { + private SelectionChangeRegistry() { + super(new SelectionChangeNotifier()); + } + } +} |