Skip to content

Instantly share code, notes, and snippets.

@jenzz
Created August 2, 2013 10:08
Show Gist options
  • Select an option

  • Save jenzz/6138830 to your computer and use it in GitHub Desktop.

Select an option

Save jenzz/6138830 to your computer and use it in GitHub Desktop.

Revisions

  1. Jens Driller created this gist Aug 2, 2013.
    136 changes: 136 additions & 0 deletions UndoBarController.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,136 @@
    /*
    * Copyright 2012 Roman Nurik
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    * http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */

    package com.example.android.undobar;

    import com.nineoldandroids.animation.Animator;
    import com.nineoldandroids.animation.AnimatorListenerAdapter;
    import com.nineoldandroids.animation.ValueAnimator;
    import com.nineoldandroids.view.ViewPropertyAnimator;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Parcelable;
    import android.text.TextUtils;
    import android.view.View;
    import android.widget.TextView;

    import static com.nineoldandroids.view.ViewHelper.setAlpha;
    import static com.nineoldandroids.view.ViewPropertyAnimator.animate;

    public class UndoBarController {
    private View mBarView;
    private TextView mMessageView;
    private ViewPropertyAnimator mBarAnimator;
    private Handler mHideHandler = new Handler();

    private UndoListener mUndoListener;

    // State objects
    private Parcelable mUndoToken;
    private CharSequence mUndoMessage;

    public interface UndoListener {
    void onUndo(Parcelable token);
    }

    public UndoBarController(View undoBarView, UndoListener undoListener) {
    mBarView = undoBarView;
    mBarAnimator = animate(mBarView);
    mUndoListener = undoListener;

    mMessageView = (TextView) mBarView.findViewById(R.id.undobar_message);
    mBarView.findViewById(R.id.undobar_button)
    .setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    hideUndoBar(false);
    mUndoListener.onUndo(mUndoToken);
    }
    });

    hideUndoBar(true);
    }

    public void showUndoBar(boolean immediate, CharSequence message, Parcelable undoToken) {
    mUndoToken = undoToken;
    mUndoMessage = message;
    mMessageView.setText(mUndoMessage);

    mHideHandler.removeCallbacks(mHideRunnable);
    mHideHandler.postDelayed(mHideRunnable, 5000);

    mBarView.setVisibility(View.VISIBLE);
    if (immediate) {
    setAlpha(mBarView, 1);
    } else {
    mBarAnimator.cancel();
    mBarAnimator
    .alpha(1)
    .setDuration(
    mBarView.getResources()
    .getInteger(android.R.integer.config_shortAnimTime))
    .setListener(null);
    }
    }

    public void hideUndoBar(boolean immediate) {
    mHideHandler.removeCallbacks(mHideRunnable);
    if (immediate) {
    mBarView.setVisibility(View.GONE);
    setAlpha(mBarView, 0);
    mUndoMessage = null;
    mUndoToken = null;

    } else {
    mBarAnimator.cancel();
    mBarAnimator
    .alpha(0)
    .setDuration(mBarView.getResources()
    .getInteger(android.R.integer.config_shortAnimTime))
    .setListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
    mBarView.setVisibility(View.GONE);
    mUndoMessage = null;
    mUndoToken = null;
    }
    });
    }
    }

    public void onSaveInstanceState(Bundle outState) {
    outState.putCharSequence("undo_message", mUndoMessage);
    outState.putParcelable("undo_token", mUndoToken);
    }

    public void onRestoreInstanceState(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
    mUndoMessage = savedInstanceState.getCharSequence("undo_message");
    mUndoToken = savedInstanceState.getParcelable("undo_token");

    if (mUndoToken != null || !TextUtils.isEmpty(mUndoMessage)) {
    showUndoBar(true, mUndoMessage, mUndoToken);
    }
    }
    }

    private Runnable mHideRunnable = new Runnable() {
    @Override
    public void run() {
    hideUndoBar(false);
    }
    };
    }