From 1d0a8ec8f9783e293d5e3703ffca98a140917888 Mon Sep 17 00:00:00 2001 From: Andrewerr Date: Sun, 19 Nov 2023 17:57:14 +0100 Subject: [PATCH] Add controller for action panel, add animated show/hide for panel --- .../polar/mirror/ActionPanelController.java | 112 ++++++++++++++++++ .../java/com/polar/mirror/MainActivity.java | 23 +++- app/src/main/res/anim/slide_down.xml | 7 ++ app/src/main/res/anim/slide_up.xml | 7 ++ app/src/main/res/layout/activity_main.xml | 1 + app/src/main/res/values/config.xml | 5 + 6 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/polar/mirror/ActionPanelController.java create mode 100644 app/src/main/res/anim/slide_down.xml create mode 100644 app/src/main/res/anim/slide_up.xml create mode 100644 app/src/main/res/values/config.xml diff --git a/app/src/main/java/com/polar/mirror/ActionPanelController.java b/app/src/main/java/com/polar/mirror/ActionPanelController.java new file mode 100644 index 0000000..e85aafc --- /dev/null +++ b/app/src/main/java/com/polar/mirror/ActionPanelController.java @@ -0,0 +1,112 @@ +package com.polar.mirror; + +import android.content.Context; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.os.Handler; + +import androidx.annotation.NonNull; + + +/** + * Controls panel with floating action buttons + */ +public class ActionPanelController implements View.OnClickListener { + private final View mPanelView; + private final View mOverlayView; + private final Animation mSlideDownAnimation; + private final Animation mSlideUpAnimation; + private boolean mPanelVisible = true; + private Handler mHideHandler; + private Runnable mHideRunnable; + private final int hideMs; + public ActionPanelController(Context context, View panelView, View overlayView){ + mPanelView = panelView; + mOverlayView = overlayView; + mSlideDownAnimation = AnimationUtils.loadAnimation(context, R.anim.slide_down); + mSlideUpAnimation = AnimationUtils.loadAnimation(context, R.anim.slide_up); + hideMs = context.getResources().getInteger(R.integer.autohide_action_panel_ms); + if(hideMs < 0){ + throw new RuntimeException("Bad configuration: negative hideMs"); + } + setupAnimations(); + setupAutoHide(); + } + + private void setupAutoHide(){ + mHideHandler = new Handler(); + mHideRunnable = this::hidePanel; + scheduleHide(); + } + + private void scheduleHide(){ + mHideHandler.postDelayed(mHideRunnable, hideMs); + } + + private void setupAnimations(){ + mSlideDownAnimation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + /*stub*/ + } + + @Override + public void onAnimationEnd(Animation animation) { + mPanelView.setVisibility(View.GONE); + mOverlayView.setVisibility(View.GONE); + } + + @Override + public void onAnimationRepeat(Animation animation) { + /*stub*/ + } + }); + mSlideUpAnimation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + mPanelView.setVisibility(View.VISIBLE); + mOverlayView.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationEnd(Animation animation) { + /*stub*/ + } + + @Override + public void onAnimationRepeat(Animation animation) { + /*stub*/ + } + }); + } + + private void hidePanel(){ + mPanelView.startAnimation(mSlideDownAnimation); + mOverlayView.startAnimation(mSlideDownAnimation); + mPanelVisible = false; + mHideHandler.removeCallbacks(mHideRunnable); + } + + private void showPanel(){ + mPanelView.startAnimation(mSlideUpAnimation); + mOverlayView.startAnimation(mSlideUpAnimation); + mPanelVisible = true; + scheduleHide(); + } + + private void togglePanelVisibility(){ + if(mPanelVisible){ + hidePanel(); + } else { + showPanel(); + } + } + @Override + public void onClick(@NonNull View v) { + final int viewId = v.getId(); + if(viewId == R.id.preview_view || viewId == R.id.stop_view){ + togglePanelVisibility(); + } + } +} diff --git a/app/src/main/java/com/polar/mirror/MainActivity.java b/app/src/main/java/com/polar/mirror/MainActivity.java index 753a8ca..e7a7c6b 100644 --- a/app/src/main/java/com/polar/mirror/MainActivity.java +++ b/app/src/main/java/com/polar/mirror/MainActivity.java @@ -21,6 +21,7 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListener { private PreviewView mCameraView; private FreezeController mFreezeController; + private ActionPanelController mActionPanelController; private final static String TAG = "MainActivity"; @Override @@ -28,10 +29,13 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - setupView(); - + View panelView = findViewById(R.id.action_panel_layout); + View overlayView = findViewById(R.id.overlay_view); + mActionPanelController = new ActionPanelController(this, panelView, overlayView); mCameraView = findViewById(R.id.preview_view); + setupView(); + //Initialize freeze controller FloatingActionButton freezeButton = findViewById(R.id.freeze_button); ImageView freezeView = findViewById(R.id.stop_view); @@ -44,6 +48,8 @@ protected void onCreate(Bundle savedInstanceState) { } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } + + } @Override @@ -65,6 +71,19 @@ private void setupView(){ } setupFloatingButtons(); hideSystemUi(); + setupPanel(); + } + + /** + * Setups logic of action panel in a general + */ + private void setupPanel(){ + //Setup action panel + View stopView = findViewById(R.id.stop_view); + mCameraView.setClickable(true); + mCameraView.setOnClickListener(mActionPanelController); + stopView.setClickable(true); + stopView.setOnClickListener(mActionPanelController); } /** diff --git a/app/src/main/res/anim/slide_down.xml b/app/src/main/res/anim/slide_down.xml new file mode 100644 index 0000000..f546ff4 --- /dev/null +++ b/app/src/main/res/anim/slide_down.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/anim/slide_up.xml b/app/src/main/res/anim/slide_up.xml new file mode 100644 index 0000000..b793a77 --- /dev/null +++ b/app/src/main/res/anim/slide_up.xml @@ -0,0 +1,7 @@ + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 95a95b5..374b7a1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -21,6 +21,7 @@ android:contentDescription="@string/stop_view_desc" /> + + + 15000 + \ No newline at end of file