package com.gettingmobile.goodnews.tip; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.ScrollView; import com.gettingmobile.android.app.AdaptiveDialogHandler; import com.gettingmobile.goodnews.Application; import com.gettingmobile.goodnews.R; import com.google.inject.Inject; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class TipDialogHandler extends AdaptiveDialogHandler implements CompoundButton.OnCheckedChangeListener { public static final String EXTRA_TIP_GROUP = "com.gettingmobile.goodnews.intent.extra.TIP_GROUP"; public static final String EXTRA_TIP_UNSHOWN_ONLY = "com.gettingmobile.goodnews.intent.extra.TIP_UNSHOWN"; public static final String EXTRA_TIP_ID = "com.gettingmobile.goodnews.intent.extra.TIP_ID"; private final String tipId; private final int tipGroupId; private final boolean unshownOnly; private List<Tip> tips = null; private int currentTipIndex = -1; private ScrollView container = null; private WebView contentView = null; private CheckBox additionalCheckBox = null; private View autoShowCheckBoxContainer = null; private Animation prevAnimation = null; private Animation nextAnimation = null; public static boolean start(Application app, Activity activity, TipManager tipManager, int tipGroupId, boolean unshownOnly) { if (unshownOnly && !app.getSettings().autoShowUsageTips()) return false; if (unshownOnly && tipManager != null) { final List<Tip> tips = tipManager.getGroup(tipGroupId, unshownOnly, Tip.FLAG_FULL_SCREEN); for (Iterator<Tip> it = tips.iterator(); it.hasNext(); ) { final FullScreenTip tip = (FullScreenTip) it.next(); if (!tip.canShowNow(activity)) { it.remove(); } } if (tips.isEmpty()) { return false; } } final Bundle extras = new Bundle(); extras.putInt(EXTRA_TIP_GROUP, tipGroupId); extras.putBoolean(EXTRA_TIP_UNSHOWN_ONLY, unshownOnly); start(activity, TipDialogHandler.class, extras); return true; } public static void start(Activity activity, TipManager tipManager, String tipId) { final Tip tip = tipManager.getTip(tipId); if (tip != null && tip instanceof FullScreenTip && ((FullScreenTip) tip).canShowNow(activity)) { final Bundle extras = new Bundle(); extras.putString(EXTRA_TIP_ID, tipId); start(activity, TipDialogHandler.class, extras); } } @Inject public TipDialogHandler(Bundle extras) { super(R.layout.tip); tipId = extras.getString(EXTRA_TIP_ID); tipGroupId = extras.getInt(EXTRA_TIP_GROUP); unshownOnly = extras.getBoolean(EXTRA_TIP_UNSHOWN_ONLY); } private void buildTipList() { if (tipId != null) { tips = new ArrayList<Tip>(1); tips.add(getDialog().getApp().getTipManager().getTip(tipId)); } else { if (tipGroupId == TipManager.TIP_UNGROUPED) { tips = getDialog().getApp().getTipManager().getTips(Tip.FLAG_FULL_SCREEN); } else { tips = getDialog().getApp().getTipManager().getGroup(tipGroupId, unshownOnly, Tip.FLAG_FULL_SCREEN); } } } @Override protected void onCreate(View view) { buildTipList(); getDialog().getRightButton().setText(R.string.next); getDialog().getRightButton().setVisibility(View.VISIBLE); getDialog().getLeftButton().setText(R.string.prev); getDialog().getLeftButton().setVisibility(View.VISIBLE); getDialog().getMiddleButton().setText(R.string.close); getDialog().getMiddleButton().setVisibility(View.VISIBLE); prevAnimation = AnimationUtils.loadAnimation(getDialog().getApp(), R.anim.slide_right); nextAnimation = AnimationUtils.loadAnimation(getDialog().getApp(), R.anim.slide_left); container = (ScrollView) view.findViewById(R.id.container); contentView = (WebView) container.findViewById(R.id.content); contentView.setWebChromeClient(new WebChromeClient() { @Override public void onReceivedTitle(WebView view, String title) { getDialog().setTitle(title); } }); contentView.setBackgroundColor(0x00000000); initCheckBox(container, R.id.auto_show_tips).setChecked(getDialog().getApp().getSettings().autoShowUsageTips()); additionalCheckBox = initCheckBox(container, R.id.additional_tip_check_box); autoShowCheckBoxContainer = view.findViewById(R.id.auto_show_tips_group); } @Override protected void onStart() { boolean showNextPrev = tips.size() > 1; getDialog().getRightButton().setVisibility(showNextPrev ? View.VISIBLE : View.GONE); getDialog().getLeftButton().setVisibility(showNextPrev ? View.VISIBLE : View.GONE); showFirstTip(); } /* * button handling */ private CheckBox initCheckBox(View container, int checkBoxId) { final CheckBox checkBox = (CheckBox) container.findViewById(checkBoxId); checkBox.setOnCheckedChangeListener(this); final float scale = getDialog().getApp().getResources().getDisplayMetrics().density; checkBox.setPadding(checkBox.getPaddingLeft() + (int)(6 * scale), checkBox.getPaddingTop(), checkBox.getPaddingRight(), checkBox.getPaddingBottom()); return checkBox; } @Override protected void onRightButtonClicked() { showNextTip(); } @Override protected void onLeftButtonClicked() { showPrevTip(); } /* * show tip */ protected void showFirstTip() { if (!tips.isEmpty()) { showTip(0); } else { getDialog().dismiss(); } } protected void showNextTip() { if (currentTipIndex >= 0 && currentTipIndex < (tips.size() - 1)) { container.startAnimation(nextAnimation); showTip(currentTipIndex + 1); } } protected void showPrevTip() { if (currentTipIndex > 0) { container.startAnimation(prevAnimation); showTip(currentTipIndex - 1); } } protected void showTip(int tipIndex) { if (tips == null || tipIndex < 0 || tipIndex >= tips.size()) return; final FullScreenTip tip = (FullScreenTip) tips.get(tipIndex); currentTipIndex = tipIndex; /* * set tip content */ contentView.scrollTo(0, 0); container.scrollTo(0, 0); contentView.loadUrl("file:///android_asset/tips/" + getDialog().getApp().getString(R.string.language_code) + "/" + tip.getId() + ".xhtml"); /* * update button visibility */ getDialog().getLeftButton().setEnabled(tipIndex > 0); getDialog().getRightButton().setEnabled(tipIndex < (tips.size() - 1)); getDialog().getMiddleButton().setEnabled(!unshownOnly || tipIndex == (tips.size() - 1)); /* * handle tip checkbox */ final int additionalCheckBoxTitleId = tip.getAdditionalCheckBoxTitleId(); if (additionalCheckBoxTitleId != 0) { additionalCheckBox.setText(additionalCheckBoxTitleId); additionalCheckBox.setChecked(tip.getAdditionalCheckBoxState()); } additionalCheckBox.setVisibility(additionalCheckBoxTitleId != 0 ? View.VISIBLE : View.GONE); /* * handle show auto check box */ autoShowCheckBoxContainer.setVisibility(unshownOnly || tip.forceAutomaticTipCheckBox() ? View.VISIBLE : View.GONE); /* * mark tip as shown */ getDialog().getApp().getTipManager().setTipShown(tip); } /* * action handling */ @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { switch (compoundButton.getId()) { case R.id.auto_show_tips: getDialog().getApp().getSettings().setAutoShowUsageTips(checked); break; case R.id.additional_tip_check_box: if (tips != null && currentTipIndex >= 0 && currentTipIndex < tips.size()) { ((FullScreenTip) tips.get(currentTipIndex)).onAdditionalCheckBoxStateChanged( getDialog().getApp(), checked); } break; default: // will not happen } } }