package org.mots.haxsync.activities;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.mots.haxsync.R;
import org.mots.haxsync.utilities.FacebookUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.BaseColumns;
import android.provider.ContactsContract;
import android.provider.ContactsContract.RawContacts;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class GoogleBackup extends Activity {
private SharedPreferences prefs;
//private ProgressBar progressBar;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.google_backup);
AccountManager am = AccountManager.get(this);
final Account[] googleAccounts = am.getAccountsByType("com.google");
if (googleAccounts.length > 1){
final CharSequence[] items = new CharSequence[googleAccounts.length];
for (int i = 0; i < googleAccounts.length; i++){
items[i] = googleAccounts[i].name;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(this.getString(R.string.google_select));
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
googleAccounts[0] = googleAccounts[item];
// Toast.makeText(getApplicationContext(), items[item], Toast.LENGTH_SHORT).show();
}
});
AlertDialog alert = builder.create();
alert.show();
}
final Account googleAcc = googleAccounts[0];
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(getString(R.string.google_backup_warning))
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
GoogleBackup.this.finish();
}
})
.setPositiveButton(getString(android.R.string.yes), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
new FriendWorker(GoogleBackup.this, googleAcc).execute();
}
})
.setNegativeButton(getString(android.R.string.no), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
GoogleBackup.this.finish();
}
});
AlertDialog alert = builder.create();
alert.show();
//progressBar = (ProgressBar) findViewById(R.id.progressBar);
// new FriendWorker(this).execute();
//ListView friendList = (ListView) findViewById(R.id.friendListView);
//friendList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
//friendList.set
}
final class FriendWorker extends AsyncTask<Void, Integer, Boolean>{
private final GoogleBackup parent;
private String contactName = "";
private final Account googleAcc;
protected FriendWorker(final GoogleBackup parent, final Account googleAcc){
this.parent = parent;
this.googleAcc = googleAcc;
}
private void writeHTCData(long rawContactID, String fbID, String friendID){
String note = "";
ContentResolver mContentResolver = parent.getContentResolver();
String noteWhere = ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.Data.RAW_CONTACT_ID + "= ?";
String[] noteWhereParams = new String[]{ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE, String.valueOf(rawContactID)};
Cursor cursor = mContentResolver.query(ContactsContract.Data.CONTENT_URI, new String[] {ContactsContract.CommonDataKinds.Note.NOTE}, noteWhere, noteWhereParams, null);
if (cursor.getCount() > 0){
cursor.moveToFirst();
note = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
}
cursor.close();
Document doc = null;
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
try {
docBuilder = docFactory.newDocumentBuilder();
} catch (ParserConfigurationException e1) {
e1.printStackTrace();
}
if (docBuilder == null){
return;
}
if (note.startsWith("<HTCData>")){
try {
StringReader reader = new StringReader( note );
InputSource inputSource = new InputSource( reader );
doc = docBuilder.parse(inputSource);
reader.close();
} catch (Exception e) {
Log.e("ERROR:", e.toString());
}
}
if (doc == null){
doc = docBuilder.newDocument();
Node htcdata = doc.createElement("HTCData");
doc.appendChild(htcdata);
}
Node fb = doc.createElement("Facebook");
fb.setTextContent("id:"+friendID+"/friendof:"+fbID);
Node htc = doc.getFirstChild();
NodeList oldfb = doc.getElementsByTagName("Facebook");
if (oldfb.getLength() > 0){
htc.replaceChild(fb, oldfb.item(0));
} else{
htc.appendChild(fb);
}
String xmlString = null;
try {
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StreamResult result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
xmlString = result.getWriter().toString();
// Log.i("xml", xmlString);
} catch (TransformerException e) {
// TODO Auto-generated catch block
return;
}
if (xmlString != null){
mContentResolver.delete(ContactsContract.Data.CONTENT_URI, noteWhere, noteWhereParams);
ContentValues contentValues = new ContentValues();
contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE);
contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, rawContactID);
contentValues.put(ContactsContract.CommonDataKinds.Note.NOTE, xmlString);
mContentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues);
}
}
protected Boolean doInBackground(Void... params){
AccountManager am = AccountManager.get(parent);
Account account = am.getAccountsByType(parent.getString(R.string.ACCOUNT_TYPE))[0];
if (FacebookUtil.authorize(parent, account)){
String selfID = FacebookUtil.getSelfID();
if (selfID == null){
return false;
}
String googleName = googleAcc.name;
Uri rawContactUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, account.name)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, account.type)
.build();
Uri googleUri = RawContacts.CONTENT_URI.buildUpon()
.appendQueryParameter(RawContacts.ACCOUNT_NAME, googleName)
.appendQueryParameter(RawContacts.ACCOUNT_TYPE, "com.google")
.build();
ContentResolver mContentResolver = parent.getContentResolver();
Cursor c1 = mContentResolver.query(rawContactUri, new String[] { BaseColumns._ID, RawContacts.CONTACT_ID, RawContacts.DISPLAY_NAME_PRIMARY, RawContacts.SYNC1 }, null, null, null);
while (c1.moveToNext()) {
long contactID = c1.getLong(c1.getColumnIndex(RawContacts.CONTACT_ID));
Cursor c2 = mContentResolver.query(googleUri, new String[] { BaseColumns._ID}, RawContacts.CONTACT_ID +" = '" + contactID + "'", null, null);
if (c2.getCount() > 0){
c2.moveToFirst();
contactName = c1.getString(c1.getColumnIndex(RawContacts.DISPLAY_NAME_PRIMARY));
writeHTCData(c2.getLong(c2.getColumnIndex(BaseColumns._ID)), selfID, c1.getString(c1.getColumnIndex(RawContacts.SYNC1)));
publishProgress((int) ((c1.getPosition() / (float) c1.getCount()) * 100));
}
c2.close();
//Log.i("backup", );
}
c1.close();
ContentResolver.requestSync(googleAcc, ContactsContract.AUTHORITY, new Bundle());
return true;
}
else{
return false;
}
}
protected void onProgressUpdate(Integer... progress) {
ProgressBar update = (ProgressBar)parent.findViewById(R.id.progressBar);
TextView name = (TextView)parent.findViewById(R.id.contactName);
name.setText(contactName);
update.setProgress(progress[0]);
}
protected void onPostExecute(boolean result){
if(!result){
Toast toast = Toast.makeText(parent, "Error connecting to Facebook.", Toast.LENGTH_LONG);
toast.show();
}
parent.finish();
//Log.i("test", "onpostexecute");
// parent.onWorkerFinished(result);
}
}
}