package org.wikipedia.tooltip;
import android.app.Activity;
import android.support.annotation.ColorInt;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.view.ViewGroup;
import com.appenguin.onboarding.ToolTip;
import com.appenguin.onboarding.ToolTipView;
import org.wikipedia.R;
import org.wikipedia.activity.ActivityUtil;
import static org.wikipedia.util.ResourceUtil.getThemedAttributeId;
public final class ToolTipUtil {
private static final int TOOL_TIP_VIEW_ID = R.id.view_tool_tip_container;
/**
* @param activity The Activity whose view hierarchy the tool tip will reside in.
* @param targetView The view the tool tip should point at.
* @param contentLayout The layout resource to inflate into the tool tip.
* @param color The color resource for the tool tip background.
* @param position The position of the tool tip relative the targetView.
**/
public static void showToolTip(Activity activity,
View targetView,
@LayoutRes int contentLayout,
@ColorInt int color,
ToolTip.Position position) {
removeToolTip(activity);
ToolTipContainerView toolTip = buildToolTip(targetView, contentLayout, color, position);
addToolTip(activity, toolTip);
}
public static void showToolTip(Activity activity,
View targetView,
@LayoutRes int contentLayout,
ToolTip.Position position) {
int color = ContextCompat.getColor(activity, getThemedAttributeId(activity, R.attr.tool_tip_default_color));
showToolTip(activity, targetView, contentLayout, color, position);
}
/** @return True if dismissed, false if not present. */
public static boolean dismissToolTip(Activity activity) {
return removeToolTip(activity);
}
// Injects the tool tip right under the root view on top of everything else.
private static void addToolTip(Activity activity, ToolTipContainerView toolTip) {
((ViewGroup) ActivityUtil.getRootView(activity)).addView(toolTip);
}
private static boolean removeToolTip(@NonNull Activity activity) {
ToolTipContainerView toolTip = findToolTip(ActivityUtil.getRootView(activity));
if (toolTip != null) {
toolTip.postDetach();
// Since detach is asynchronous, avoid potential race conditions by clearing the ID.
toolTip.setId(View.NO_ID);
return true;
}
return false;
}
@Nullable
private static ToolTipContainerView findToolTip(@NonNull View view) {
return (ToolTipContainerView) view.findViewById(TOOL_TIP_VIEW_ID);
}
/** Assembles a tool tip and its contents. */
private static ToolTipContainerView buildToolTip(View targetView,
@LayoutRes int contentLayout,
@ColorInt int color,
ToolTip.Position position) {
ToolTipView contentView = new ToolTipView(targetView.getContext());
ToolTipContainerView containerView = buildToolTipContainerView(contentView);
ToolTip content = buildToolTipContent(targetView, contentLayout, color, position);
contentView.setToolTip(content, targetView);
return containerView;
}
private static ToolTip buildToolTipContent(View targetView,
@LayoutRes int contentLayout,
@ColorInt int color,
ToolTip.Position position) {
return new ToolTip()
.withColor(color)
.withContentView(View.inflate(targetView.getContext(), contentLayout, null))
.withPosition(position);
}
private static ToolTipContainerView buildToolTipContainerView(ToolTipView contentView) {
ToolTipContainerView containerView = new ToolTipContainerView(contentView);
containerView.setId(TOOL_TIP_VIEW_ID);
return containerView;
}
private ToolTipUtil() { }
}