/* * Copyright (C) 2014 Balys Valentukevicius * * 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.marshalchen.common.ui.materialmenu; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; import com.marshalchen.common.R; import static com.marshalchen.common.ui.materialmenu.MaterialMenuDrawable.DEFAULT_PRESSED_DURATION; import static com.marshalchen.common.ui.materialmenu.MaterialMenuDrawable.DEFAULT_SCALE; import static com.marshalchen.common.ui.materialmenu.MaterialMenuDrawable.DEFAULT_TRANSFORM_DURATION; /** * Base class for ActionBar implementations of {@link MaterialMenuDrawable} * * @see MaterialMenuIcon */ public abstract class MaterialMenuBase implements MaterialMenu { private static final String STATE_KEY = "material_menu_icon_state"; private MaterialMenuDrawable.IconState currentState = MaterialMenuDrawable.IconState.BURGER; private MaterialMenuDrawable drawable; public MaterialMenuBase(Activity activity, int color, MaterialMenuDrawable.Stroke stroke) { this(activity, color, stroke, DEFAULT_TRANSFORM_DURATION, DEFAULT_PRESSED_DURATION); } public MaterialMenuBase(Activity activity, int color, MaterialMenuDrawable.Stroke stroke, int transformDuration) { this(activity, color, stroke, transformDuration, DEFAULT_PRESSED_DURATION); } public MaterialMenuBase(Activity activity, int color, MaterialMenuDrawable.Stroke stroke, int transformDuration, int pressedDuration) { drawable = new MaterialMenuDrawable(activity, color, stroke, DEFAULT_SCALE, transformDuration, pressedDuration); setActionBarSettings(activity); if (providesActionBar()) { setupActionBar(activity); } } private void setupActionBar(Activity activity) { final View iconView = getActionBarHomeView(activity); final View upView = getActionBarUpView(activity); if (iconView == null || upView == null) { throw new IllegalStateException("Could not find ActionBar views"); } // need no margins so that clicked state would work nicely ViewGroup.MarginLayoutParams iconParams = (ViewGroup.MarginLayoutParams) iconView.getLayoutParams(); iconParams.bottomMargin = 0; iconParams.topMargin = 0; iconParams.leftMargin = 0; iconView.setLayoutParams(iconParams); // remove up arrow margins ViewGroup.MarginLayoutParams upParams = (ViewGroup.MarginLayoutParams) upView.getLayoutParams(); upParams.leftMargin = activity.getResources().getDimensionPixelSize(R.dimen.mm_up_arrow_margin); upParams.rightMargin = 0; upView.setLayoutParams(upParams); } protected abstract void setActionBarSettings(Activity activity); protected abstract View getActionBarHomeView(Activity activity); protected abstract View getActionBarUpView(Activity activity); protected abstract boolean providesActionBar(); @Override public final void setState(MaterialMenuDrawable.IconState state) { currentState = state; getDrawable().setIconState(state); } @Override public final MaterialMenuDrawable.IconState getState() { return getDrawable().getIconState(); } @Override public final void animateState(MaterialMenuDrawable.IconState state) { currentState = state; getDrawable().animateIconState(state, false); } @Override public final void animatePressedState(MaterialMenuDrawable.IconState state) { currentState = state; getDrawable().animateIconState(state, true); } @Override public final void setColor(int color) { getDrawable().setColor(color); } @Override public final void setTransformationDuration(int duration) { getDrawable().setTransformationDuration(duration); } @Override public final void setPressedDuration(int duration) { getDrawable().setPressedDuration(duration); } @Override public final void setInterpolator(Interpolator interpolator) { getDrawable().setInterpolator(interpolator); } @Override public final void setRTLEnabled(boolean rtlEnabled) { getDrawable().setRTLEnabled(rtlEnabled); } @Override public final void setTransformationOffset(MaterialMenuDrawable.AnimationState animationState, float value) { currentState = getDrawable().setTransformationOffset(animationState, value); } @Override public final MaterialMenuDrawable getDrawable() { return drawable; } /** * Overwrites behaviour of pressed state circle animation even when using {@link #animatePressedState(com.marshalchen.common.ui.materialmenu.MaterialMenuDrawable.IconState)} * * @param neverDrawTouch true to never draw pressed state circle animation */ public final void setNeverDrawTouch(boolean neverDrawTouch) { getDrawable().setNeverDrawTouch(neverDrawTouch); } /** * Call from {@link android.app.Activity#onSaveInstanceState(android.os.Bundle)} to store current icon state * * @param outState outState */ public void onSaveInstanceState(Bundle outState) { outState.putString(STATE_KEY, currentState.name()); } /** * Call from {@link android.app.Activity#onPostCreate(android.os.Bundle)} to restore icon state * * @param state state */ public void syncState(Bundle state) { if (state != null) { String iconStateName = state.getString(STATE_KEY); if (iconStateName == null) { iconStateName = MaterialMenuDrawable.IconState.BURGER.name(); } setState(MaterialMenuDrawable.IconState.valueOf(iconStateName)); } } }