Make Expandable more extensible

This commit is contained in:
topjohnwu 2019-03-13 06:12:02 -04:00
parent 3e35de9b39
commit 18ac6b270f
5 changed files with 75 additions and 41 deletions

View File

@ -19,7 +19,8 @@ import com.topjohnwu.magisk.container.Policy;
import com.topjohnwu.magisk.database.MagiskDB; import com.topjohnwu.magisk.database.MagiskDB;
import com.topjohnwu.magisk.dialogs.CustomAlertDialog; import com.topjohnwu.magisk.dialogs.CustomAlertDialog;
import com.topjohnwu.magisk.dialogs.FingerprintAuthDialog; import com.topjohnwu.magisk.dialogs.FingerprintAuthDialog;
import com.topjohnwu.magisk.uicomponents.ArrowExpandedViewHolder; import com.topjohnwu.magisk.uicomponents.ArrowExpandable;
import com.topjohnwu.magisk.uicomponents.Expandable;
import com.topjohnwu.magisk.uicomponents.ExpandableViewHolder; import com.topjohnwu.magisk.uicomponents.ExpandableViewHolder;
import com.topjohnwu.magisk.uicomponents.SnackbarMaker; import com.topjohnwu.magisk.uicomponents.SnackbarMaker;
import com.topjohnwu.magisk.utils.FingerprintHelper; import com.topjohnwu.magisk.utils.FingerprintHelper;
@ -160,12 +161,12 @@ public class PolicyAdapter extends RecyclerView.Adapter<PolicyAdapter.ViewHolder
@BindView(R.id.delete) ImageView delete; @BindView(R.id.delete) ImageView delete;
@BindView(R.id.more_info) ImageView moreInfo; @BindView(R.id.more_info) ImageView moreInfo;
ExpandableViewHolder settings; Expandable settings;
public ViewHolder(View itemView) { public ViewHolder(View itemView) {
super(itemView); super(itemView);
new PolicyAdapter$ViewHolder_ViewBinding(this, itemView); new PolicyAdapter$ViewHolder_ViewBinding(this, itemView);
settings = new ArrowExpandedViewHolder(expandLayout, arrow); settings = new ArrowExpandable(new ExpandableViewHolder(expandLayout), arrow);
} }
} }
} }

View File

