package org.commcare.activities;
import android.content.Context;
import android.content.Intent;
import android.text.Spannable;
import android.view.View;
import org.commcare.adapters.HomeCardDisplayData;
import org.commcare.adapters.SquareButtonViewHolder;
import org.commcare.dalvik.R;
import org.commcare.google.services.analytics.GoogleAnalyticsFields;
import org.commcare.google.services.analytics.GoogleAnalyticsUtils;
import org.commcare.utils.SessionUnavailableException;
import org.commcare.utils.StorageUtils;
import org.commcare.utils.SyncDetailCalculations;
import org.javarosa.core.services.locale.Localization;
import java.util.Vector;
/**
* Build objects that contain all info needed to draw home screen buttons
*
* @author Phillip Mates (pmates@dimagi.com).
*/
public class HomeButtons {
private final static String[] buttonNames =
new String[]{"start", "saved", "incomplete", "sync", "report", "logout"};
public static HomeCardDisplayData[] buildButtonData(StandardHomeActivity activity,
Vector<String> buttonsToHide,
boolean isDemoUser) {
String syncKey, homeMessageKey, logoutMessageKey;
if (!isDemoUser) {
homeMessageKey = "home.start";
syncKey = "home.sync";
logoutMessageKey = "home.logout";
} else {
syncKey = "home.sync.demo";
homeMessageKey = "home.start.demo";
logoutMessageKey = "home.logout.demo";
}
HomeCardDisplayData[] allButtons = new HomeCardDisplayData[]{
HomeCardDisplayData.homeCardDataWithStaticText(Localization.get(homeMessageKey),
R.color.white,
R.drawable.home_start,
R.color.cc_attention_positive_color,
getStartButtonListener(activity)),
HomeCardDisplayData.homeCardDataWithStaticText(Localization.get("home.forms.saved"),
R.color.white,
R.drawable.home_saved,
R.color.cc_light_cool_accent_color,
getViewOldFormsListener(activity)),
HomeCardDisplayData.homeCardDataWithDynamicText(Localization.get("home.forms.incomplete"), R.color.white,
R.drawable.home_incomplete,
R.color.solid_dark_orange,
getIncompleteButtonListener(activity),
getIncompleteButtonTextSetter(activity)),
HomeCardDisplayData.homeCardDataWithNotification(Localization.get(syncKey), R.color.white,
R.color.white,
R.drawable.home_sync,
R.color.cc_brand_color,
R.color.cc_brand_text,
getSyncButtonListener(activity),
getSyncButtonTextSetter(activity)),
HomeCardDisplayData.homeCardDataWithStaticText(Localization.get("home.report"), R.color.white,
R.drawable.home_report, R.color.cc_attention_negative_color,
getReportButtonListener(activity)),
HomeCardDisplayData.homeCardDataWithNotification(Localization.get(logoutMessageKey), R.color.white,
R.color.white,
R.drawable.home_logout, R.color.cc_neutral_color, R.color.cc_neutral_text,
getLogoutButtonListener(activity),
getLogoutButtonTextSetter(activity)),
};
return getVisibleButtons(allButtons, buttonsToHide);
}
private static HomeCardDisplayData[] getVisibleButtons(HomeCardDisplayData[] allButtons,
Vector<String> buttonsToHide) {
int visibleButtonCount = buttonNames.length - buttonsToHide.size();
HomeCardDisplayData[] buttons = new HomeCardDisplayData[visibleButtonCount];
int visibleIndex = 0;
for (int i = 0; i < buttonNames.length; i++) {
if (!buttonsToHide.contains(buttonNames[i])) {
buttons[visibleIndex] = allButtons[i];
visibleIndex++;
}
}
return buttons;
}
private static View.OnClickListener getViewOldFormsListener(final StandardHomeActivity activity) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
reportButtonClick(GoogleAnalyticsFields.LABEL_SAVED_FORMS_BUTTON);
activity.goToFormArchive(false);
}
};
}
private static View.OnClickListener getSyncButtonListener(final StandardHomeActivity activity) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
reportButtonClick(GoogleAnalyticsFields.LABEL_SYNC_BUTTON);
activity.syncButtonPressed();
}
};
}
private static TextSetter getSyncButtonTextSetter(final StandardHomeActivity activity) {
return new TextSetter() {
@Override
public void update(HomeCardDisplayData cardDisplayData,
SquareButtonViewHolder squareButtonViewHolder,
Context context,
String notificationText) {
if (notificationText != null) {
squareButtonViewHolder.subTextView.setText(notificationText);
squareButtonViewHolder.subTextView.setTextColor(activity.getResources().getColor(cardDisplayData.subTextColor));
} else {
SyncDetailCalculations.updateSubText(activity, squareButtonViewHolder, cardDisplayData);
}
squareButtonViewHolder.subTextView.setBackgroundColor(activity.getResources().getColor(cardDisplayData.subTextBgColor));
squareButtonViewHolder.textView.setTextColor(context.getResources().getColor(cardDisplayData.textColor));
squareButtonViewHolder.textView.setText(cardDisplayData.text);
}
};
}
private static View.OnClickListener getStartButtonListener(final StandardHomeActivity activity) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
reportButtonClick(GoogleAnalyticsFields.LABEL_START_BUTTON);
activity.enterRootModule();
}
};
}
private static View.OnClickListener getIncompleteButtonListener(final StandardHomeActivity activity) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
reportButtonClick(GoogleAnalyticsFields.LABEL_INCOMPLETE_FORMS_BUTTON);
activity.goToFormArchive(true);
}
};
}
private static TextSetter getIncompleteButtonTextSetter(final StandardHomeActivity activity) {
return new TextSetter() {
@Override
public void update(HomeCardDisplayData cardDisplayData,
SquareButtonViewHolder squareButtonViewHolder,
Context context,
String notificationText) {
int numIncompleteForms;
try {
numIncompleteForms = StorageUtils.getNumIncompleteForms();
} catch (SessionUnavailableException e) {
// stop button setup, since redirection to login is imminent
return;
}
if (numIncompleteForms > 0) {
Spannable incompleteIndicator =
(activity.localize("home.forms.incomplete.indicator",
new String[]{String.valueOf(numIncompleteForms),
Localization.get("home.forms.incomplete")}));
squareButtonViewHolder.textView.setText(incompleteIndicator);
} else {
squareButtonViewHolder.textView.setText(activity.localize("home.forms.incomplete"));
}
squareButtonViewHolder.textView.setTextColor(context.getResources()
.getColor(cardDisplayData.textColor));
squareButtonViewHolder.subTextView.setVisibility(View.GONE);
}
};
}
private static View.OnClickListener getLogoutButtonListener(final StandardHomeActivity activity) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
reportButtonClick(GoogleAnalyticsFields.LABEL_LOGOUT_BUTTON);
activity.userTriggeredLogout();
}
};
}
private static TextSetter getLogoutButtonTextSetter(final StandardHomeActivity activity) {
return new TextSetter() {
@Override
public void update(HomeCardDisplayData cardDisplayData,
SquareButtonViewHolder squareButtonViewHolder,
Context context,
String notificationText) {
squareButtonViewHolder.textView.setText(cardDisplayData.text);
squareButtonViewHolder.textView.setTextColor(context.getResources().getColor(cardDisplayData.textColor));
squareButtonViewHolder.subTextView.setText(activity.getActivityTitle());
squareButtonViewHolder.subTextView.setTextColor(context.getResources().getColor(cardDisplayData.subTextColor));
squareButtonViewHolder.subTextView.setBackgroundColor(activity.getResources().getColor(cardDisplayData.subTextBgColor));
}
};
}
private static View.OnClickListener getReportButtonListener(final StandardHomeActivity activity) {
return new View.OnClickListener() {
@Override
public void onClick(View v) {
reportButtonClick(GoogleAnalyticsFields.LABEL_REPORT_BUTTON);
Intent i = new Intent(activity, ReportProblemActivity.class);
activity.startActivity(i);
}
};
}
private static void reportButtonClick(String buttonLabel) {
GoogleAnalyticsUtils.reportHomeButtonClick(buttonLabel);
}
public interface TextSetter {
/**
* Set view holder's text and subtext either from provided display
* data, notification text argument, or auxiliary computations
*
* @param notificationText Optional text which will always be used when provided
*/
void update(HomeCardDisplayData cardDisplayData,
SquareButtonViewHolder squareButtonViewHolder,
Context context,
String notificationText);
}
}