/**
*
*/
package org.commcare.android.models.notifications;
import java.util.Date;
import org.javarosa.core.services.locale.Localization;
import org.javarosa.core.util.NoLocalizedTextException;
/**
* Static holder for generating notification messages which are common
* to the application.
*
* Possibly implementation should be replaced in the future with some
* sort of external data source, but doesn't seem likely.
*
* @author ctsims
*
*/
public class NotificationMessageFactory {
//TODO: Move these to an enum for the task that they represent the return state of
public enum StockMessages implements MessageTag {
/** The user's credentials weren't accepted on the server **/
Auth_BadCredentials ("login.attempt.fail.auth"),
/** The user's username/password has changed remotely on the server, but
* is are correct on the phone. **/
Auth_RemoteCredentialsChanged ("login.attempt.fail.changed"),
/** The restore data sent down a password that was different than the one used
* to authenticate
*/
Auth_CredentialMismatch ("notification.credential.mismatch"),
/**
* Server 500 when retrieving data.
*/
Restore_RemoteError ("notification.restore.remote.error"),
/** The phone had a problem parsing the data from the server **/
Remote_BadRestore ("notification.restore.baddata"),
/** No network connectivity **/
Remote_NoNetwork ("notification.restore.nonetwork"),
/** Generic 500 error **/
Remote_ServerError ("notification.server.error"),
/** Network timed out **/
Remote_Timeout ("notification.network.timeout"),
/**Unknown error during restore **/
Restore_Unknown ("notification.restore.unknown"),
/**Could not retrieve Form Result **/
FormEntry_Unretrievable ("notification.formentry.unretrievable"),
/**In airplane mode while trying to sync**/
Sync_AirplaneMode("notification.sync.airplane"),
/**No connections while trying to sync **/
Sync_NoConnections("notification.sync.connections"),
/**One of your files on the SD was bad**/
Send_MalformedFile("notification.send.malformed"),
/** Your case fitler does not match the data type **/
Bad_Case_Filter("notification.case.filter"),
/** Your archive is not on the local filesystem **/
Bad_Archive_File("notification.install.badarchive"),
/**Bad SSL Certificate **/
BadSSLCertificate("notification.bad.certificate");
StockMessages(String root) {this.root = root;}
private final String root;
public String getLocaleKeyBase() { return root;}
public String getCategory() { return "stock"; }
}
public static NotificationMessage message(MessageTag message) {
return message(message, new String[3]);
}
public static NotificationMessage message(MessageTag message, String customCategory){
return message(message, new String[3], customCategory);
}
public static NotificationMessage message(MessageTag message, String[] parameters) {
return message(message, parameters, message.getCategory());
}
public static NotificationMessage message(MessageTag message, String[] parameters, String customCategory) {
String base = message.getLocaleKeyBase();
if(base == null) { throw new NullPointerException("No Locale Key base for message tag!"); }
try {
String title = parameters[0] == null ? Localization.get(base + ".title") : Localization.get(base + ".title", new String[] {parameters[0]});
String detail = parameters[1] == null ? Localization.get(base + ".detail") : Localization.get(base + ".detail", new String[] {parameters[1]});
String action = null;
try {
action = parameters[2] == null ? Localization.get(base + ".action") : Localization.get(base + ".action", new String[] {parameters[2]});
}catch(Exception e) {
//No big deal, key doesn't need to exist
}
return new NotificationMessage(customCategory,title, detail, action, new Date());
}
//TODO: Release v. debug mode for these?
catch (NoLocalizedTextException e) {
throw new NoLocalizedTextException("Notification Message with base " + base + " is underdefined. It does not contain the minimum set of a .title and .detail definition", e.getMissingKeyNames(), e.getLocaleMissingKey());
}
catch (Exception e) {
//Other exceptions are bad, but we don't want to crash on them
e.printStackTrace();
return new NotificationMessage("system", "Bad Locale Message", "Error getting locale message for base " + message.getLocaleKeyBase(), null, new Date());
}
}
}