diff options
author | Samuel Holland <samuel@sholland.org> | 2017-08-13 07:24:03 -0500 |
---|---|---|
committer | Samuel Holland <samuel@sholland.org> | 2017-08-13 07:24:03 -0500 |
commit | 5e55d196be092f4a4dcb212cf09d7a1bdab70e00 (patch) | |
tree | eb765a1b961fefdaa7ddc3cfae9cb83a09e0c031 /app/src/main/java/com/wireguard/android/BaseConfigActivity.java | |
parent | Profile: Add function to copy config from another profile (diff) | |
download | wireguard-android-5e55d196be092f4a4dcb212cf09d7a1bdab70e00.tar.xz wireguard-android-5e55d196be092f4a4dcb212cf09d7a1bdab70e00.zip |
Major renaming and refactoring in activity and service
Apparently "configuration" is the proper term, not "profile".
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'app/src/main/java/com/wireguard/android/BaseConfigActivity.java')
-rw-r--r-- | app/src/main/java/com/wireguard/android/BaseConfigActivity.java | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/app/src/main/java/com/wireguard/android/BaseConfigActivity.java b/app/src/main/java/com/wireguard/android/BaseConfigActivity.java new file mode 100644 index 00000000..8359c34a --- /dev/null +++ b/app/src/main/java/com/wireguard/android/BaseConfigActivity.java @@ -0,0 +1,85 @@ +package com.wireguard.android; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.Bundle; +import android.os.IBinder; +import android.view.Menu; + +import com.wireguard.config.Config; + +/** + * Base class for activities that need to remember the current configuration and wait for a service. + */ + +abstract class BaseConfigActivity extends Activity { + protected static final String KEY_CURRENT_CONFIG = "currentConfig"; + protected static final String TAG_DETAIL = "detail"; + protected static final String TAG_EDIT = "edit"; + protected static final String TAG_LIST = "list"; + protected static final String TAG_PLACEHOLDER = "placeholder"; + + private final ServiceConnection callbacks = new ServiceConnectionCallbacks(); + private Config currentConfig; + private String initialConfig; + + protected Config getCurrentConfig() { + return currentConfig; + } + + @Override + protected void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + // Trigger starting the service as early as possible + bindService(new Intent(this, VpnService.class), callbacks, Context.BIND_AUTO_CREATE); + // Restore the saved configuration if there is one; otherwise grab it from the intent. + if (savedInstanceState != null) + initialConfig = savedInstanceState.getString(KEY_CURRENT_CONFIG); + else + initialConfig = getIntent().getStringExtra(KEY_CURRENT_CONFIG); + } + + @Override + public boolean onCreateOptionsMenu(final Menu menu) { + getMenuInflater().inflate(R.menu.main, menu); + return true; + } + + protected abstract void onCurrentConfigChanged(Config config); + + @Override + public void onSaveInstanceState(final Bundle outState) { + super.onSaveInstanceState(outState); + if (currentConfig != null) + outState.putString(KEY_CURRENT_CONFIG, currentConfig.getName()); + } + + protected abstract void onServiceAvailable(); + + public void setCurrentConfig(final Config config) { + currentConfig = config; + onCurrentConfigChanged(currentConfig); + } + + private class ServiceConnectionCallbacks implements ServiceConnection { + @Override + public void onServiceConnected(final ComponentName component, final IBinder binder) { + // We don't actually need a binding, only notification that the service is started. + unbindService(callbacks); + // Tell the subclass that it is now safe to use the service. + onServiceAvailable(); + // Make sure the subclass activity is initialized before setting its config. + if (initialConfig != null && currentConfig == null) + setCurrentConfig(VpnService.getInstance().get(initialConfig)); + } + + @Override + public void onServiceDisconnected(final ComponentName component) { + // This can never happen; the service runs in the same thread as the activity. + throw new IllegalStateException(); + } + } +} |