Skip to content

Commit

Permalink
Add controller for action panel, add animated show/hide for panel
Browse files Browse the repository at this point in the history
  • Loading branch information
0xf104a committed Nov 19, 2023
1 parent ec75809 commit 1d0a8ec
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 2 deletions.
112 changes: 112 additions & 0 deletions app/src/main/java/com/polar/mirror/ActionPanelController.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
}
23 changes: 21 additions & 2 deletions app/src/main/java/com/polar/mirror/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,21 @@
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private PreviewView mCameraView;
private FreezeController mFreezeController;
private ActionPanelController mActionPanelController;
private final static String TAG = "MainActivity";

@Override
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);
Expand All @@ -44,6 +48,8 @@ protected void onCreate(Bundle savedInstanceState) {
} catch (ExecutionException | InterruptedException e) {
e.printStackTrace();
}


}

@Override
Expand All @@ -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);
}

/**
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/res/anim/slide_down.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="0%"
android:toYDelta="100%" />
</set>
7 changes: 7 additions & 0 deletions app/src/main/res/anim/slide_up.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromYDelta="100%"
android:toYDelta="0%" />
</set>
1 change: 1 addition & 0 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
android:contentDescription="@string/stop_view_desc" />

<View
android:id="@+id/overlay_view"
android:layout_width="match_parent"
android:layout_height="256dp"
android:layout_gravity="bottom"
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values/config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--After how many milliseconds we should hide action panel-->
<integer name="autohide_action_panel_ms">15000</integer>
</resources>

0 comments on commit 1d0a8ec

Please sign in to comment.