package org.adaptlab.chpir.android.survey.Rules; import java.util.ArrayList; import org.adaptlab.chpir.android.survey.Rules.RuleCallback; import android.content.Context; import android.widget.Toast; public class RuleBuilder { private Context mContext; private ArrayList<PassableRule> mRules; private RuleCallback mRuleCallback; private boolean mShowToastOnFailure; private boolean mPassesRules; public RuleBuilder(Context context) { mContext = context; mRules = new ArrayList<PassableRule>(); mShowToastOnFailure = false; mPassesRules = false; } /* * Add an instance of a rule to this builder. Its rulePasses() * method will be evoked when checkRules() is called. If any rule fails, * then this RuleBuilder will fail; causing mPassesRule to be false and * the onRulesFail callback to be called (if callbacks have been set). */ public RuleBuilder addRule(PassableRule rule) { this.mRules.add(rule); return this; } /* * Failure callback is called immediately if a rule fails. * Success callback is called only after all rules pass. * * Callbacks are not required. */ public RuleBuilder setCallbacks(RuleCallback ruleCallback) { this.mRuleCallback = ruleCallback; return this; } /* * Show a long toast with the message set to the failure message * of the rule on failure. */ public RuleBuilder showToastOnFailure(boolean showToast) { this.mShowToastOnFailure = showToast; return this; } /* * Iterate all passable rules and ensure that they pass their rule. * * Return immediately if not, showing a toast with the failure message of the rule and calling * the failure callback if set. */ public RuleBuilder checkRules() { for (PassableRule rule : mRules) { if (!rule.passesRule()) { if (mShowToastOnFailure) Toast.makeText(mContext, rule.getFailureMessage(), Toast.LENGTH_LONG).show(); if (mRuleCallback != null) mRuleCallback.onRulesFail(); mPassesRules = false; return this; } } if (mRuleCallback != null) mRuleCallback.onRulesPass(); mPassesRules = true; return this; } public boolean getResult() { return mPassesRules; } }