package com.xabber.android.ui.helper; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.TypedValue; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.RelativeLayout; import com.github.ksoichiro.android.observablescrollview.ObservableScrollView; import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks; import com.github.ksoichiro.android.observablescrollview.ScrollState; import com.github.ksoichiro.android.observablescrollview.ScrollUtils; import com.xabber.android.R; import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.roster.AbstractContact; import static java.lang.Math.pow; import static java.lang.Math.round; import static java.lang.Math.sqrt; public class ContactTitleExpandableToolbarInflater implements ObservableScrollViewCallbacks { private final AppCompatActivity activity; private View avatarView; private View titleView; private View contactNamePanel; private int toolbarHeight; private int paddingLeftMin; private int actionBarSize; private int toolbarHeightDelta; private int avatarLargeSize; private int avatarNormalSize; private int avatarRadius; private int contactTitlePaddingBottomBig; private int contactTitlePaddingBottomSmall; private Toolbar toolbar; public ContactTitleExpandableToolbarInflater(AppCompatActivity activity) { this.activity = activity; } public void onCreate(AbstractContact abstractContact) { activity.setContentView(R.layout.expandable_contact_title_activity); toolbar = (Toolbar) activity.findViewById(R.id.toolbar_overlay); avatarView = activity.findViewById(R.id.avatar); contactNamePanel = activity.findViewById(R.id.contact_name_panel); titleView = activity.findViewById(R.id.expandable_contact_title); int[] accountActionBarColors = activity.getResources().getIntArray(R.array.account_action_bar); titleView.setBackgroundDrawable(new ColorDrawable(accountActionBarColors[ AccountManager.getInstance().getColorLevel(abstractContact.getAccount())])); ContactTitleInflater.updateTitle(titleView, activity, abstractContact); int[] accountStatusBarColors = activity.getResources().getIntArray(R.array.account_status_bar); int colorLevel = AccountManager.getInstance().getColorLevel(abstractContact.getAccount()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = activity.getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); window.setStatusBarColor(accountStatusBarColors[colorLevel]); } } public void onResume() { Resources resources = activity.getResources(); paddingLeftMin = resources.getDimensionPixelSize(R.dimen.contact_title_padding_left); avatarLargeSize = resources.getDimensionPixelSize(R.dimen.avatar_large_size); avatarNormalSize = resources.getDimensionPixelSize(R.dimen.avatar_normal_size); avatarRadius = resources.getDimensionPixelSize(R.dimen.avatar_radius); contactTitlePaddingBottomBig = resources.getDimensionPixelSize(R.dimen.contact_title_padding_bottom_big); contactTitlePaddingBottomSmall = resources.getDimensionPixelSize(R.dimen.contact_title_padding_bottom_small); toolbarHeight = resources.getDimensionPixelSize(R.dimen.toolbar_height); actionBarSize = getActionBarSize(); toolbarHeightDelta = toolbarHeight - actionBarSize; final ObservableScrollView scrollView = (ObservableScrollView) activity.findViewById(R.id.scroll); scrollView.setScrollViewCallbacks(this); ScrollUtils.addOnGlobalLayoutListener(activity.findViewById(R.id.expandable_contact_title), new Runnable() { @Override public void run() { updateFlexibleSpaceText(scrollView.getCurrentScrollY()); } }); } protected int getActionBarSize() { TypedValue typedValue = new TypedValue(); int[] textSizeAttr = new int[]{R.attr.actionBarSize}; int indexOfAttrTextSize = 0; TypedArray a = activity.obtainStyledAttributes(typedValue.data, textSizeAttr); int actionBarSize = a.getDimensionPixelSize(indexOfAttrTextSize, -1); a.recycle(); return actionBarSize; } @Override public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) { updateFlexibleSpaceText(scrollY); } @Override public void onDownMotionEvent() { } @Override public void onUpOrCancelMotionEvent(ScrollState scrollState) { } private void updateFlexibleSpaceText(final int scrollY) { setLeftPadding(scrollY); setTopPadding(scrollY); setAvatarSize(scrollY); setHeight(scrollY); } private void setTopPadding(int scrollY) { int paddingDelta = contactTitlePaddingBottomBig - contactTitlePaddingBottomSmall; int paddingBottom = contactTitlePaddingBottomBig - scrollY * paddingDelta / toolbarHeightDelta; if (scrollY <= 0) { paddingBottom = contactTitlePaddingBottomBig; } if (scrollY >= toolbarHeightDelta) { paddingBottom = contactTitlePaddingBottomSmall; } contactNamePanel.setPadding(0, 0, 0, paddingBottom); } private void setAvatarSize(int scrollY) { int newAvatarSize = avatarLargeSize - (scrollY / 2); if (newAvatarSize < avatarNormalSize) { newAvatarSize = avatarNormalSize; } if (avatarView.getWidth() != newAvatarSize) { avatarView.getLayoutParams().width = newAvatarSize; avatarView.getLayoutParams().height = newAvatarSize; } } private void setHeight(int scrollY) { int newHeight = toolbarHeight - scrollY; if (newHeight < actionBarSize) { newHeight = actionBarSize; } titleView.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, newHeight)); } private void setLeftPadding(int scrollY) { int paddingLeft = (int) round(sqrt(pow(avatarRadius, 2) - pow(scrollY - avatarRadius, 2))); if (scrollY < 0) { paddingLeft = paddingLeftMin; } if (scrollY > avatarRadius) { paddingLeft = avatarRadius; } if (paddingLeft < paddingLeftMin) { paddingLeft = paddingLeftMin; } titleView.setPadding(paddingLeft, 0, paddingLeft, 0); } public Toolbar getToolbar() { return toolbar; } }