Split into library project and add shared preferences layer of indirection.

This commit is contained in:
Moxie Marlinspike
2013-07-09 18:26:18 -07:00
parent 2539723410
commit 21eee19380
22 changed files with 277 additions and 87 deletions

View File

@@ -89,6 +89,7 @@ import org.thoughtcrime.securesms.util.DynamicTheme;
import org.thoughtcrime.securesms.util.EncryptedCharacterCalculator;
import org.thoughtcrime.securesms.util.InvalidMessageException;
import org.thoughtcrime.securesms.util.MemoryCleaner;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import java.io.IOException;
@@ -599,9 +600,7 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi
}
private void initializeIme() {
if (PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(ApplicationPreferencesActivity.ENTER_PRESENT_PREF, false))
{
if (TextSecurePreferences.isEnterImeKeyEnabled(this)) {
composeText.setInputType(composeText.getInputType() & (~InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
} else {
composeText.setInputType(composeText.getInputType() | (InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
@@ -852,7 +851,7 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi
if (rawText.length() < 1 && !attachmentManager.isAttachmentPresent())
throw new InvalidMessageException(getString(R.string.ConversationActivity_message_is_empty_exclamation));
if (!isEncryptedConversation && Tag.isTaggable(this, rawText))
if (!isEncryptedConversation && Tag.isTaggable(rawText))
rawText = Tag.getTaggedMessage(rawText);
return rawText;
@@ -1002,9 +1001,7 @@ public class ConversationActivity extends PassphraseRequiredSherlockFragmentActi
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_ENTER) {
if (PreferenceManager.getDefaultSharedPreferences(ConversationActivity.this)
.getBoolean(ApplicationPreferencesActivity.ENTER_SENDS_PREF, false))
{
if (TextSecurePreferences.isEnterSendsEnabled(ConversationActivity.this)) {
sendButton.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
sendButton.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER));
return true;

View File

@@ -30,6 +30,7 @@ import org.thoughtcrime.securesms.crypto.InvalidPassphraseException;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
import org.thoughtcrime.securesms.util.MemoryCleaner;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
/**
* Activity for changing a user's local encryption passphrase.
@@ -67,7 +68,7 @@ public class PassphraseChangeActivity extends PassphraseActivity {
this.okButton.setOnClickListener(new OkButtonClickListener());
this.cancelButton.setOnClickListener(new CancelButtonClickListener());
if (isPassphraseDisabled()) {
if (TextSecurePreferences.isPasswordDisabled(this)) {
this.originalPassphrase.setVisibility(View.GONE);
this.originalPassphraseLabel.setVisibility(View.GONE);
} else {
@@ -85,7 +86,7 @@ public class PassphraseChangeActivity extends PassphraseActivity {
String passphrase = (newText == null ? "" : newText.toString());
String passphraseRepeat = (repeatText == null ? "" : repeatText.toString());
if (isPassphraseDisabled()) {
if (TextSecurePreferences.isPasswordDisabled(this)) {
original = MasterSecretUtil.UNENCRYPTED_PASSPHRASE;
}
@@ -98,11 +99,7 @@ public class PassphraseChangeActivity extends PassphraseActivity {
this.repeatPassphrase.setText("");
} else {
MasterSecret masterSecret = MasterSecretUtil.changeMasterSecretPassphrase(this, original, passphrase);
PreferenceManager.getDefaultSharedPreferences(this)
.edit()
.putBoolean(ApplicationPreferencesActivity.DISABLE_PASSPHRASE_PREF, false)
.commit();
TextSecurePreferences.setPasswordDisabled(this, false);
MemoryCleaner.clean(original);
MemoryCleaner.clean(passphrase);
@@ -117,11 +114,6 @@ public class PassphraseChangeActivity extends PassphraseActivity {
}
}
private boolean isPassphraseDisabled() {
return PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(ApplicationPreferencesActivity.DISABLE_PASSPHRASE_PREF, false);
}
private class CancelButtonClickListener implements OnClickListener {
public void onClick(View v) {
finish();

View File

@@ -24,8 +24,8 @@ import com.google.i18n.phonenumbers.AsYouTypeFormatter;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;
import org.thoughtcrime.securesms.util.PhoneNumberFormatter;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
/**
* The register account activity. Begins the account registration process.

View File

@@ -32,8 +32,8 @@ import com.actionbarsherlock.app.SherlockActivity;
import org.thoughtcrime.securesms.gcm.PushServiceSocket;
import org.thoughtcrime.securesms.gcm.RateLimitException;
import org.thoughtcrime.securesms.service.RegistrationService;
import org.thoughtcrime.securesms.util.PhoneNumberFormatter;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
import java.io.IOException;

View File

@@ -12,6 +12,7 @@ import android.provider.ContactsContract.RawContacts;
import android.telephony.TelephonyManager;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import java.util.ArrayList;
import java.util.List;
@@ -24,14 +25,10 @@ class ContactIdentityManagerGingerbread extends ContactIdentityManager {
@Override
public Uri getSelfIdentityUri() {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String contactUriString = preferences.getString(ApplicationPreferencesActivity.IDENTITY_PREF, null);
String contactUriString = TextSecurePreferences.getIdentityContactUri(context);
if (hasLocalNumber()) {
return getContactUriForNumber(getLocalNumber());
} else if (contactUriString != null) {
return Uri.parse(contactUriString);
}
if (hasLocalNumber()) return getContactUriForNumber(getLocalNumber());
else if (contactUriString != null) return Uri.parse(contactUriString);
return null;
}

View File

@@ -35,6 +35,7 @@ import org.thoughtcrime.securesms.recipients.RecipientFormattingException;
import org.thoughtcrime.securesms.recipients.Recipients;
import org.thoughtcrime.securesms.sms.SmsTransportDetails;
import org.thoughtcrime.securesms.util.Hex;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.WorkerThread;
import java.io.IOException;
@@ -309,9 +310,7 @@ public class DecryptingQueue {
}
private void handleKeyExchangeProcessing(String plaintxtBody) {
if (PreferenceManager.getDefaultSharedPreferences(context)
.getBoolean(ApplicationPreferencesActivity.AUTO_KEY_EXCHANGE_PREF, true))
{
if (TextSecurePreferences.isAutoRespondKeyExchangeEnabled(context)) {
try {
Recipient recipient = new Recipient(null, originator, null, null);
KeyExchangeMessage keyExchangeMessage = new KeyExchangeMessage(plaintxtBody);

View File

@@ -13,7 +13,7 @@ import android.support.v4.content.AsyncTaskLoader;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import org.thoughtcrime.securesms.util.PhoneNumberFormatter;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
public class CountryListLoader extends AsyncTaskLoader<ArrayList<Map<String, String>>> {

View File

@@ -23,7 +23,9 @@ import android.util.Log;
import com.google.thoughtcrimegson.Gson;
import com.google.thoughtcrimegson.JsonParseException;
import com.google.thoughtcrimegson.annotations.SerializedName;
import org.thoughtcrime.securesms.util.PhoneNumberFormatter;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
import java.io.BufferedReader;
import java.io.File;
@@ -75,7 +77,10 @@ public class NumberFilter {
if (bloomFilter == null) return false;
else if (number == null || number.length() == 0) return false;
return new BloomFilter(bloomFilter, hashCount).contains(PhoneNumberFormatter.formatNumber(context, number));
String localNumber = TextSecurePreferences.getLocalNumber(context);
return new BloomFilter(bloomFilter, hashCount)
.contains(PhoneNumberFormatter.formatNumber(number, localNumber));
} catch (IOException ioe) {
Log.w("NumberFilter", ioe);
return false;

View File

@@ -12,6 +12,7 @@ import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.service.RegistrationService;
import org.thoughtcrime.securesms.service.SendReceiveService;
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import java.io.IOException;
@@ -76,9 +77,8 @@ public class GcmIntentService extends GCMBaseIntentService {
}
private PushServiceSocket getGcmSocket(Context context) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String localNumber = preferences.getString(ApplicationPreferencesActivity.LOCAL_NUMBER_PREF, null);
String password = preferences.getString(ApplicationPreferencesActivity.GCM_PASSWORD_PREF, null);
String localNumber = TextSecurePreferences.getLocalNumber(context);
String password = TextSecurePreferences.getPushServerPassword(context);
return new PushServiceSocket(context, localNumber, password);
}
}

View File

@@ -3,14 +3,12 @@ package org.thoughtcrime.securesms.gcm;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.telephony.SmsManager;
import android.util.Log;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.directory.NumberFilter;
import org.thoughtcrime.securesms.util.PhoneNumberFormatter;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.textsecure.util.PhoneNumberFormatter;
import java.io.IOException;
import java.util.ArrayList;
@@ -20,10 +18,13 @@ public class OptimizingTransport {
public static void sendTextMessage(Context context, String destinationAddress, String message,
PendingIntent sentIntent, PendingIntent deliveredIntent)
{
Log.w("OptimzingTransport", "Outgoing message: " + PhoneNumberFormatter.formatNumber(context, destinationAddress));
NumberFilter filter = NumberFilter.getInstance(context);
String localNumber = TextSecurePreferences.getLocalNumber(context);
String canonicalizedDestinationAddress = PhoneNumberFormatter.formatNumber(destinationAddress, localNumber);
NumberFilter filter = NumberFilter.getInstance(context);
if (filter.containsNumber(PhoneNumberFormatter.formatNumber(context, destinationAddress))) {
Log.w("OptimzingTransport", "Outgoing message: " + canonicalizedDestinationAddress);
if (filter.containsNumber(canonicalizedDestinationAddress)) {
Log.w("OptimzingTransport", "In the filter, sending GCM...");
sendGcmTextMessage(context, destinationAddress, message, sentIntent, deliveredIntent);
} else {
@@ -48,9 +49,8 @@ public class OptimizingTransport {
PendingIntent sentIntent, PendingIntent deliveredIntent)
{
try {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String localNumber = preferences.getString(ApplicationPreferencesActivity.LOCAL_NUMBER_PREF, null);
String password = preferences.getString(ApplicationPreferencesActivity.GCM_PASSWORD_PREF, null);
String localNumber = TextSecurePreferences.getLocalNumber(context);
String password = TextSecurePreferences.getPushServerPassword(context);
if (localNumber == null || password == null) {
Log.w("OptimzingTransport", "No credentials, falling back to SMS...");
@@ -59,7 +59,7 @@ public class OptimizingTransport {
}
PushServiceSocket pushServiceSocket = new PushServiceSocket(context, localNumber, password);
pushServiceSocket.sendMessage(PhoneNumberFormatter.formatNumber(context, recipient), messageText);
pushServiceSocket.sendMessage(PhoneNumberFormatter.formatNumber(recipient, localNumber), messageText);
sentIntent.send(Activity.RESULT_OK);
} catch (IOException ioe) {
Log.w("OptimizingTransport", ioe);

View File

@@ -36,6 +36,7 @@ import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.service.MmsDownloader;
import org.thoughtcrime.securesms.util.Conversions;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import java.io.DataInputStream;
@@ -47,10 +48,8 @@ public class MmsCommunication {
protected static MmsConnectionParameters getLocallyConfiguredMmsConnectionParameters(Context context)
throws ApnUnavailableException
{
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (preferences.getBoolean(ApplicationPreferencesActivity.ENABLE_MANUAL_MMS_PREF, false)) {
String mmsc = preferences.getString(ApplicationPreferencesActivity.MMSC_HOST_PREF, null);
if (TextSecurePreferences.isUseLocalApnsEnabled(context)) {
String mmsc = TextSecurePreferences.getMmscUrl(context);
if (mmsc == null)
throw new ApnUnavailableException("Malformed locally configured MMSC.");
@@ -58,8 +57,8 @@ public class MmsCommunication {
if (!mmsc.startsWith("http"))
mmsc = "http://" + mmsc;
String proxy = preferences.getString(ApplicationPreferencesActivity.MMSC_PROXY_HOST_PREF, null);
String port = preferences.getString(ApplicationPreferencesActivity.MMSC_PROXY_PORT_PREF, null);
String proxy = TextSecurePreferences.getMmscProxy(context);
String port = TextSecurePreferences.getMmscProxyPort(context);
return new MmsConnectionParameters(mmsc, proxy, port);
}
@@ -70,9 +69,7 @@ public class MmsCommunication {
protected static MmsConnectionParameters getLocalMmsConnectionParameters(Context context)
throws ApnUnavailableException
{
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
if (preferences.getBoolean(ApplicationPreferencesActivity.ENABLE_MANUAL_MMS_PREF, false)) {
if (TextSecurePreferences.isUseLocalApnsEnabled(context)) {
return getLocallyConfiguredMmsConnectionParameters(context);
} else {
MmsConnectionParameters params = ApnDefaults.getMmsConnectionParameters(context);
@@ -205,7 +202,7 @@ public class MmsCommunication {
}
public boolean hasProxy() {
return proxy != null && proxy.trim().length() != 0;
return !Util.isEmpty(proxy);
}
public String getMmsc() {
@@ -220,7 +217,7 @@ public class MmsCommunication {
}
public int getPort() {
if (port == null || port.trim().length() == 0)
if (Util.isEmpty(port))
return 80;
return Integer.parseInt(port);

View File

@@ -10,9 +10,7 @@ public class Tag {
public static final String WHITESPACE_TAG = " ";
public static boolean isTaggable(Context context, String message) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
public static boolean isTaggable(String message) {
return message.matches(".*[^\\s].*") &&
message.replaceAll("\\s+$", "").length() + WHITESPACE_TAG.length() <= 158;
}

View File

@@ -42,6 +42,7 @@ import org.thoughtcrime.securesms.crypto.InvalidPassphraseException;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.crypto.MasterSecretUtil;
import org.thoughtcrime.securesms.notifications.MessageNotifier;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
/**
* Small service that stays running to keep a key cached in memory.
@@ -117,7 +118,7 @@ public class KeyCachingService extends Service {
this.pending = PendingIntent.getService(this, 0, new Intent(PASSPHRASE_EXPIRED_EVENT, null,
this, KeyCachingService.class), 0);
if (isPassphraseDisabled()) {
if (TextSecurePreferences.isPasswordDisabled(this)) {
try {
MasterSecret masterSecret = MasterSecretUtil.getMasterSecret(this, MasterSecretUtil.UNENCRYPTED_PASSPHRASE);
setMasterSecret(masterSecret);
@@ -168,7 +169,7 @@ public class KeyCachingService extends Service {
}
private void handleDisableService() {
if (isPassphraseDisabled())
if (TextSecurePreferences.isPasswordDisabled(this))
stopForeground(true);
}
@@ -176,7 +177,7 @@ public class KeyCachingService extends Service {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
boolean timeoutEnabled = sharedPreferences.getBoolean(ApplicationPreferencesActivity.PASSPHRASE_TIMEOUT_PREF, false);
if ((activitiesRunning == 0) && (this.masterSecret != null) && timeoutEnabled && !isPassphraseDisabled()) {
if ((activitiesRunning == 0) && (this.masterSecret != null) && timeoutEnabled && !TextSecurePreferences.isPasswordDisabled(this)) {
long timeoutMinutes = sharedPreferences.getInt(ApplicationPreferencesActivity.PASSPHRASE_TIMEOUT_INTERVAL_PREF, 60 * 5);
long timeoutMillis = timeoutMinutes * 60 * 1000;
@@ -233,7 +234,7 @@ public class KeyCachingService extends Service {
}
private void foregroundService() {
if (isPassphraseDisabled()) {
if (TextSecurePreferences.isPasswordDisabled(this)) {
stopForeground(true);
return;
}
@@ -257,11 +258,6 @@ public class KeyCachingService extends Service {
sendBroadcast(intent, KEY_PERMISSION);
}
private boolean isPassphraseDisabled() {
return PreferenceManager.getDefaultSharedPreferences(this)
.getBoolean(ApplicationPreferencesActivity.DISABLE_PASSPHRASE_PREF, false);
}
private PendingIntent buildLockIntent() {
Intent intent = new Intent(this, KeyCachingService.class);
intent.setAction(PASSPHRASE_EXPIRED_EVENT);

View File

@@ -1,15 +1,9 @@
package org.thoughtcrime.securesms.transport;
import android.content.Context;
import android.util.Log;
import org.thoughtcrime.securesms.crypto.MasterSecret;
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
import org.thoughtcrime.securesms.directory.NumberFilter;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.PhoneNumberFormatter;
import java.io.IOException;
public class UniversalTransport {

View File

@@ -1,116 +0,0 @@
package org.thoughtcrime.securesms.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.Log;
import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
import java.util.Locale;
/**
* Phone number formats are a pain.
*
* @author Moxie Marlinspike
*
*/
public class PhoneNumberFormatter {
public static boolean isValidNumber(String number) {
return number.matches("^\\+[0-9]{10,}");
}
private static String impreciseFormatNumber(String number, String localNumber) {
number = number.replaceAll("[^0-9+]", "");
if (number.charAt(0) == '+')
return number;
if (localNumber.charAt(0) == '+')
localNumber = localNumber.substring(1);
if (localNumber.length() == number.length() || number.length() > localNumber.length())
return "+" + number;
int difference = localNumber.length() - number.length();
return "+" + localNumber.substring(0, difference) + number;
}
public static String formatNumberInternational(String number) {
try {
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
PhoneNumber parsedNumber = util.parse(number, null);
return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL);
} catch (NumberParseException e) {
Log.w("PhoneNumberFormatter", e);
return number;
}
}
public static String formatNumber(Context context, String number) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String localNumber = preferences.getString(ApplicationPreferencesActivity.LOCAL_NUMBER_PREF, "No Stored Number");
number = number.replaceAll("[^0-9+]", "");
if (number.charAt(0) == '+')
return number;
try {
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
PhoneNumber localNumberObject = util.parse(localNumber, null);
String localCountryCode = util.getRegionCodeForNumber(localNumberObject);
Log.w("PhoneNumberFormatter", "Got local CC: " + localCountryCode);
PhoneNumber numberObject = util.parse(number, localCountryCode);
return util.format(numberObject, PhoneNumberFormat.E164);
} catch (NumberParseException e) {
Log.w("PhoneNumberFormatter", e);
return impreciseFormatNumber(number, localNumber);
}
}
public static String getRegionDisplayName(String regionCode) {
return (regionCode == null || regionCode.equals("ZZ") || regionCode.equals(PhoneNumberUtil.REGION_CODE_FOR_NON_GEO_ENTITY))
? "Unknown country" : new Locale("", regionCode).getDisplayCountry(Locale.getDefault());
}
public static String formatE164(String countryCode, String number) {
try {
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
int parsedCountryCode = Integer.parseInt(countryCode);
PhoneNumber parsedNumber = util.parse(number,
util.getRegionCodeForCountryCode(parsedCountryCode));
return util.format(parsedNumber, PhoneNumberUtil.PhoneNumberFormat.E164);
} catch (NumberParseException npe) {
Log.w("CreateAccountActivity", npe);
} catch (NumberFormatException nfe) {
Log.w("CreateAccountActivity", nfe);
}
return "+" +
countryCode.replaceAll("[^0-9]", "").replaceAll("^0*", "") +
number.replaceAll("[^0-9]", "");
}
public static String getInternationalFormatFromE164(String e164number) {
try {
PhoneNumberUtil util = PhoneNumberUtil.getInstance();
PhoneNumber parsedNumber = util.parse(e164number, null);
return util.format(parsedNumber, PhoneNumberFormat.INTERNATIONAL);
} catch (NumberParseException e) {
Log.w("PhoneNumberFormatter", e);
return e164number;
}
}
}

View File

@@ -0,0 +1,69 @@
package org.thoughtcrime.securesms.util;
import android.content.Context;
import android.preference.PreferenceManager;
import org.thoughtcrime.securesms.ApplicationPreferencesActivity;
public class TextSecurePreferences {
public static String getLocalNumber(Context context) {
return getStringPreference(context, ApplicationPreferencesActivity.LOCAL_NUMBER_PREF, "No Stored Number");
}
public static String getPushServerPassword(Context context) {
return getStringPreference(context, ApplicationPreferencesActivity.GCM_PASSWORD_PREF, null);
}
public static boolean isEnterImeKeyEnabled(Context context) {
return getBooleanPreference(context, ApplicationPreferencesActivity.ENTER_PRESENT_PREF, false);
}
public static boolean isEnterSendsEnabled(Context context) {
return getBooleanPreference(context, ApplicationPreferencesActivity.ENTER_SENDS_PREF, false);
}
public static boolean isPasswordDisabled(Context context) {
return getBooleanPreference(context, ApplicationPreferencesActivity.DISABLE_PASSPHRASE_PREF, false);
}
public static void setPasswordDisabled(Context context, boolean disabled) {
setBooleanPreference(context, ApplicationPreferencesActivity.DISABLE_PASSPHRASE_PREF, disabled);
}
public static String getMmscUrl(Context context) {
return getStringPreference(context, ApplicationPreferencesActivity.MMSC_HOST_PREF, "");
}
public static String getMmscProxy(Context context) {
return getStringPreference(context, ApplicationPreferencesActivity.MMSC_PROXY_HOST_PREF, "");
}
public static String getMmscProxyPort(Context context) {
return getStringPreference(context, ApplicationPreferencesActivity.MMSC_PROXY_PORT_PREF, "");
}
public static String getIdentityContactUri(Context context) {
return getStringPreference(context, ApplicationPreferencesActivity.IDENTITY_PREF, null);
}
public static boolean isAutoRespondKeyExchangeEnabled(Context context) {
return getBooleanPreference(context, ApplicationPreferencesActivity.AUTO_KEY_EXCHANGE_PREF, true);
}
public static boolean isUseLocalApnsEnabled(Context context) {
return getBooleanPreference(context, ApplicationPreferencesActivity.USE_LOCAL_MMS_APNS_PREF, false);
}
private static void setBooleanPreference(Context context, String key, boolean value) {
PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(key, value).commit();
}
private static boolean getBooleanPreference(Context context, String key, boolean defaultValue) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(key, defaultValue);
}
private static String getStringPreference(Context context, String key, String defaultValue) {
return PreferenceManager.getDefaultSharedPreferences(context).getString(key, defaultValue);
}
}