package org.commcare.activities; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Build; import android.os.Bundle; import android.preference.Preference; import android.view.MenuItem; import org.commcare.AppUtils; import org.commcare.CommCareApplication; import org.commcare.dalvik.R; import org.commcare.google.services.analytics.GoogleAnalyticsFields; import org.commcare.google.services.analytics.GoogleAnalyticsUtils; import org.commcare.preferences.CommCarePreferences; import org.commcare.preferences.DevSessionRestorer; import org.commcare.tasks.DumpTask; import org.commcare.tasks.SendTask; import org.commcare.tasks.WipeTask; import org.commcare.utils.CommCareUtil; import org.commcare.utils.StringUtils; import org.commcare.views.dialogs.StandardAlertDialog; import org.javarosa.core.services.locale.Localization; import java.util.HashMap; import java.util.Map; /** * Menu for launching advanced CommCare actions * * @author Phillip Mates (pmates@dimagi.com) */ public class AdvancedActionsActivity extends SessionAwarePreferenceActivity { private final static String WIFI_DIRECT = "wifi-direct"; private final static String DUMP_FORMS = "manage-sd-card"; private final static String REPORT_PROBLEM = "report-problem"; private final static String FORCE_LOG_SUBMIT = "force-log-submit"; private final static String VALIDATE_MEDIA = "validate-media"; private final static String CONNECTION_TEST = "connection-test"; private final static String RECOVERY_MODE = "recovery-mode"; private final static String CLEAR_USER_DATA = "clear-user-data"; private final static String CLEAR_SAVED_SESSION = "clear-saved-session"; private final static int WIFI_DIRECT_ACTIVITY = 1; private final static int DUMP_FORMS_ACTIVITY = 2; private final static int REPORT_PROBLEM_ACTIVITY = 3; private final static int VALIDATE_MEDIA_ACTIVITY = 4; public final static int RESULT_DATA_RESET = HomeScreenBaseActivity.RESULT_RESTART + 1; public final static int RESULT_FORMS_PROCESSED = HomeScreenBaseActivity.RESULT_RESTART + 2; public final static String FORM_PROCESS_COUNT_KEY = "forms-processed-count"; public final static String FORM_PROCESS_MESSAGE_KEY = "forms-processed-message"; static final String KEY_NUMBER_DUMPED = "num_dumped"; private final static Map<String, String> keyToTitleMap = new HashMap<>(); static { keyToTitleMap.put(REPORT_PROBLEM, "problem.report.menuitem"); keyToTitleMap.put(VALIDATE_MEDIA, "home.menu.validate"); keyToTitleMap.put(WIFI_DIRECT, "home.menu.wifi.direct"); keyToTitleMap.put(DUMP_FORMS, "home.menu.formdump"); keyToTitleMap.put(CONNECTION_TEST, "home.menu.connection.diagnostic"); keyToTitleMap.put(CLEAR_USER_DATA, "clear.user.data"); keyToTitleMap.put(FORCE_LOG_SUBMIT, "force.log.submit"); keyToTitleMap.put(RECOVERY_MODE, "recovery.mode"); keyToTitleMap.put(CLEAR_SAVED_SESSION, "menu.clear.saved.session"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.advanced_actions); GoogleAnalyticsUtils.reportPrefActivityEntry(GoogleAnalyticsFields.CATEGORY_ADVANCED_ACTIONS); setupUI(); } private void setupUI() { setTitle(Localization.get("settings.advanced.title")); CommCarePreferences.addBackButtonToActionBar(this); CommCarePreferences.setupLocalizedText(this, keyToTitleMap); setupButtons(); } private void setupButtons() { Preference serverSettingsButton = findPreference(REPORT_PROBLEM); serverSettingsButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_REPORT_PROBLEM); startReportActivity(); return true; } }); Preference validateMediaButton = findPreference(VALIDATE_MEDIA); validateMediaButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_VALIDATE_MEDIA); startValidationActivity(); return true; } }); Preference wifiDirectButton = findPreference(WIFI_DIRECT); if (hasP2p()) { wifiDirectButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_WIFI_DIRECT); startWifiDirect(); return true; } }); } else { getPreferenceScreen().removePreference(wifiDirectButton); } Preference dumpFormsButton = findPreference(DUMP_FORMS); dumpFormsButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_MANAGE_SD); startFormDump(); return true; } }); Preference connectionTestButton = findPreference(CONNECTION_TEST); connectionTestButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_CONNECTION_TEST); startConnectionTest(); return true; } }); Preference clearDataButton = findPreference(CLEAR_USER_DATA); clearDataButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_CLEAR_USER_DATA); clearUserData(AdvancedActionsActivity.this); return true; } }); Preference clearSavedSessionButton = findPreference(CLEAR_SAVED_SESSION); if (DevSessionRestorer.savedSessionPresent()) { clearSavedSessionButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_CLEAR_SAVED_SESSION); DevSessionRestorer.clearSession(); return true; } }); } else { getPreferenceScreen().removePreference(clearSavedSessionButton); } Preference forceSubmitButton = findPreference(FORCE_LOG_SUBMIT); forceSubmitButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_FORCE_LOG_SUBMISSION); CommCareUtil.triggerLogSubmission(AdvancedActionsActivity.this); return true; } }); Preference recoveryModeButton = findPreference(RECOVERY_MODE); recoveryModeButton.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { GoogleAnalyticsUtils.reportAdvancedActionItemClick(GoogleAnalyticsFields.ACTION_RECOVERY_MODE); startRecoveryMode(); return true; } }); } private void startReportActivity() { Intent i = new Intent(this, ReportProblemActivity.class); startActivityForResult(i, REPORT_PROBLEM_ACTIVITY); } private void startValidationActivity() { Intent i = new Intent(this, CommCareVerificationActivity.class); i.putExtra(CommCareVerificationActivity.KEY_LAUNCH_FROM_SETTINGS, true); startActivityForResult(i, VALIDATE_MEDIA_ACTIVITY); } private void startWifiDirect() { Intent i = new Intent(this, CommCareWiFiDirectActivity.class); startActivityForResult(i, WIFI_DIRECT_ACTIVITY); } private void startFormDump() { Intent i = new Intent(this, CommCareFormDumpActivity.class); i.putExtra(CommCareFormDumpActivity.EXTRA_FILE_DESTINATION, CommCareApplication.instance().getCurrentApp().storageRoot()); startActivityForResult(i, DUMP_FORMS_ACTIVITY); } private void startRecoveryMode() { Intent i = new Intent(this, RecoveryActivity.class); this.startActivity(i); } private boolean hasP2p() { return Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH && getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_DIRECT); } private void startConnectionTest() { Intent i = new Intent(this, ConnectionDiagnosticActivity.class); startActivity(i); } public static void clearUserData(final Activity activity) { StandardAlertDialog d = new StandardAlertDialog(activity, Localization.get("clear.user.data.warning.title"), Localization.get("clear.user.data.warning.message")); DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (which == AlertDialog.BUTTON_POSITIVE) { AppUtils.clearUserData(); activity.setResult(RESULT_DATA_RESET); activity.finish(); } dialog.dismiss(); } }; d.setPositiveButton(StringUtils.getStringRobust(activity, R.string.ok), listener); d.setNegativeButton(StringUtils.getStringRobust(activity, R.string.cancel), listener); d.showNonPersistentDialog(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == REPORT_PROBLEM_ACTIVITY || requestCode == VALIDATE_MEDIA_ACTIVITY) { finish(); } else if (requestCode == WIFI_DIRECT_ACTIVITY || requestCode == DUMP_FORMS_ACTIVITY) { String messageKey = getBulkFormMessageKey(resultCode); if (messageKey == null) { return; } int dumpedCount = intent.getIntExtra(KEY_NUMBER_DUMPED, -1); Intent returnIntent = new Intent(); returnIntent.putExtra(FORM_PROCESS_COUNT_KEY, dumpedCount); returnIntent.putExtra(FORM_PROCESS_MESSAGE_KEY, messageKey); setResult(RESULT_FORMS_PROCESSED, returnIntent); finish(); } } private static String getBulkFormMessageKey(int resultCode) { if (resultCode == DumpTask.BULK_DUMP_ID) { return "bulk.form.dump.success"; } else if (resultCode == SendTask.BULK_SEND_ID || resultCode == WipeTask.WIPE_TASK_ID || resultCode == SendTask.BULK_SEND_ID) { return "bulk.form.send.success"; } else { return null; } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } }