/**
** Copyright (c) 2010 Ushahidi Inc
** All rights reserved
** Contact: team@ushahidi.com
** Website: http://www.ushahidi.com
**
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: http://www.gnu.org/licenses/lgpl.html.
**
**
** If you have questions regarding the use of this file, please contact
** Ushahidi developers at team@ushahidi.com.
**
**/
package com.ushahidi.android.app;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.preference.CheckBoxPreference;
import android.preference.DialogPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceScreen;
import android.text.InputType;
import android.util.Log;
import com.ushahidi.android.app.ui.SeekBarPreference;
import com.ushahidi.android.app.util.ApiUtils;
import com.ushahidi.android.app.util.Util;
public class Settings extends PreferenceActivity implements OnSharedPreferenceChangeListener, OnPreferenceChangeListener {
private EditTextPreference firstNamePref;
private EditTextPreference lastNamePref;
private EditTextPreference emailAddressPref;
private EditTextPreference phoneNumberPref;
private CheckBoxPreference autoFetchCheckBoxPref;
private EditTextPreference gpsTimeoutPref;
private CheckBoxPreference vibrateCheckBoxPref;
private CheckBoxPreference ringtoneCheckBoxPref;
private CheckBoxPreference flashLedCheckBoxPref;
private DialogPreference clearCacheCheckBoxPref;
private ListPreference autoUpdateTimePref;
private ListPreference saveItemsPref;
private ListPreference totalReportsPref;
private SeekBarPreference photoSizePref;
private SharedPreferences settings;
private SharedPreferences.Editor editor;
private boolean validUrl = false;
private final Handler mHandler = new Handler();
public static final String AUTO_FETCH_PREFERENCE = "auto_fetch_preference";
public static final String SMS_PREFERENCE = "sms_preference";
public static final String VIBRATE_PREFERENCE = "vibrate_preference";
public static final String RINGTONE_PREFERENCE = "ringtone_preference";
public static final String FLASH_LED_PREFERENCE = "flash_led_preference";
public static final String USHAHIDI_DEPLOYMENT_PREFERENCE = "ushahidi_instance_preference";
public static final String EMAIL_ADDRESS_PREFERENCE = "email_address_preference";
public static final String PHONE_NUMBER_PREFERENCE = "phone_number_preference";
public static final String CHECKIN_PREFERENCE = "checkin_preference";
public static final String PHOTO_SIZE_PREFERENCE = "photo_size_preference";
private boolean checkin = false;
private String recentReports = "";
private String onPhone = "";
private String onSdCard = "";
private String minutes = "";
private static final String CLASS_TAG = Settings.class.getCanonicalName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
firstNamePref = new EditTextPreference(this);
lastNamePref = new EditTextPreference(this);
emailAddressPref = new EditTextPreference(this);
phoneNumberPref = new EditTextPreference(this);
autoFetchCheckBoxPref = new CheckBoxPreference(this);
vibrateCheckBoxPref = new CheckBoxPreference(this);
ringtoneCheckBoxPref = new CheckBoxPreference(this);
flashLedCheckBoxPref = new CheckBoxPreference(this);
photoSizePref = (SeekBarPreference)getPreferenceScreen().findPreference(
PHOTO_SIZE_PREFERENCE);
photoSizePref.setOnPreferenceChangeListener(this);
recentReports = getString(R.string.recent_reports);
onPhone = getString(R.string.on_phone);
onSdCard = getString(R.string.on_sd_card);
minutes = getString(R.string.minutes);
clearCacheCheckBoxPref = (DialogPreference)getPreferenceScreen().findPreference(
"clear_cache_preference");
autoUpdateTimePref = new ListPreference(this);
saveItemsPref = new ListPreference(this);
totalReportsPref = new ListPreference(this);
gpsTimeoutPref = new EditTextPreference(this);
new ListPreference(this);
setPreferenceScreen(createPreferenceHierarchy());
this.saveSettings();
}
private PreferenceScreen createPreferenceHierarchy() {
// ROOT element
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
// Basic preferences
PreferenceCategory basicPrefCat = new PreferenceCategory(this);
basicPrefCat.setTitle(R.string.basic_settings);
root.addPreference(basicPrefCat);
// Total reports to fetch at a time
// set list values
// TODO:// need to look it how to properly handle this. It looks ugly
// but it works.
CharSequence[] totalReportsEntries = {
"20 ".concat(recentReports), "40 ".concat(recentReports),
"60 ".concat(recentReports), "80 ".concat(recentReports),
"100 ".concat(recentReports), "250 ".concat(recentReports),
"500 ".concat(recentReports), "1000 ".concat(recentReports)
};
CharSequence[] totalReportsValues = {
"20", "40", "60", "80", "100", "250", "500", "1000"
};
totalReportsPref.setEntries(totalReportsEntries);
totalReportsPref.setEntryValues(totalReportsValues);
totalReportsPref.setDefaultValue(totalReportsValues[0]);
totalReportsPref.setDialogTitle(R.string.total_reports);
totalReportsPref.setKey("total_reports_preference");
totalReportsPref.setTitle(R.string.total_reports);
totalReportsPref.setSummary(R.string.hint_total_reports);
basicPrefCat.addPreference(totalReportsPref);
// First name entry field
firstNamePref.setDialogTitle(R.string.txt_first_name);
firstNamePref.setKey("first_name_preference");
firstNamePref.setTitle(R.string.txt_first_name);
firstNamePref.setSummary(R.string.hint_first_name);
firstNamePref.getEditText().setInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);
basicPrefCat.addPreference(firstNamePref);
// Last name entry field
lastNamePref.setDialogTitle(R.string.txt_last_name);
lastNamePref.setKey("last_name_preference");
lastNamePref.setTitle(R.string.txt_last_name);
lastNamePref.setSummary(R.string.hint_last_name);
lastNamePref.getEditText().setInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);
basicPrefCat.addPreference(lastNamePref);
// Email name entry field
emailAddressPref.setDialogTitle(R.string.txt_email);
emailAddressPref.setKey("email_address_preference");
emailAddressPref.setTitle(R.string.txt_email);
emailAddressPref.setSummary(R.string.hint_email);
emailAddressPref.getEditText().setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
basicPrefCat.addPreference(emailAddressPref);
// phone number entry field
phoneNumberPref.setDialogTitle(R.string.txt_phonenumber);
phoneNumberPref.setKey("phone_number_preference");
phoneNumberPref.setTitle(R.string.txt_phonenumber);
phoneNumberPref.setSummary(R.string.hint_phonenumber);
phoneNumberPref.getEditText().setInputType(InputType.TYPE_CLASS_PHONE);
/**
* Commenting out this code so it doesn't prompt users for opengeoSMS
* basicPrefCat.addPreference(phoneNumberPref);
* TODO:// re-enable this when I'm happy with opengeoSMS integration with
* the Ushahidi platform.
*/
// Photo resize seekbar
basicPrefCat.addPreference(photoSizePref);
// Advanced Preferences
PreferenceCategory advancedPrefCat = new PreferenceCategory(this);
advancedPrefCat.setTitle(R.string.advanced_settings);
root.addPreference(advancedPrefCat);
PreferenceScreen advancedScreenPref = getPreferenceManager().createPreferenceScreen(this);
advancedScreenPref.setKey("advanced_screen_preference");
advancedScreenPref.setTitle(R.string.advanced_settings);
advancedScreenPref.setSummary(R.string.hint_advanced_settings);
advancedPrefCat.addPreference(advancedScreenPref);
// Auto fetch reports
autoFetchCheckBoxPref.setKey("auto_fetch_preference");
autoFetchCheckBoxPref.setTitle(R.string.chk_auto_fetch);
autoFetchCheckBoxPref.setSummary(R.string.hint_auto_fetch);
advancedScreenPref.addPreference(autoFetchCheckBoxPref);
//gps timeout Preferences
gpsTimeoutPref.setDialogTitle(R.string.txt_gps_timeout);
gpsTimeoutPref.setKey("gps_timeout_preference");
gpsTimeoutPref.setTitle(R.string.txt_gps_timeout);
gpsTimeoutPref.setSummary(R.string.txt_gps_timeout_in_sec);
gpsTimeoutPref.setDefaultValue("60");
gpsTimeoutPref.getEditText().setInputType(InputType.TYPE_CLASS_PHONE);
advancedScreenPref.addPreference(gpsTimeoutPref);
// Auto update reports time interval
// set list values
CharSequence[] autoUpdateEntries = {
"5 ".concat(minutes), "10 ".concat(minutes), "15 ".concat(minutes),
"30 ".concat(minutes), "60 ".concat(minutes)
};
CharSequence[] autoUpdateValues = {
"0", "5", "10", "15", "30", "60"
};
autoUpdateTimePref.setEntries(autoUpdateEntries);
autoUpdateTimePref.setEntryValues(autoUpdateValues);
autoUpdateTimePref.setDefaultValue(autoUpdateValues[0]);
autoUpdateTimePref.setDialogTitle(R.string.txt_auto_update_delay);
autoUpdateTimePref.setKey("auto_update_time_preference");
autoUpdateTimePref.setTitle(R.string.txt_auto_update_delay);
autoUpdateTimePref.setSummary(R.string.hint_auto_update_delay);
advancedScreenPref.addPreference(autoUpdateTimePref);
// location of storage
// set list values
CharSequence[] saveItemsEntries = {
onPhone, onSdCard
};
CharSequence[] saveItemsValues = {
"phone", "card"
};
saveItemsPref.setEntries(saveItemsEntries);
saveItemsPref.setEntryValues(saveItemsValues);
saveItemsPref.setDefaultValue(saveItemsValues[0]);
saveItemsPref.setDialogTitle(R.string.option_location);
saveItemsPref.setKey("save_items_preference");
saveItemsPref.setTitle(R.string.option_location);
saveItemsPref.setSummary(R.string.hint_option_location);
advancedScreenPref.addPreference(saveItemsPref);
// clear cache
advancedScreenPref.addPreference(clearCacheCheckBoxPref);
// notification Preferences
PreferenceCategory notificationPrefCat = new PreferenceCategory(this);
notificationPrefCat.setTitle(R.string.bg_notification);
advancedScreenPref.addPreference(notificationPrefCat);
// vibrate
vibrateCheckBoxPref.setKey("vibrate_preference");
vibrateCheckBoxPref.setTitle(R.string.vibrate);
vibrateCheckBoxPref.setSummary(R.string.hint_vibrate);
notificationPrefCat.addPreference(vibrateCheckBoxPref);
// ringtone
ringtoneCheckBoxPref.setKey("ringtone_preference");
ringtoneCheckBoxPref.setTitle(R.string.ringtone);
ringtoneCheckBoxPref.setSummary(R.string.hint_ringtone);
notificationPrefCat.addPreference(ringtoneCheckBoxPref);
// flash led
flashLedCheckBoxPref.setKey("flash_led_preference");
flashLedCheckBoxPref.setTitle(R.string.flash_led);
flashLedCheckBoxPref.setSummary(R.string.hint_flash_led);
notificationPrefCat.addPreference(flashLedCheckBoxPref);
return root;
}
protected void saveSettings() {
settings = getSharedPreferences(Preferences.PREFS_NAME, 0);
editor = settings.edit();
String autoUpdate = autoUpdateTimePref.getValue();
String saveItems = saveItemsPref.getValue();
String totalReports = totalReportsPref.getValue();
String newSavePath;
int autoUdateDelay = 0;
// "5 Minutes", "10 Minutes", "15 Minutes", "c", "60 Minutes"
if (autoUpdate.matches("5")) {
autoUdateDelay = 5;
} else if (autoUpdate.matches("10")) {
autoUdateDelay = 10;
} else if (autoUpdate.matches("15")) {
autoUdateDelay = 15;
} else if (autoUpdate.matches("30")) {
autoUdateDelay = 30;
} else if (autoUpdate.matches("60")) {
autoUdateDelay = 60;
}
if (saveItems.equalsIgnoreCase("phone")) {
newSavePath = this.getDir("", MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE).toString() + "/";
} else { // means on sd is checked
newSavePath = Environment.getExternalStorageDirectory().toString() + "ushahidi/";
}
editor.putString("Domain", Preferences.domain);
editor.putString("Firstname", firstNamePref.getText());
editor.putString("Lastname", lastNamePref.getText());
editor.putString("Email", emailAddressPref.getText());
editor.putString("Phonenumber", phoneNumberPref.getText());
editor.putString("savePath", newSavePath);
editor.putInt("AutoUpdateDelay", autoUdateDelay);
editor.putBoolean("AutoFetch", autoFetchCheckBoxPref.isChecked());
editor.putString("TotalReports", totalReports);
editor.putInt("CheckinEnabled", Preferences.isCheckinEnabled);
editor.putString("gps_timeout_preference", gpsTimeoutPref.getText());
editor.commit();
}
@Override
protected void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
this.saveSettings();
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
this);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
// Let's do something when a preference value changes
if (sharedPreferences.getBoolean(AUTO_FETCH_PREFERENCE, false)) {
// Enable background service.
startService(new Intent(Settings.this, BackgroundService.class));
} else {
stopService(new Intent(Settings.this, BackgroundService.class));
}
// Reset vibrate
if (sharedPreferences.getBoolean(VIBRATE_PREFERENCE, false)) {
Preferences.vibrate = true;
} else {
Preferences.vibrate = false;
}
// Reset ringtone
if (sharedPreferences.getBoolean(RINGTONE_PREFERENCE, false)) {
Preferences.ringtone = true;
} else {
Preferences.ringtone = false;
}
// Reset flash led
if (sharedPreferences.getBoolean(FLASH_LED_PREFERENCE, false)) {
Preferences.flashLed = true;
} else {
Preferences.flashLed = false;
}
// cache
if (key.equals(USHAHIDI_DEPLOYMENT_PREFERENCE)) {
if (!sharedPreferences.getString(USHAHIDI_DEPLOYMENT_PREFERENCE, "").equals(
Preferences.domain)) {
validateUrl(sharedPreferences.getString(USHAHIDI_DEPLOYMENT_PREFERENCE, ""));
}
}
/* //photo size
if (key.equals(PHOTO_SIZE_PREFERENCE)) {
int size = sharedPreferences.getInt(PHOTO_SIZE_PREFERENCE, 200);
Log.d(CLASS_TAG, "Photo Size: "+size+", Preferences.photoWidth: "+Preferences.photoWidth);
if (size > Preferences.photoWidth) {
//Preferences.photoWidth = size;
}
}*/
// validate email address
if (key.equals(EMAIL_ADDRESS_PREFERENCE)) {
if (!Util.validateEmail(sharedPreferences.getString(EMAIL_ADDRESS_PREFERENCE, ""))) {
Util.showToast(this, R.string.invalid_email_address);
}
}
// save changes
this.saveSettings();
}
// thread class
private class ReportsTask extends AsyncTask<Void, Void, Integer> {
protected Integer status;
private ProgressDialog dialog;
protected Context appContext;
@Override
protected void onPreExecute() {
Preferences.loadSettings(appContext);
this.dialog = ProgressDialog.show(appContext, getString(R.string.please_wait),
getString(R.string.fetching_new_reports), true);
}
@Override
protected Integer doInBackground(Void... params) {
// clear previous data
MainApplication.mDb.clearData();
status = ApiUtils.processReports(appContext);
isCheckinsEnabled();
return status;
}
@Override
protected void onPostExecute(Integer result) {
if (result == 4) {
Util.showToast(appContext, R.string.internet_connection);
} else if (result == 3) {
Util.showToast(appContext, R.string.invalid_ushahidi_instance);
} else if (result == 2) {
Util.showToast(appContext, R.string.could_not_fetch_reports);
} else if (result == 1) {
Util.showToast(appContext, R.string.could_not_fetch_reports);
} else {
Util.showToast(appContext, R.string.reports_successfully_fetched);
}
this.dialog.cancel();
}
}
/**
* Create runnable for validating callback URL.
*/
Runnable mValidateUrl = new Runnable() {
public void run() {
if (!validUrl) {
// reset whatever was entered in that field.
Preferences.loadSettings(Settings.this);
Util.showToast(Settings.this, R.string.invalid_ushahidi_instance);
} else {
ReportsTask reportsTask = new ReportsTask();
reportsTask.appContext = Settings.this;
reportsTask.execute();
}
}
};
/**
* Create a child thread and validate the callback URL in it when enabling
*
* @param String Url - The Callback Url to be validated.
* @return void
*/
public void validateUrl(final String Url) {
Thread t = new Thread() {
public void run() {
validUrl = ApiUtils.validateUshahidiInstance(Url);
mHandler.post(mValidateUrl);
}
};
t.start();
}
Runnable mIsCheckinsEnabled = new Runnable() {
public void run() {
if (checkin) {
Preferences.isCheckinEnabled = 1;
} else {
Preferences.isCheckinEnabled = 0;
}
Preferences.saveSettings(Settings.this);
}
};
/**
* Checks if checkins is enabled on the configured Ushahidi deployment.
*/
public void isCheckinsEnabled() {
if (ApiUtils.isCheckinEnabled(Settings.this)) {
Preferences.isCheckinEnabled = 1;
} else {
Preferences.isCheckinEnabled = 0;
}
Preferences.saveSettings(Settings.this);
}
public boolean onPreferenceChange(Preference preference, Object newValue) {
if(preference.getKey().equalsIgnoreCase(PHOTO_SIZE_PREFERENCE)){
Log.d(CLASS_TAG, "Preferences.photoWidth: "+newValue);
Preferences.photoWidth = (Integer) newValue;
editor.putInt("PhotoWidth", Preferences.photoWidth);
editor.commit();
}
return true;
}
}