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/widget | |
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/widget')
3 files changed, 116 insertions, 13 deletions
diff --git a/app/src/main/java/com/wireguard/android/widget/KeyInputFilter.java b/app/src/main/java/com/wireguard/android/widget/KeyInputFilter.java new file mode 100644 index 00000000..45652ed5 --- /dev/null +++ b/app/src/main/java/com/wireguard/android/widget/KeyInputFilter.java @@ -0,0 +1,47 @@ +package com.wireguard.android.widget; + +import android.text.InputFilter; +import android.text.SpannableStringBuilder; +import android.text.Spanned; + +import com.wireguard.crypto.KeyEncoding; + +/** + * InputFilter for entering WireGuard private/public keys encoded with base64. + */ + +public class KeyInputFilter implements InputFilter { + public static KeyInputFilter newInstance() { + return new KeyInputFilter(); + } + + @Override + public CharSequence filter(final CharSequence source, + final int sStart, final int sEnd, + final Spanned dest, + final int dStart, final int dEnd) { + SpannableStringBuilder replacement = null; + int rIndex = 0; + final int dLength = dest.length(); + for (int sIndex = sStart; sIndex < sEnd; ++sIndex) { + final char c = source.charAt(sIndex); + final int dIndex = dStart + (sIndex - sStart); + // Restrict characters to the base64 character set. + // Ensure adding this character does not push the length over the limit. + if (((dIndex + 1 < KeyEncoding.KEY_LENGTH_BASE64 && isAllowed(c)) || + (dIndex + 1 == KeyEncoding.KEY_LENGTH_BASE64 && c == '=')) && + dLength + (sIndex - sStart) < KeyEncoding.KEY_LENGTH_BASE64) { + ++rIndex; + } else { + if (replacement == null) + replacement = new SpannableStringBuilder(source, sStart, sEnd); + replacement.delete(rIndex, rIndex + 1); + } + } + return replacement; + } + + private boolean isAllowed(final char c) { + return Character.isLetterOrDigit(c) || c == '+' || c == '/'; + } +} diff --git a/app/src/main/java/com/wireguard/android/widget/NameInputFilter.java b/app/src/main/java/com/wireguard/android/widget/NameInputFilter.java new file mode 100644 index 00000000..8c91e682 --- /dev/null +++ b/app/src/main/java/com/wireguard/android/widget/NameInputFilter.java @@ -0,0 +1,46 @@ +package com.wireguard.android.widget; + +import android.text.InputFilter; +import android.text.SpannableStringBuilder; +import android.text.Spanned; + +import com.wireguard.android.model.Tunnel; + +/** + * InputFilter for entering WireGuard configuration names (Linux interface names). + */ + +public class NameInputFilter implements InputFilter { + public static NameInputFilter newInstance() { + return new NameInputFilter(); + } + + @Override + public CharSequence filter(final CharSequence source, + final int sStart, final int sEnd, + final Spanned dest, + final int dStart, final int dEnd) { + SpannableStringBuilder replacement = null; + int rIndex = 0; + final int dLength = dest.length(); + for (int sIndex = sStart; sIndex < sEnd; ++sIndex) { + final char c = source.charAt(sIndex); + final int dIndex = dStart + (sIndex - sStart); + // Restrict characters to those valid in interfaces. + // Ensure adding this character does not push the length over the limit. + if ((dIndex < Tunnel.NAME_MAX_LENGTH && isAllowed(c)) && + dLength + (sIndex - sStart) < Tunnel.NAME_MAX_LENGTH) { + ++rIndex; + } else { + if (replacement == null) + replacement = new SpannableStringBuilder(source, sStart, sEnd); + replacement.delete(rIndex, rIndex + 1); + } + } + return replacement; + } + + private boolean isAllowed(final char c) { + return Character.isLetterOrDigit(c) || "_=+.-".indexOf(c) >= 0; + } +} diff --git a/app/src/main/java/com/wireguard/android/widget/ToggleSwitch.java b/app/src/main/java/com/wireguard/android/widget/ToggleSwitch.java index c8f9ab2d..1b3dee71 100644 --- a/app/src/main/java/com/wireguard/android/widget/ToggleSwitch.java +++ b/app/src/main/java/com/wireguard/android/widget/ToggleSwitch.java @@ -17,17 +17,15 @@ package com.wireguard.android.widget; import android.content.Context; +import android.os.Parcelable; import android.util.AttributeSet; import android.widget.Switch; public class ToggleSwitch extends Switch { private boolean hasPendingStateChange; + private boolean isRestoringState; private OnBeforeCheckedChangeListener listener; - public interface OnBeforeCheckedChangeListener { - void onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked); - } - public ToggleSwitch(final Context context) { super(context); } @@ -45,21 +43,25 @@ public class ToggleSwitch extends Switch { super(context, attrs, defStyleAttr, defStyleRes); } - public void setOnBeforeCheckedChangeListener(final OnBeforeCheckedChangeListener listener) { - this.listener = listener; + @Override + public void onRestoreInstanceState(final Parcelable state) { + isRestoringState = true; + super.onRestoreInstanceState(state); + isRestoringState = false; + } @Override public void setChecked(final boolean checked) { - if (listener != null) { - if (!isEnabled()) - return; - setEnabled(false); - hasPendingStateChange = true; - listener.onBeforeCheckedChanged(this, checked); - } else { + if (isRestoringState || listener == null) { super.setChecked(checked); + return; } + if (hasPendingStateChange) + return; + hasPendingStateChange = true; + setEnabled(false); + listener.onBeforeCheckedChanged(this, checked); } public void setCheckedInternal(final boolean checked) { @@ -69,4 +71,12 @@ public class ToggleSwitch extends Switch { } super.setChecked(checked); } + + public void setOnBeforeCheckedChangeListener(final OnBeforeCheckedChangeListener listener) { + this.listener = listener; + } + + public interface OnBeforeCheckedChangeListener { + void onBeforeCheckedChanged(ToggleSwitch toggleSwitch, boolean checked); + } } |