package com.boardgamegeek.util; import android.app.Activity; import android.os.Handler; import android.support.annotation.StringRes; import android.support.v4.util.Pair; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import com.github.amlcurran.showcaseview.OnShowcaseEventListener; import com.github.amlcurran.showcaseview.ShowcaseView; import com.github.amlcurran.showcaseview.ShowcaseView.Builder; import com.github.amlcurran.showcaseview.targets.Target; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import hugo.weaving.DebugLog; public class ShowcaseViewWizard { private final WeakReference<Activity> activityWeakReference; private final String helpKey; private final int helpVersion; private ShowcaseView showcaseView; private int helpIndex; final List<Pair<Integer, Target>> helpTargets = new ArrayList<>(); public ShowcaseViewWizard(Activity activity, String helpKey, int helpVersion) { this.activityWeakReference = new WeakReference<>(activity); this.helpKey = helpKey; this.helpVersion = helpVersion; helpTargets.clear(); } public void addTarget(@StringRes int contextResId, Target target) { helpTargets.add(new Pair<>(contextResId, target)); } @DebugLog public void showHelp() { final Activity activity = activityWeakReference.get(); if (activity == null) return; helpIndex = 0; Builder builder = HelpUtils.getShowcaseBuilder(activity); if (builder == null) return; builder.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { showNextHelp(); } }); showcaseView = builder.build(); showcaseView.setOnShowcaseEventListener(new OnShowcaseEventListener() { @Override public void onShowcaseViewHide(ShowcaseView showcaseView) { HelpUtils.updateHelp(activity, helpKey, helpVersion); } @Override public void onShowcaseViewDidHide(ShowcaseView showcaseView) { } @Override public void onShowcaseViewShow(ShowcaseView showcaseView) { } @Override public void onShowcaseViewTouchBlocked(MotionEvent motionEvent) { } }); showcaseView.setButtonPosition(HelpUtils.getLowerLeftLayoutParams(activity)); showNextHelp(); } @DebugLog private void showNextHelp() { Activity activity = activityWeakReference.get(); if (activity == null) return; if (helpIndex < helpTargets.size()) { Pair<Integer, Target> helpTarget = helpTargets.get(helpIndex); StringBuilder sb = new StringBuilder(); for (int i = 0; i <= helpIndex; i++) { int resId = helpTargets.get(i).first; if (resId > 0) { sb.append("\n").append(activity.getString(resId)); } } showcaseView.setContentText(sb.toString()); showcaseView.setShowcase(helpTarget.second, true); } else { showcaseView.hide(); HelpUtils.updateHelp(activity, helpKey, helpVersion); } helpIndex++; } @DebugLog public void maybeShowHelp() { Activity activity = activityWeakReference.get(); if (activity == null) return; if (HelpUtils.shouldShowHelp(activity, helpKey, helpVersion)) { new Handler().postDelayed(new Runnable() { @Override public void run() { showHelp(); } }, 100); } } }