/*
* Copyright (C) 2007-2008 Esmertec AG. Copyright (C) 2007-2008 The Android Open
* Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package info.guardianproject.otr.app.im.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.database.Cursor;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.EditTextPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.text.TextUtils;
import info.guardianproject.otr.app.im.R;
import info.guardianproject.otr.app.im.provider.Imps;
import info.guardianproject.util.Languages;
public class SettingActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
private static final String TAG = "SettingActivity";
private static final int DEFAULT_HEARTBEAT_INTERVAL = 1;
private String currentLanguage;
ListPreference mOtrMode;
ListPreference mLanguage;
CheckBoxPreference mLinkifyOnTor;
CheckBoxPreference mHideOfflineContacts;
CheckBoxPreference mDeleteUnsecuredMedia;
CheckBoxPreference mStoreMediaOnExternalStorage;
CheckBoxPreference mEnableNotification;
CheckBoxPreference mNotificationVibrate;
CheckBoxPreference mNotificationSound;
CheckBoxPreference mForegroundService;
EditTextPreference mHeartbeatInterval;
EditTextPreference mThemeBackground;
Preference mNotificationRingtone;
private void setInitialValues() {
ContentResolver cr = getContentResolver();
Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI,new String[] {Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE},Imps.ProviderSettings.PROVIDER + "=?",new String[] { Long.toString( Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS)},null);
Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap(pCursor, cr,
Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS, false /* keep updated */, null /* no handler */);
mOtrMode.setValue(settings.getOtrMode());
mLinkifyOnTor.setChecked(settings.getLinkifyOnTor());
mHideOfflineContacts.setChecked(settings.getHideOfflineContacts());
mDeleteUnsecuredMedia.setChecked(settings.getDeleteUnsecuredMedia());
mEnableNotification.setChecked(settings.getEnableNotification());
mNotificationVibrate.setChecked(settings.getVibrate());
mNotificationSound.setChecked(settings.getRingtoneURI() != null);
mForegroundService.setChecked(settings.getUseForegroundPriority());
long heartbeatInterval = settings.getHeartbeatInterval();
if (heartbeatInterval == 0) heartbeatInterval = DEFAULT_HEARTBEAT_INTERVAL;
mHeartbeatInterval.setText(String.valueOf(heartbeatInterval));
settings.close();
/* This uses SharedPreferences since it is used before Imps is setup */
SharedPreferences sharedPrefs = PreferenceManager
.getDefaultSharedPreferences(getApplicationContext());
mStoreMediaOnExternalStorage.setChecked(sharedPrefs.getBoolean(
getString(R.string.key_store_media_on_external_storage_pref), false));
}
/*
* Warning: must call settings.close() after usage!
*/
private static Imps.ProviderSettings.QueryMap getSettings(Context context) {
ContentResolver cr = context.getContentResolver();
Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI,
new String[] {Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE},
Imps.ProviderSettings.PROVIDER + "=?",
new String[] { Long.toString( Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS)},
null);
Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap(pCursor,
cr,
Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS,
false /* keep updated */,
null /* no handler */);
return settings;
}
public static boolean getDeleteUnsecuredMedia(Context context) {
Imps.ProviderSettings.QueryMap settings = getSettings(context);
boolean value = settings.getDeleteUnsecuredMedia();
settings.close();
return value;
}
/* save the preferences in Imps so they are accessible everywhere */
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
ContentResolver cr = getContentResolver();
Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI,new String[] {Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE},Imps.ProviderSettings.PROVIDER + "=?",new String[] { Long.toString( Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS)},null);
Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap(pCursor, cr,
Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS, false /* keep updated */, null /* no handler */);
if (key.equals("pref_security_otr_mode")) {
settings.setOtrMode(prefs.getString(key, "auto"));
} else if (key.equals("pref_linkify_on_tor")) {
settings.setLinkifyOnTor(prefs.getBoolean(key, false));
} else if (key.equals("pref_hide_offline_contacts")) {
settings.setHideOfflineContacts(prefs.getBoolean(key, false));
} else if (key.equals("pref_delete_unsecured_media")) {
boolean test = prefs.getBoolean(key, false);
settings.setDeleteUnsecuredMedia(prefs.getBoolean(key, false));
} else if (key.equals("pref_store_media_on_external_storage")) {
/* This uses SharedPreferences since it is used before Imps is setup */
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
Editor editor = sharedPrefs.edit();
editor.putBoolean(getString(R.string.key_store_media_on_external_storage_pref),
prefs.getBoolean(key, false));
editor.apply();
} else if (key.equals("pref_enable_notification")) {
settings.setEnableNotification(prefs.getBoolean(key, true));
} else if (key.equals("pref_notification_vibrate")) {
settings.setVibrate(prefs.getBoolean(key, true));
} else if (key.equals("pref_notification_sound")) {
/**
// TODO sort out notification sound pref
if (prefs.getBoolean(key, true)) {
settings.setRingtoneURI("android.resource://" + getPackageName() + "/" + R.raw.notify);
} else {
settings.setRingtoneURI(null);
}*/
} else if (key.equals("pref_enable_custom_notification")) {
/*
if (prefs.getBoolean(key, false)) {
settings.setRingtoneURI("android.resource://" + getPackageName() + "/" + R.raw.notify);
} else {
settings.setRingtoneURI(ProviderSettings.RINGTONE_DEFAULT);
}*/
}
else if (key.equals("pref_foreground_enable")) {
settings.setUseForegroundPriority(prefs.getBoolean(key, true));
} else if (key.equals("pref_heartbeat_interval")) {
try
{
settings.setHeartbeatInterval(Integer.valueOf(prefs.getString(key, String.valueOf(DEFAULT_HEARTBEAT_INTERVAL))));
}
catch (NumberFormatException nfe)
{
settings.setHeartbeatInterval((DEFAULT_HEARTBEAT_INTERVAL));
}
}
else if (key.equals("pref_language"))
{
String newLanguage = prefs.getString(key, Languages.USE_SYSTEM_DEFAULT);
if (!TextUtils.equals(currentLanguage, newLanguage)) {
((ImApp)getApplication()).setNewLocale(this, newLanguage);
setResult(RESULT_OK);
finish(); // go to main screen to reset language
}
}
else if (key.equals("themeDark"))
{
setResult(RESULT_OK);
}
settings.close();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
mOtrMode = (ListPreference) findPreference("pref_security_otr_mode");
mLanguage = (ListPreference) findPreference("pref_language");
mLinkifyOnTor = (CheckBoxPreference) findPreference("pref_linkify_on_tor");
mHideOfflineContacts = (CheckBoxPreference) findPreference("pref_hide_offline_contacts");
mDeleteUnsecuredMedia = (CheckBoxPreference) findPreference("pref_delete_unsecured_media");
mStoreMediaOnExternalStorage = (CheckBoxPreference) findPreference("pref_store_media_on_external_storage");
mEnableNotification = (CheckBoxPreference) findPreference("pref_enable_notification");
mNotificationVibrate = (CheckBoxPreference) findPreference("pref_notification_vibrate");
mNotificationSound = (CheckBoxPreference) findPreference("pref_notification_sound");
mNotificationRingtone = findPreference("pref_notification_ringtone");
Languages languages = Languages.get(this);
currentLanguage = getResources().getConfiguration().locale.getLanguage();
mLanguage.setDefaultValue(currentLanguage);
mLanguage.setEntries(languages.getAllNames());
mLanguage.setEntryValues(languages.getSupportedLocales());
mNotificationRingtone.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference arg0) {
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, getString(R.string.notification_ringtone_title));
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, (Uri) null);
startActivityForResult(intent, 5);
return true;
}
});
mForegroundService = (CheckBoxPreference) findPreference("pref_foreground_enable");
mHeartbeatInterval = (EditTextPreference) findPreference("pref_heartbeat_interval");
mThemeBackground = (EditTextPreference) findPreference("pref_background");
mThemeBackground.setOnPreferenceClickListener(new OnPreferenceClickListener()
{
@Override
public boolean onPreferenceClick(Preference arg0) {
showThemeChooserDialog ();
return true;
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 888 && data != null && data.getData() != null){
Uri _uri = data.getData();
if (_uri != null) {
//Link to the image
String imageFilePath = getRealPathFromURI(_uri);
if (imageFilePath != null)
mThemeBackground.setText(imageFilePath);
mThemeBackground.getDialog().cancel();
}
}
else if (resultCode == Activity.RESULT_OK && requestCode == 5)
{
Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
ContentResolver cr = getContentResolver();
Cursor pCursor = cr.query(Imps.ProviderSettings.CONTENT_URI,new String[] {Imps.ProviderSettings.NAME, Imps.ProviderSettings.VALUE},Imps.ProviderSettings.PROVIDER + "=?",new String[] { Long.toString( Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS)},null);
Imps.ProviderSettings.QueryMap settings = new Imps.ProviderSettings.QueryMap(pCursor, cr,
Imps.ProviderSettings.PROVIDER_ID_FOR_GLOBAL_SETTINGS, false /* keep updated */, null /* no handler */);
if (uri != null)
{
settings.setRingtoneURI(uri.toString());
}
else
{
settings.setRingtoneURI(null);
}
settings.close();
}
super.onActivityResult(requestCode, resultCode, data);
}
private String getRealPathFromURI(Uri contentURI) {
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
return contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
if (idx > -1)
return cursor.getString(idx);
else
return contentURI.toString();
}
}
private void showThemeChooserDialog ()
{
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.dialog_settings_choose_background_title));
builder.setMessage(getString(R.string.dialog_settings_choose_background_body));
builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, getString(R.string.dialog_settings_choose_background_picker)), 888);
dialog.dismiss();
}
});
builder.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// I do not need any action here you might
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
}
@Override
protected void onResume() {
super.onResume();
setInitialValues();
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(
this);
}
}