package com.wamod.view; import android.content.Context; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.support.v7.app.AppCompatActivity; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.Animation; import android.view.animation.Transformation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.wamod.ColorsManager; import com.wamod.Resources; import com.wamod.Utils; import com.whatsapp.HomeActivity; import java.util.ArrayList; /** * Created by BrianValente on 3/24/16. */ public class BottomNavigation extends LinearLayout { RelativeLayout callsBtn; RelativeLayout chatsBtn; RelativeLayout contactsBtn; HomeActivity.TabsPager pager; Context ctx; float originalLabelTextSize = 0; float originalIconTopMargin = 0; int inactiveColor; int activeColor; int backgroundColor; int activeItem; boolean firstAnim = true; float labelMultiplier = Utils.Nexus6PResToActualDevice(this.getContext(), 9, 9)[0]; float iconMultiplier = Utils.Nexus6PResToActualDevice(this.getContext(), 5, 5)[0]; public BottomNavigation(Context context) { super(context); this.ctx = context; init(); } public BottomNavigation(Context context, AttributeSet attrs) { super(context, attrs); this.ctx = context; init(); } private void init() { getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { View tabs = ((HomeActivity) ctx).findViewById(Resources.id.tabs); View pager_holder = ((HomeActivity) ctx).findViewById(Resources.id.pager_holder); ViewGroup content = (ViewGroup) ((HomeActivity) ctx).findViewById(Resources.id.content); pager = (HomeActivity.TabsPager) ((HomeActivity) ctx).findViewById(Resources.id.pager); callsBtn = (RelativeLayout) findViewById(Resources.id.wamod_bottomnav_calls); chatsBtn = (RelativeLayout) findViewById(Resources.id.wamod_bottomnav_chats); contactsBtn = (RelativeLayout) findViewById(Resources.id.wamod_bottomnav_contacts); loadColors(); setInactive(); tabs.setVisibility(View.GONE); pager_holder.setPadding(0,0,0,0); /*RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(content.getLayoutParams()); params.setMargins(0,0,0,utils.Nexus6PResToActualDevice(getContext(),224,224)[0]); content.setLayoutParams(params);*/ content.setPadding(0,0,0,getHeight()); pager.addOnPageChangeListener(new HomeActivity.TabsPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { switch (position) { case 0: setActive(callsBtn, 0); break; case 1: setActive(chatsBtn, 1); break; case 2: setActive(contactsBtn, 2); break; } } @Override public void onPageScrollStateChanged(int state) { } }); setActive(chatsBtn, 1); /*View label = callsBtn.getChildAt(1); if (label != null && label instanceof TextView) originalLabelTextSize = ((TextView) label).getTextSize();*/ View icon = callsBtn.getChildAt(0); if (icon != null && icon instanceof ImageView) originalIconTopMargin = icon.getPaddingTop(); callsBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setActive(callsBtn, 0); pager.setCurrentItem(0); } }); chatsBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setActive(chatsBtn, 1); pager.setCurrentItem(1); } }); contactsBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setActive(contactsBtn, 2); pager.setCurrentItem(2); } }); Log.i("WAMOD", "Text size: " + originalLabelTextSize + "Icon margin: " + originalIconTopMargin); HomeActivity a = (HomeActivity) ctx; ViewGroup tabs2 = (ViewGroup) a.findViewById(Resources.getID("tabs")); ViewGroup tabsChild = (ViewGroup) tabs2.getChildAt(0); ViewGroup tab = (ViewGroup) tabsChild.getChildAt(1); final TextView badge = (TextView) tab.findViewById(Resources.getID("badge")); badge.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { ViewGroup wamod_badge_big = (ViewGroup) ((AppCompatActivity)ctx).findViewById(Resources.getID("wamod_badge_big")); if (badge.getVisibility() == GONE) wamod_badge_big.setVisibility(GONE); else wamod_badge_big.setVisibility(VISIBLE); } }); getViewTreeObserver().removeOnGlobalLayoutListener(this); } }); } private void setActive(RelativeLayout button, int n) { if (activeItem == n) return; activeItem = n; setInactive(); final View label = button.getChildAt(1); final View iconContainer = button.findViewById(Resources.getID("icon_container")); final View icon = button.findViewById(Resources.getID("icon")); if (label != null && label instanceof TextView) { TextView lb = ((TextView) label); lb.setTextColor(activeColor); } if (icon != null && icon instanceof ImageView) { ImageView icn = ((ImageView) icon); icn.setColorFilter(activeColor); } ImageView wamod_badge_small = (ImageView) button.findViewById(Resources.getID("wamod_badge_small")); if (wamod_badge_small != null) { Drawable badge_small = button.getResources().getDrawable(Resources.getDrawable("wamod_badge_small")); badge_small.setColorFilter(activeColor, PorterDuff.Mode.MULTIPLY); wamod_badge_small.setImageDrawable(badge_small); } Animation anim = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { if (interpolatedTime == 0 && originalLabelTextSize == 0) originalLabelTextSize = ((TextView) label).getTextSize(); if (interpolatedTime == 0) ((TextView) label).setTextSize(TypedValue.COMPLEX_UNIT_PX, originalLabelTextSize); float newTextSize = (labelMultiplier * interpolatedTime) + originalLabelTextSize; ((TextView) label).setTextSize(TypedValue.COMPLEX_UNIT_PX, newTextSize); if (interpolatedTime == 0 && originalIconTopMargin == 0) originalIconTopMargin = icon.getPaddingTop(); int newPadding = (int) (originalIconTopMargin - (iconMultiplier * interpolatedTime)); if (iconContainer == null) icon.setPadding(0, newPadding, 0, 0); else iconContainer.setPadding(0, newPadding, 0, 0); } }; anim.setDuration(100); if (firstAnim) { anim.setDuration(0); firstAnim = false; } anim.setInterpolator(new AccelerateDecelerateInterpolator()); button.startAnimation(anim); } private void setInactive() { ArrayList<RelativeLayout> buttons = new ArrayList<>(); buttons.add(callsBtn); buttons.add(chatsBtn); buttons.add(contactsBtn); for (int i = 0; i<buttons.size(); i++) { if (!(i == activeItem)) { RelativeLayout btn = buttons.get(i); btn.setAnimation(null); final View label = btn.getChildAt(1); final View iconContainer = btn.findViewById(Resources.getID("icon_container")); final View icon = btn.findViewById(Resources.getID("icon")); if (label != null && label instanceof TextView) { TextView lb = ((TextView) label); lb.setTextColor(inactiveColor); } if (icon != null && icon instanceof ImageView) { ImageView icn = ((ImageView) icon); icn.setColorFilter(inactiveColor); } ImageView wamod_badge_small = (ImageView) btn.findViewById(Resources.getID("wamod_badge_small")); if (wamod_badge_small != null) { Drawable badge_small = btn.getResources().getDrawable(Resources.getDrawable("wamod_badge_small")); badge_small.setColorFilter(inactiveColor, PorterDuff.Mode.MULTIPLY); wamod_badge_small.setImageDrawable(badge_small); } if (((TextView) label).getTextSize() != originalLabelTextSize) { Animation anim = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { float interpolatorTime = (-interpolatedTime) + 1; float newTextSize = (labelMultiplier * interpolatorTime) + originalLabelTextSize; ((TextView) label).setTextSize(TypedValue.COMPLEX_UNIT_PX, newTextSize); int newPadding = (int) (originalIconTopMargin - (iconMultiplier * interpolatorTime)); if (iconContainer == null) icon.setPadding(0, newPadding, 0, 0); else iconContainer.setPadding(0, newPadding, 0, 0); } }; anim.setDuration(100); anim.setInterpolator(new AccelerateDecelerateInterpolator()); btn.startAnimation(anim); } } } } private void loadColors() { try { if (Utils.prefs.getBoolean("home_bottomnavigationbar_autocolor", true)) { backgroundColor = ColorsManager.getColor(ColorsManager.UI_ACTIVITY_BACKGROUND); inactiveColor = ColorsManager.getColor(ColorsManager.UI_ACTIVITY_TEXT_SECONDARY); activeColor = ColorsManager.getColor(ColorsManager.UI_ACTIVITY_TOOLBAR); } else { backgroundColor = ColorsManager.getColor(ColorsManager.UI_HOME_BOTTOMBAR_BACKGROUND); activeColor = ColorsManager.getColor(ColorsManager.UI_HOME_BOTTOMBAR_ACTIVEITEM); inactiveColor = ColorsManager.getColor(ColorsManager.UI_HOME_BOTTOMBAR_INACTIVEITEM); } setBackgroundColor(backgroundColor); ViewGroup wamod_badge_big = (ViewGroup) ((AppCompatActivity)ctx).findViewById(Resources.getID("wamod_badge_big")); if (wamod_badge_big != null) { Drawable badge_big = ctx.getResources().getDrawable(Resources.getDrawable("wamod_badge_big")); badge_big.setColorFilter(backgroundColor, PorterDuff.Mode.MULTIPLY); wamod_badge_big.setBackground(badge_big); } } catch (Exception e) { Utils.manageException(e); } } }