/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package com.linkbubble.ui;
import android.animation.Animator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
import com.linkbubble.Config;
import com.linkbubble.MainApplication;
import com.linkbubble.MainController;
import com.linkbubble.R;
import com.squareup.otto.Subscribe;
import java.util.Locale;
public class CloseTabTargetView extends BubbleTargetView {
private CloseAllView mCloseAllView;
private LinearInterpolator mInterpolator = new LinearInterpolator();
public CloseTabTargetView(Context context) {
this(context, null);
}
public CloseTabTargetView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CloseTabTargetView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onFinishInflate() {
super.onFinishInflate();
mCloseAllView = (CloseAllView) findViewById(R.id.close_all_view);
mCloseAllView.setVisibility(View.INVISIBLE);
}
@Override
protected float getRadius() {
int closeTabSize = getResources().getDimensionPixelSize(R.dimen.close_tab_target_size);
return closeTabSize * 0.5f;
}
private static final int ANIM_DURATION = 100;
private static final float MIN_SCALE = .7f;
@Override
public void beginLongHovering() {
super.beginLongHovering();
mCloseAllView.setAlpha(0f);
mCloseAllView.setVisibility(View.VISIBLE);
mCloseAllView.setScaleX(MIN_SCALE);
mCloseAllView.setScaleY(MIN_SCALE);
mCloseAllView.animate()
.alpha(1f)
.scaleX(1f)
.scaleY(1f)
.setDuration(ANIM_DURATION)
.setInterpolator(mInterpolator)
.setListener(null);
}
@Override
public void endLongHovering() {
mCloseAllView.animate()
.alpha(0.f)
.scaleX(MIN_SCALE)
.scaleY(MIN_SCALE)
.setDuration(ANIM_DURATION)
.setInterpolator(mInterpolator)
.setListener(mHideCloseAllViewListener);
super.endLongHovering();
}
private Animator.AnimatorListener mHideCloseAllViewListener = new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
mCloseAllView.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
};
@Override
protected void registerForBus() {
MainApplication.registerForBus(getContext(), this);
}
@Override
protected void unregisterForBus() {
MainApplication.unregisterForBus(getContext(), this);
}
@SuppressWarnings("unused")
@Subscribe
public void onBeginBubbleDrag(MainController.BeginBubbleDragEvent e) {
super.onBeginBubbleDrag(e);
}
@SuppressWarnings("unused")
@Subscribe
public void onEndBubbleDragEvent(MainController.EndBubbleDragEvent e) {
super.onEndBubbleDragEvent(e);
}
@SuppressWarnings("unused")
@Subscribe
public void onDraggableBubbleMovedEvent(MainController.DraggableBubbleMovedEvent e) {
super.onDraggableBubbleMovedEvent(e);
}
public static class CloseAllView extends View {
private Path mPath;
private Paint mPaint;
private String mText;
public CloseAllView(Context context) {
this(context, null);
}
public CloseAllView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CloseAllView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setTextSize(Config.dpToPx(12));
mPaint.setTypeface(Typeface.create(Typeface.SANS_SERIF,Typeface.BOLD));
mPaint.setTextAlign(Paint.Align.CENTER);
mPaint.setColor(Color.WHITE);
int textCircleSize = getResources().getDimensionPixelSize(R.dimen.close_tab_text_circle_size);
int closeTabSize = getResources().getDimensionPixelSize(R.dimen.close_tab_target_size);
int start = (closeTabSize - textCircleSize) / 2;
RectF circle = new RectF();
circle.set(start, start, start + textCircleSize, start + textCircleSize);
mPath = new Path();
mPath.addArc(circle, 180, 180);
mText = getResources().getString(R.string.action_close_all).toUpperCase(Locale.getDefault());
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawTextOnPath(mText, mPath, 0, 0, mPaint);
}
}
}