From 580c97e368cd0d9fa47691f70cc31e9b711581ec Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 15 Nov 2021 14:09:17 +0100 Subject: implement a new fancy on-off-button --- .../leap/bitmaskclient/base/views/MainButton.java | 189 +++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java (limited to 'app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java') diff --git a/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java new file mode 100644 index 00000000..586eb321 --- /dev/null +++ b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java @@ -0,0 +1,189 @@ +package se.leap.bitmaskclient.base.views; + +import android.annotation.TargetApi; +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.widget.RelativeLayout; + +import androidx.annotation.ColorRes; +import androidx.annotation.DrawableRes; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.core.content.ContextCompat; +import androidx.core.graphics.drawable.DrawableCompat; + +import java.lang.ref.WeakReference; + +import se.leap.bitmaskclient.R; + +public class MainButton extends RelativeLayout { + + private static final String TAG = MainButton.class.getSimpleName(); + + interface MainButtonListener { + void onButtonClicked(); + } + + AppCompatImageView glow; + AppCompatImageView shadowDark; + AppCompatImageView shadowLight; + AnimationDrawable glowAnimation; + WeakReference callback; + + private boolean isOn = false; + private boolean isProcessing = false; + private boolean isError = true; + + + + public MainButton(Context context) { + super(context); + initLayout(context); + } + + public MainButton(Context context, AttributeSet attrs) { + super(context, attrs); + initLayout(context); + } + + public MainButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initLayout(context); + } + + + @TargetApi(21) + public MainButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + initLayout(context); + } + + public void setMainButtonListener(MainButtonListener callback) { + this.callback = new WeakReference<>(callback); + } + + private void initLayout(Context context) { + LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View rootview = inflater.inflate(R.layout.v_main_btn, this, true); + + glow = rootview.findViewById(R.id.vpn_btn_glow); + glowAnimation = (AnimationDrawable) glow.getBackground(); + shadowDark = rootview.findViewById(R.id.vpn_btn_shadow_dark); + shadowLight = rootview.findViewById(R.id.vpn_btn_shadow_light); + + rootview.setOnGenericMotionListener(new OnGenericMotionListener() { + @Override + public boolean onGenericMotion(View v, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_BUTTON_PRESS: + Log.d(TAG, "onbuttonPrees"); + break; + case MotionEvent.ACTION_BUTTON_RELEASE: + Log.d(TAG, "onButtonRelease"); + break; + } + return false; + } + }); + rootview.setOnTouchListener(new OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + Log.d(TAG, "motion down"); + Drawable drawableDown = context.getResources().getDrawable(R.drawable.on_off_btn_start_2_pressed); + shadowDark.setImageDrawable(drawableDown); + break; + case MotionEvent.ACTION_UP: + Log.d(TAG, "motion up"); + Drawable drawableUp = isOn ? + context.getResources().getDrawable(R.drawable.on_off_btn_start_2_disabled) : + context.getResources().getDrawable(R.drawable.on_off_btn_start_2_enabled); + shadowDark.setImageDrawable(drawableUp); + break; + case MotionEvent.ACTION_CANCEL: + Log.d(TAG, "motion cancelled"); + Drawable drawableRestoreState = isOn ? + context.getResources().getDrawable(R.drawable.on_off_btn_start_2_enabled) : + context.getResources().getDrawable(R.drawable.on_off_btn_start_2_disabled); + shadowDark.setImageDrawable(drawableRestoreState); + break; + } + return false; + } + }); + + } + + + private void stopGlowAnimation() { + AlphaAnimation fadeOutAnimation = new AlphaAnimation(1.0f, 0.0f); + fadeOutAnimation.setDuration(300); + fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) {} + + @Override + public void onAnimationEnd(Animation animation) { + glow.setVisibility(GONE); + glowAnimation.stop(); + } + + @Override + public void onAnimationRepeat(Animation animation) {} + }); + glow.startAnimation(fadeOutAnimation); + } + + private void startGlowAnimation() { + glow.setAlpha(1.0f); + glow.setVisibility(VISIBLE); + glowAnimation.start(); + } + + public void updateState(boolean isOn, boolean isProcessing, boolean isError) { + if (this.isOn != isOn) { + this.isOn = isOn; + Drawable drawableRestoreState = isOn ? + getContext().getResources().getDrawable(R.drawable.on_off_btn_start_2_enabled) : + getContext().getResources().getDrawable(R.drawable.on_off_btn_start_2_disabled); + shadowDark.setImageDrawable(drawableRestoreState); + shadowLight.setVisibility(isOn ? VISIBLE : GONE); + } + + if (this.isProcessing != isProcessing) { + if (!isProcessing) { + stopGlowAnimation(); + } else { + startGlowAnimation(); + } + this.isProcessing = isProcessing; + } + + if (this.isError != isError) { + @DrawableRes int drawableResource = isOn ? R.drawable.on_off_btn_start_2_enabled : R.drawable.on_off_btn_start_2_disabled; + if (!isError) { + setImageWithTint(shadowLight, drawableResource, R.color.colorSecondary); + } else { + setImageWithTint(shadowLight, drawableResource, R.color.colorWarning); + } + this.isError = isError; + } + } + + private void setImageWithTint(AppCompatImageView view, @DrawableRes int resourceId, @ColorRes int color) { + view.setImageDrawable(ContextCompat.getDrawable(getContext(), resourceId)); + view.setColorFilter(ContextCompat.getColor(getContext(), color), PorterDuff.Mode.SRC_ATOP); + } + + + +} -- cgit v1.2.3 From 78b06a47b6c7e3de5706893eeebb01bef89060d8 Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 15 Nov 2021 14:23:23 +0100 Subject: only use two button pressed states --- .../leap/bitmaskclient/base/views/MainButton.java | 36 ---------------------- 1 file changed, 36 deletions(-) (limited to 'app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java') diff --git a/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java index 586eb321..1a8fa09b 100644 --- a/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java +++ b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java @@ -4,7 +4,6 @@ import android.annotation.TargetApi; import android.content.Context; import android.graphics.PorterDuff; import android.graphics.drawable.AnimationDrawable; -import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; @@ -18,7 +17,6 @@ import androidx.annotation.ColorRes; import androidx.annotation.DrawableRes; import androidx.appcompat.widget.AppCompatImageView; import androidx.core.content.ContextCompat; -import androidx.core.graphics.drawable.DrawableCompat; import java.lang.ref.WeakReference; @@ -33,7 +31,6 @@ public class MainButton extends RelativeLayout { } AppCompatImageView glow; - AppCompatImageView shadowDark; AppCompatImageView shadowLight; AnimationDrawable glowAnimation; WeakReference callback; @@ -76,7 +73,6 @@ public class MainButton extends RelativeLayout { glow = rootview.findViewById(R.id.vpn_btn_glow); glowAnimation = (AnimationDrawable) glow.getBackground(); - shadowDark = rootview.findViewById(R.id.vpn_btn_shadow_dark); shadowLight = rootview.findViewById(R.id.vpn_btn_shadow_light); rootview.setOnGenericMotionListener(new OnGenericMotionListener() { @@ -93,34 +89,6 @@ public class MainButton extends RelativeLayout { return false; } }); - rootview.setOnTouchListener(new OnTouchListener() { - @Override - public boolean onTouch(View v, MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_DOWN: - Log.d(TAG, "motion down"); - Drawable drawableDown = context.getResources().getDrawable(R.drawable.on_off_btn_start_2_pressed); - shadowDark.setImageDrawable(drawableDown); - break; - case MotionEvent.ACTION_UP: - Log.d(TAG, "motion up"); - Drawable drawableUp = isOn ? - context.getResources().getDrawable(R.drawable.on_off_btn_start_2_disabled) : - context.getResources().getDrawable(R.drawable.on_off_btn_start_2_enabled); - shadowDark.setImageDrawable(drawableUp); - break; - case MotionEvent.ACTION_CANCEL: - Log.d(TAG, "motion cancelled"); - Drawable drawableRestoreState = isOn ? - context.getResources().getDrawable(R.drawable.on_off_btn_start_2_enabled) : - context.getResources().getDrawable(R.drawable.on_off_btn_start_2_disabled); - shadowDark.setImageDrawable(drawableRestoreState); - break; - } - return false; - } - }); - } @@ -152,10 +120,6 @@ public class MainButton extends RelativeLayout { public void updateState(boolean isOn, boolean isProcessing, boolean isError) { if (this.isOn != isOn) { this.isOn = isOn; - Drawable drawableRestoreState = isOn ? - getContext().getResources().getDrawable(R.drawable.on_off_btn_start_2_enabled) : - getContext().getResources().getDrawable(R.drawable.on_off_btn_start_2_disabled); - shadowDark.setImageDrawable(drawableRestoreState); shadowLight.setVisibility(isOn ? VISIBLE : GONE); } -- cgit v1.2.3 From 79c01db669fc68b1071f0c2e62eae1e4be66bbb8 Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 15 Nov 2021 16:00:50 +0100 Subject: remove unused code --- .../leap/bitmaskclient/base/views/MainButton.java | 29 ---------------------- 1 file changed, 29 deletions(-) (limited to 'app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java') diff --git a/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java index 1a8fa09b..b12f2b00 100644 --- a/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java +++ b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java @@ -5,9 +5,7 @@ import android.content.Context; import android.graphics.PorterDuff; import android.graphics.drawable.AnimationDrawable; import android.util.AttributeSet; -import android.util.Log; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; @@ -18,29 +16,21 @@ import androidx.annotation.DrawableRes; import androidx.appcompat.widget.AppCompatImageView; import androidx.core.content.ContextCompat; -import java.lang.ref.WeakReference; - import se.leap.bitmaskclient.R; public class MainButton extends RelativeLayout { private static final String TAG = MainButton.class.getSimpleName(); - interface MainButtonListener { - void onButtonClicked(); - } - AppCompatImageView glow; AppCompatImageView shadowLight; AnimationDrawable glowAnimation; - WeakReference callback; private boolean isOn = false; private boolean isProcessing = false; private boolean isError = true; - public MainButton(Context context) { super(context); initLayout(context); @@ -63,10 +53,6 @@ public class MainButton extends RelativeLayout { initLayout(context); } - public void setMainButtonListener(MainButtonListener callback) { - this.callback = new WeakReference<>(callback); - } - private void initLayout(Context context) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rootview = inflater.inflate(R.layout.v_main_btn, this, true); @@ -74,21 +60,6 @@ public class MainButton extends RelativeLayout { glow = rootview.findViewById(R.id.vpn_btn_glow); glowAnimation = (AnimationDrawable) glow.getBackground(); shadowLight = rootview.findViewById(R.id.vpn_btn_shadow_light); - - rootview.setOnGenericMotionListener(new OnGenericMotionListener() { - @Override - public boolean onGenericMotion(View v, MotionEvent event) { - switch (event.getAction()) { - case MotionEvent.ACTION_BUTTON_PRESS: - Log.d(TAG, "onbuttonPrees"); - break; - case MotionEvent.ACTION_BUTTON_RELEASE: - Log.d(TAG, "onButtonRelease"); - break; - } - return false; - } - }); } -- cgit v1.2.3 From 427a41a35205b1948da37727eb21b66e2c518b0c Mon Sep 17 00:00:00 2001 From: cyBerta Date: Mon, 15 Nov 2021 16:02:09 +0100 Subject: tweak an rename main button higlight colores --- app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java') diff --git a/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java index b12f2b00..c5ac4544 100644 --- a/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java +++ b/app/src/main/java/se/leap/bitmaskclient/base/views/MainButton.java @@ -106,9 +106,9 @@ public class MainButton extends RelativeLayout { if (this.isError != isError) { @DrawableRes int drawableResource = isOn ? R.drawable.on_off_btn_start_2_enabled : R.drawable.on_off_btn_start_2_disabled; if (!isError) { - setImageWithTint(shadowLight, drawableResource, R.color.colorSecondary); + setImageWithTint(shadowLight, drawableResource, R.color.colorMainBtnHighlight); } else { - setImageWithTint(shadowLight, drawableResource, R.color.colorWarning); + setImageWithTint(shadowLight, drawableResource, R.color.colorMainBtnError); } this.isError = isError; } -- cgit v1.2.3