Java tutorial
/* * Materialize - Materialize all those not material * Copyright (C) 2015 XiNGRZ <xxx@oxo.ooo> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ooo.oxo.apps.materialize; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.os.Build; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.view.View; import android.view.ViewAnimationUtils; import android.view.ViewGroup; import android.widget.EditText; import ooo.oxo.apps.materialize.util.SoftInputManager; public class SearchPanelController { private final ViewGroup container; private final Resources resources; private final EditText keyword; private final SoftInputManager softInputManager; public SearchPanelController(ViewGroup container) { this.container = container; Context context = container.getContext(); this.resources = context.getResources(); this.keyword = (EditText) container.findViewById(R.id.keyword); container.findViewById(R.id.close).setOnClickListener(v -> clear()); this.softInputManager = SoftInputManager.from(keyword); } public EditText getKeyword() { return keyword; } public void open() { if (container.getVisibility() == View.VISIBLE) { return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Animator animator = makeSearchPanelAnimator(false); container.setVisibility(View.VISIBLE); animator.start(); } else { container.setVisibility(View.VISIBLE); } keyword.requestFocus(); softInputManager.show(); } public void close() { if (container.getVisibility() == View.INVISIBLE) { return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Animator animator = makeSearchPanelAnimator(true); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { container.setVisibility(View.INVISIBLE); keyword.clearFocus(); } }); animator.start(); } else { container.setVisibility(View.INVISIBLE); } softInputManager.hide(); } public void clear() { keyword.setText(""); close(); } public boolean onBackPressed() { if (container.getVisibility() == View.VISIBLE) { clear(); return true; } else { return false; } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private Animator makeSearchPanelAnimator(boolean reverse) { int width = container.getWidth(); int centerX = container.getRight() + container.getPaddingRight() - resources.getDimensionPixelOffset(R.dimen.reveal_right) / 4 * 3; int centerY = container.getHeight() / 2; Animator animator = ViewAnimationUtils.createCircularReveal(container, centerX, centerY, reverse ? width : 0, reverse ? 0 : width); animator.setInterpolator(new FastOutSlowInInterpolator()); animator.setDuration(resources.getInteger(android.R.integer.config_mediumAnimTime)); return animator; } }