@ -31,7 +31,8 @@ import com.topjohnwu.magisk.dialogs.MagiskInstallDialog;
import com.topjohnwu.magisk.dialogs.ManagerInstallDialog; import com.topjohnwu.magisk.dialogs.ManagerInstallDialog;
import com.topjohnwu.magisk.dialogs.UninstallDialog; import com.topjohnwu.magisk.dialogs.UninstallDialog;
import com.topjohnwu.magisk.tasks.CheckUpdates; import com.topjohnwu.magisk.tasks.CheckUpdates;
import com.topjohnwu.magisk.uicomponents.ArrowExpandedViewHolder; import com.topjohnwu.magisk.uicomponents.ArrowExpandable;
import com.topjohnwu.magisk.uicomponents.Expandable;
import com.topjohnwu.magisk.uicomponents.ExpandableViewHolder; import com.topjohnwu.magisk.uicomponents.ExpandableViewHolder;
import com.topjohnwu.magisk.uicomponents.MarkDownWindow; import com.topjohnwu.magisk.uicomponents.MarkDownWindow;
import com.topjohnwu.magisk.uicomponents.SafetyNet; import com.topjohnwu.magisk.uicomponents.SafetyNet;
@ -73,7 +74,7 @@ public class MagiskFragment extends BaseFragment
private UpdateCardHolder manager; private UpdateCardHolder manager;
private SafetyNet safetyNet; private SafetyNet safetyNet;
private Transition transition; private Transition transition;
private ExpandableViewHolder optionExpand; private Expandable optionExpand;
private void magiskInstall(View v) { private void magiskInstall(View v) {
// Show Manager update first // Show Manager update first
@ -137,7 +138,7 @@ public class MagiskFragment extends BaseFragment
unbinder = new MagiskFragment_ViewBinding(this, v); unbinder = new MagiskFragment_ViewBinding(this, v);
requireActivity().setTitle(R.string.magisk); requireActivity().setTitle(R.string.magisk);
optionExpand = new ArrowExpandedViewHolder(optionExpandLayout, arrow); optionExpand = new ArrowExpandable(new ExpandableViewHolder(optionExpandLayout), arrow);
safetyNet = new SafetyNet(v); safetyNet = new SafetyNet(v);
magisk = new UpdateCardHolder(inflater, root); magisk = new UpdateCardHolder(inflater, root);
manager = new UpdateCardHolder(inflater, root); manager = new UpdateCardHolder(inflater, root);

View File

@ -1,40 +1,39 @@
package com.topjohnwu.magisk.uicomponents; package com.topjohnwu.magisk.uicomponents;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation; import android.view.animation.Animation;
import android.view.animation.RotateAnimation; import android.view.animation.RotateAnimation;
public class ArrowExpandedViewHolder extends ExpandableViewHolder { public class ArrowExpandable extends Expandable {
protected Expandable mBase;
private View arrow; private View arrow;
public ArrowExpandedViewHolder(ViewGroup viewGroup, View arrow) { public ArrowExpandable(Expandable base, View arrow) {
super(viewGroup); mBase = base;
this.arrow = arrow; this.arrow = arrow;
} }
@Override @Override
public void setExpanded(boolean expanded) { public void onExpand() {
super.setExpanded(expanded); mBase.onExpand();
if (arrow != null)
arrow.setRotation(expanded ? 180 : 0);
}
@Override
public void expand() {
super.expand();
setRotate(new RotateAnimation(0, 180, setRotate(new RotateAnimation(0, 180,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f)); Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f));
} }
@Override @Override
public void collapse() { public void onCollapse() {
super.collapse(); mBase.onCollapse();
setRotate(new RotateAnimation(180, 0, setRotate(new RotateAnimation(180, 0,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f)); Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f));
} }
@Override
public void onSetExpanded(boolean expanded) {
mBase.onSetExpanded(expanded);
if (arrow != null)
arrow.setRotation(expanded ? 180 : 0);
}
private void setRotate(RotateAnimation rotate) { private void setRotate(RotateAnimation rotate) {
rotate.setDuration(300); rotate.setDuration(300);
rotate.setFillAfter(true); rotate.setFillAfter(true);

View File

@ -0,0 +1,40 @@
package com.topjohnwu.magisk.uicomponents;
public abstract class Expandable {
private boolean mExpanded = false;
public final boolean isExpanded() {
return mExpanded;
}
public final void setExpanded(boolean expanded) {
mExpanded = expanded;
onSetExpanded(expanded);
}
public final void expand() {
if (mExpanded)
return;
onExpand();
mExpanded = true;
}
public final void collapse() {
if (!mExpanded)
return;
onCollapse();
mExpanded = false;
}
protected abstract void onExpand();
protected abstract void onCollapse();
protected void onSetExpanded(boolean expanded) {
if (expanded)
onExpand();
else
onCollapse();
}
}

View File

@ -5,11 +5,10 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver; import android.view.ViewTreeObserver;
public class ExpandableViewHolder { public class ExpandableViewHolder extends Expandable {
private ViewGroup expandLayout; private ViewGroup expandLayout;
private ValueAnimator expandAnimator, collapseAnimator; private ValueAnimator expandAnimator, collapseAnimator;
private boolean mExpanded = false;
private int expandHeight = 0; private int expandHeight = 0;
public ExpandableViewHolder(ViewGroup viewGroup) { public ExpandableViewHolder(ViewGroup viewGroup) {
@ -34,30 +33,24 @@ public class ExpandableViewHolder {
}); });
} }
public boolean isExpanded() { @Override
return mExpanded; protected void onExpand() {
expandLayout.setVisibility(View.VISIBLE);
expandAnimator.start();
} }
public void setExpanded(boolean expanded) { @Override
mExpanded = expanded; protected void onCollapse() {
collapseAnimator.start();
}
@Override
protected void onSetExpanded(boolean expanded) {
ViewGroup.LayoutParams layoutParams = expandLayout.getLayoutParams(); ViewGroup.LayoutParams layoutParams = expandLayout.getLayoutParams();
layoutParams.height = expanded ? expandHeight : 0; layoutParams.height = expanded ? expandHeight : 0;
expandLayout.setLayoutParams(layoutParams); expandLayout.setLayoutParams(layoutParams);
} }
public void expand() {
if (mExpanded) return;
expandLayout.setVisibility(View.VISIBLE);
expandAnimator.start();
mExpanded = true;
}
public void collapse() {
if (!mExpanded) return;
collapseAnimator.start();
mExpanded = false;
}
private ValueAnimator slideAnimator(int start, int end) { private ValueAnimator slideAnimator(int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end); ValueAnimator animator = ValueAnimator.ofInt(start, end);