package com.android.internal.widget;
import android.util.ArraySet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import com.android.internal.R;
public class ViewClippingUtil {
private static final int CLIP_CLIPPING_SET = R.id.clip_children_set_tag;
private static final int CLIP_CHILDREN_TAG = R.id.clip_children_tag;
private static final int CLIP_TO_PADDING = R.id.clip_to_padding_tag;
public static void setClippingDeactivated(final View transformedView, boolean deactivated,
ClippingParameters clippingParameters) {
if (!deactivated && !clippingParameters.isClippingEnablingAllowed(transformedView)) {
return;
}
if (!(transformedView.getParent() instanceof ViewGroup)) {
return;
}
ViewGroup parent = (ViewGroup) transformedView.getParent();
while (true) {
if (!deactivated && !clippingParameters.isClippingEnablingAllowed(transformedView)) {
return;
}
ArraySet<View> clipSet = (ArraySet<View>) parent.getTag(CLIP_CLIPPING_SET);
if (clipSet == null) {
clipSet = new ArraySet<>();
parent.setTagInternal(CLIP_CLIPPING_SET, clipSet);
}
Boolean clipChildren = (Boolean) parent.getTag(CLIP_CHILDREN_TAG);
if (clipChildren == null) {
clipChildren = parent.getClipChildren();
parent.setTagInternal(CLIP_CHILDREN_TAG, clipChildren);
}
Boolean clipToPadding = (Boolean) parent.getTag(CLIP_TO_PADDING);
if (clipToPadding == null) {
clipToPadding = parent.getClipToPadding();
parent.setTagInternal(CLIP_TO_PADDING, clipToPadding);
}
if (!deactivated) {
clipSet.remove(transformedView);
if (clipSet.isEmpty()) {
parent.setClipChildren(clipChildren);
parent.setClipToPadding(clipToPadding);
parent.setTagInternal(CLIP_CLIPPING_SET, null);
clippingParameters.onClippingStateChanged(parent, true);
}
} else {
clipSet.add(transformedView);
parent.setClipChildren(false);
parent.setClipToPadding(false);
clippingParameters.onClippingStateChanged(parent, false);
}
if (clippingParameters.shouldFinish(parent)) {
return;
}
final ViewParent viewParent = parent.getParent();
if (viewParent instanceof ViewGroup) {
parent = (ViewGroup) viewParent;
} else {
return;
}
}
}
public interface ClippingParameters {
boolean shouldFinish(View view);
default boolean isClippingEnablingAllowed(View view) {
return !MessagingPropertyAnimator.isAnimatingTranslation(view);
}
default void onClippingStateChanged(View view, boolean isClipping) {};
}
}