package org.sparkleshare.android.ui;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.json.JSONException;
import org.json.JSONObject;
import org.sparkleshare.android.BrowsingActivity;
import org.sparkleshare.android.R;
import org.sparkleshare.android.SettingsActivity;
import org.sparkleshare.android.utils.FakeSocketFactory;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
public class SetupFragment extends Fragment {
private static final String TAG = "SetupFragment";
public EditText edtServer, edtLinkcode;
public Button btn_add;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
RelativeLayout rl = (RelativeLayout) inflater.inflate(R.layout.setup, container, false);
btn_add = (Button) rl.findViewById(R.id.btn_add);
btn_add.setEnabled(false);
edtServer = (EditText) rl.findViewById(R.id.edt_server);
edtLinkcode = (EditText) rl.findViewById(R.id.edt_link_code);
edtServer.addTextChangedListener(checkEditfields());
edtLinkcode.addTextChangedListener(checkEditfields());
return rl;
}
/**
* Checks both mandatory edit fields and enables the add button inside this Activity.
* @return
*/
private TextWatcher checkEditfields() {
TextWatcher watcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
if (edtServer.getEditableText().length() > 0 && edtLinkcode.getEditableText().length() > 0) {
btn_add.setEnabled(true);
} else {
btn_add.setEnabled(false);
}
}
};
return watcher;
}
public void startLogin(String serverUrl) {
new Login().execute(formatServerUrl(serverUrl));
}
private String formatServerUrl(String url) {
// TODO: Should use regular expression here.
if (!url.contains(":")) {
url = url.concat(":3000");
}
if (!url.startsWith("http")) {
url = "http://" + url;
}
return url;
}
/**
* Login to server asynchronously.
* @author kai
*
*/
public class Login extends AsyncTask<String, Void, Boolean> {
private ProgressDialog loadingDialog;
private final String AUTH_SUFFIX = "/api/getAuthCode";
private String serverUrl;
@Override
protected void onPreExecute() {
loadingDialog = ProgressDialog.show(getActivity(), "", getString(R.string.adding_project));
}
private HttpClient getNewHttpClient() {
SharedPreferences sp = SettingsActivity.getSettings(getActivity());
boolean acceptAll = sp.getBoolean(getResources().getString(R.string.settings_accept_all_certificates), false);
SchemeRegistry s = new SchemeRegistry();
s.register(new Scheme("http", new PlainSocketFactory(), 80));
s.register(new Scheme("https", acceptAll ? new FakeSocketFactory() : SSLSocketFactory.getSocketFactory(), 443));
HttpParams httpParams = new BasicHttpParams();
return new DefaultHttpClient(new ThreadSafeClientConnManager(httpParams, s), httpParams);
}
@Override
protected Boolean doInBackground(String... params) {
HttpClient client = getNewHttpClient();
serverUrl = params[0];
HttpPost post = new HttpPost(serverUrl + AUTH_SUFFIX);
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("code", edtLinkcode.getText().toString()));
nameValuePairs.add(new BasicNameValuePair("name", android.os.Build.MODEL));
post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = client.execute(post);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer();
String line = "";
String NL = System.getProperty("line.separator");
while ((line = in.readLine()) != null) {
sb.append(line + NL);
}
in.close();
JSONObject credentials = new JSONObject(sb.toString());
// TODO: encrypt credentials
String ident = credentials.getString("ident");
String authCode = credentials.getString("authCode");
SharedPreferences prefs = SettingsActivity.getSettings((ContextWrapper) getActivity());
Editor editor = prefs.edit();
editor.putString("ident", ident);
editor.putString("authCode", authCode);
editor.putString("serverUrl", serverUrl);
editor.commit();
}
} catch (UnsupportedEncodingException e) {
Log.e("Login failed", e.getLocalizedMessage());
return false;
} catch (ClientProtocolException e) {
Log.e("Login failed", e.getLocalizedMessage());
return false;
} catch (IOException e) {
Log.e("Login failed", e.getLocalizedMessage());
return false;
} catch (JSONException e) {
Log.e("Login failed", e.getLocalizedMessage());
return false;
} catch (Exception e) {
Log.e("Login failed", e.getLocalizedMessage());
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean successfully) {
loadingDialog.dismiss();
if (successfully) {
Intent browseData = new Intent(getActivity(), BrowsingActivity.class);
// TODO: outsource API constants
browseData.putExtra("url", serverUrl + "/api/getFolderList");
startActivity(browseData);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(getString(R.string.login_error))
.setCancelable(false)
.setPositiveButton(getString(R.string.close), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
getActivity().finish();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
}