package org.mots.haxsync.activities;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.mots.haxsync.R;
import org.mots.haxsync.services.CalendarSyncAdapterService;
import org.mots.haxsync.utilities.ContactUtil;
import org.mots.haxsync.utilities.FacebookUtil;
import org.mots.haxsync.utilities.intents.IntentUtil;
import org.mots.haxsync.utilities.intents.IntentUtil.NameList;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.Preference.OnPreferenceChangeListener;
import android.provider.BaseColumns;
import android.provider.CalendarContract;
import android.provider.ContactsContract.RawContacts;
public class Preferences extends PreferenceActivity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences prefs = getSharedPreferences(getPackageName() + "_preferences", MODE_MULTI_PROCESS);
boolean settingsFound = prefs.getBoolean("settings_found", false);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean("settings_found" , true);
editor.commit();
}
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preferences, target);
}
public static class GeneralFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Make sure default values are applied. In a real app, you would
// want this in a shared function that is used to retrieve the
// SharedPreferences wherever they are needed.
// PreferenceManager.setDefaultValues(getActivity(),
// R.xml.advanced_preferences, false);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.general_prefs);
ListPreference listPref = new ListPreference(getActivity());
listPref.setKey("fb_app");
listPref.setOrder(0);
NameList apps = IntentUtil.getApps(getActivity());
listPref.setEntries(apps.namesAvail.toArray(new CharSequence[apps.namesAvail.size()]));
listPref.setEntryValues(apps.pkgsAvail.toArray(new String[apps.pkgsAvail.size()]));
listPref.setTitle(getActivity().getString(R.string.fb_app));
listPref.setSummary(getActivity().getString(R.string.fb_app_description));
getPreferenceScreen().addPreference(listPref);
}
}
public static class ContactFragment extends PreferenceFragment {
public final class LocationRemover extends AsyncTask<Void, Void, Void>{
private final Context context;
private final Account account;
protected LocationRemover(Context c, Account a){
this.context = c;
this.account = a;
}
@Override
protected Void doInBackground(Void... params) {
ContactUtil.removeContactLocations(context, account);
return null;
}
}
public final class BirthdayRemover extends AsyncTask<Void, Void, Void>{
private final Context context;
private final Account account;
protected BirthdayRemover(Context c, Account a){
this.context = c;
this.account = a;
}
@Override
protected Void doInBackground(Void... params) {
Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, account.type)
.build();
Cursor c1 = context.getContentResolver().query(rawContactUri, new String[] { BaseColumns._ID}, null, null, null);
while (c1.moveToNext()){
ContactUtil.removeBirthdays(context, c1.getLong(c1.getColumnIndex(BaseColumns._ID)));
}
return null;
}
}
public final class GoogleCopier extends AsyncTask<Void, Void, Void>{
private final Context context;
private final Account account;
protected GoogleCopier(Context c, Account a){
this.context = c;
this.account = a;
}
@Override
protected Void doInBackground(Void... params) {
HashSet<Long> rawIds = new HashSet<Long>();
ContentResolver mContentResolver = context.getContentResolver();
/* Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, account.type)
.build();
* Cursor c1 = mContentResolver.query(rawContactUri, new String[] { BaseColumns._ID , RawContacts.DISPLAY_NAME_PRIMARY}, null, null, null);
HashMap<Long, String> names = new HashMap<Long, String>();
while (c1.moveToNext()) {
rawIds.add(c1.getLong(c1.getColumnIndex(BaseColumns._ID)));
names.put(c1.getLong(c1.getColumnIndex(BaseColumns._ID)), c1.getString(c1.getColumnIndex(RawContacts.DISPLAY_NAME_PRIMARY)));
}
c1.close();*/
for (long id : rawIds){
Set<Long> linked = ContactUtil.getRawContacts(mContentResolver, id, "com.google");
// Log.i("haxsync contact", names.get(id));
//Log.i("number of linked google contacts", String.valueOf(linked.size()));
if (linked.size() > 0){
ContactUtil.Photo photo = ContactUtil.getPhoto(mContentResolver, id);
if (photo != null){
for (long linkedID : linked){
ContactUtil.updateContactPhoto(mContentResolver, linkedID, photo, false);
}
}
}
}
return null;
}
}
public final class EmailRemover extends AsyncTask<Void, Void, Void>{
private final Context context;
private final Account account;
protected EmailRemover(Context c, Account a){
this.context = c;
this.account = a;
}
@Override
protected Void doInBackground(Void... params) {
Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, account.type)
.build();
Cursor c1 = context.getContentResolver().query(rawContactUri, new String[] { BaseColumns._ID}, null, null, null);
while (c1.moveToNext()){
ContactUtil.removeEmails(context, c1.getLong(c1.getColumnIndex(BaseColumns._ID)));
}
return null;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.contact_prefs);
if (Build.VERSION.SDK_INT < 15){
Preference newApi = findPreference("status_new");
newApi.setEnabled(false);
}
Preference locSync = findPreference("sync_location");
// Preference rootEnabled = findPreference("root_enabled");
//
//
// rootEnabled.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
//
// @Override
// public boolean onPreferenceChange(Preference preference, Object newValue) {
// return RootUtil.isRoot();
// }
//
// });
locSync.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean sync = Boolean.valueOf(String.valueOf(newValue));
if (!sync){
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
new ContactFragment.LocationRemover(context, account).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
return true;
}
});
Preference birthdaySync = findPreference("sync_contact_birthday");
birthdaySync.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean sync = Boolean.valueOf(String.valueOf(newValue));
if (!sync){
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
new ContactFragment.BirthdayRemover(context, account).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
return true;
}
});
Preference emails = findPreference("sync_facebook_email");
emails.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean sync = Boolean.valueOf(String.valueOf(newValue));
if (!sync){
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
new ContactFragment.EmailRemover(context, account).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
return true;
}
});
//remove features Facebook doesn't like :(
if (FacebookUtil.RESPECT_FACEBOOK_POLICY) {
Preference statusPrefs = findPreference("status_updates");
getPreferenceScreen().removePreference(statusPrefs);
PreferenceCategory contactCat = (PreferenceCategory) findPreference("contact_sync");
contactCat.removePreference(locSync);
contactCat.removePreference(emails);
contactCat.removePreference(birthdaySync);
}
Preference google = findPreference("update_google_photos");
google.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean sync = Boolean.valueOf(String.valueOf(newValue));
if (sync){
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
new ContactFragment.GoogleCopier(context, account).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);
}
return true;
}
});
}
}
public static class CalendarFragment extends PreferenceFragment {
public final class ReminderRemover extends AsyncTask<String, Void, Void>{
private final Context context;
private final Account account;
protected ReminderRemover(Context c, Account a){
this.context = c;
this.account = a;
}
@Override
protected Void doInBackground(String... params) {
for (String cal : params){
CalendarSyncAdapterService.removeReminders(context, account, cal);
}
return null;
}
}
public final class ReminderUpdater extends AsyncTask<String, Void, Void>{
private final Context context;
private final Account account;
private final long minutes;
protected ReminderUpdater(Context c, Account a, long minutes){
this.context = c;
this.account = a;
this.minutes = minutes;
}
@Override
protected Void doInBackground(String... params) {
for (String cal : params){
CalendarSyncAdapterService.updateReminders(context, account, cal, minutes);
}
return null;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.calendar_prefs);
Preference eventColor = findPreference("event_color");
Preference birthdayColor = findPreference("birthday_color");
Preference eventSync = findPreference("sync_events");
Preference birthdaySync = findPreference("sync_birthdays");
Preference phoneOnly = findPreference("phone_only_cal");
Preference eventStatus = findPreference("event_status");
Preference eventReminders = findPreference("event_reminders");
Preference birthdayReminders = findPreference("birthday_reminders");
eventReminders.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean remind = Boolean.valueOf(String.valueOf(newValue));
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
if (!remind){
new CalendarFragment.ReminderRemover(context, account).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, context.getString(R.string.event_cal));
} else {
SharedPreferences prefs = context.getSharedPreferences(context.getPackageName() + "_preferences", MODE_MULTI_PROCESS);
long minutes = prefs.getLong("event_reminder_minutes", 30);
new CalendarFragment.ReminderUpdater(context, account, minutes).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, context.getString(R.string.event_cal));
}
return true;
}
});
birthdayReminders.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean remind = Boolean.valueOf(String.valueOf(newValue));
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
if (!remind){
new CalendarFragment.ReminderRemover(context, account).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, context.getString(R.string.birthday_cal));
} else {
SharedPreferences prefs = context.getSharedPreferences(context.getPackageName() + "_preferences", MODE_MULTI_PROCESS);
long minutes = prefs.getLong("birthday_reminder_minutes", 1440);
new CalendarFragment.ReminderUpdater(context, account, minutes).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,context.getString(R.string.birthday_cal));
}
return true;
}
});
eventColor.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
int color = Integer.valueOf(String.valueOf(newValue));
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
CalendarSyncAdapterService.setCalendarColor(context, account, context.getString(R.string.event_cal), color);
return true;
}
});
birthdayColor.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
int color = Integer.valueOf(String.valueOf(newValue));
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
CalendarSyncAdapterService.setCalendarColor(context, account, context.getString(R.string.birthday_cal), color);
return true;
}
});
eventSync.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean sync = Boolean.valueOf(String.valueOf(newValue));
if (!sync){
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
CalendarSyncAdapterService.removeCalendar(context, account, context.getString(R.string.event_cal));
}
return true;
}
});
birthdaySync.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean sync = Boolean.valueOf(String.valueOf(newValue));
if (!sync){
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
CalendarSyncAdapterService.removeCalendar(context, account, context.getString(R.string.birthday_cal));
}
return true;
}
});
phoneOnly.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean phoneOnlyValue= Boolean.valueOf(String.valueOf(newValue));
if (phoneOnlyValue){
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
CalendarSyncAdapterService.removeCalendar(context, account, context.getString(R.string.birthday_cal));
ContentResolver.requestSync(account, CalendarContract.AUTHORITY, new Bundle());
}
return true;
}
});
eventStatus.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Context context = preference.getContext();
AccountManager am = AccountManager.get(context);
Account account = am.getAccountsByType("org.mots.haxsync.account")[0];
CalendarSyncAdapterService.removeCalendar(context, account, context.getString(R.string.event_cal));
ContentResolver.requestSync(account, CalendarContract.AUTHORITY, new Bundle());
return true;
}
});
}
}
}