package org.sparkleshare.android.ui;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
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.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.sparkleshare.android.BrowsingActivity;
import org.sparkleshare.android.BrowsingAdapter;
import org.sparkleshare.android.FileDetailsActivity;
import org.sparkleshare.android.R;
import org.sparkleshare.android.SettingsActivity;
import org.sparkleshare.android.actionbarcompat.ActionBarActivity;
import org.sparkleshare.android.utils.FakeSocketFactory;
import android.R.color;
import android.content.ContextWrapper;
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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
public class BrowsingFragment extends Fragment {
private static final String TAG = "BrowsingFragment";
private ListView lvBrowsing;
private BrowsingAdapter adapter;
private String ident, authCode, serverUrl, folderId, currentUrl;
private String foldername = "SparkleShare";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
lvBrowsing = new ListView(getActivity());
adapter = new BrowsingAdapter(getActivity());
lvBrowsing.setAdapter(adapter);
lvBrowsing.setCacheColorHint(color.background_dark);
lvBrowsing.setOnItemClickListener(onListItemClick());
SharedPreferences prefs = SettingsActivity.getSettings((ContextWrapper) getActivity());
ident = prefs.getString("ident", "");
authCode = prefs.getString("authCode", "");
serverUrl = prefs.getString("serverUrl", "");
folderId = prefs.getString("folderId", "");
if (getActivity().getIntent().hasExtra("foldername")) {
foldername = getActivity().getIntent().getStringExtra("foldername");
}
currentUrl = getActivity().getIntent().getStringExtra("url");
new DownloadFileList().execute(currentUrl);
return lvBrowsing;
}
/**
* Will be called everytime an item on this activities' listview was clicked.
* @return newly created {@link OnItemClickListener}
*/
private OnItemClickListener onListItemClick() {
OnItemClickListener listener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ListEntryItem current = (ListEntryItem) adapter.getItem(position);
if (current.getType().equals("dir")) {
Log.d("BrowsingActivity", "dir");
Intent browseFolder = new Intent(getActivity(), BrowsingActivity.class);
String tmpUrl = serverUrl + "/api/getFolderContent/" + folderId + "?" + current.getUrl();
browseFolder.putExtra("url", tmpUrl);
browseFolder.putExtra("foldername", current.getTitle());
startActivity(browseFolder);
} else if (current.getType().equals("git")) {
Log.d("BrowsingActivity", "git");
Intent browseFolder = new Intent(getActivity(), BrowsingActivity.class);
folderId = current.getId();
SharedPreferences prefs = SettingsActivity.getSettings((ContextWrapper) parent.getContext());
Editor editor = prefs.edit();
editor.putString("folderId", folderId);
editor.commit();
browseFolder.putExtra("url", serverUrl + "/api/getFolderContent/" + folderId);
browseFolder.putExtra("foldername", current.getTitle());
startActivity(browseFolder);
} else if (current.getType().equals("file")) {
Intent showFile = new Intent(getActivity(), FileDetailsActivity.class);
showFile.putExtra("ListEntryItem", current);
showFile.putExtra("ident", ident);
showFile.putExtra("authCode", authCode);
showFile.putExtra("serverUrl", serverUrl);
showFile.putExtra("folderId", folderId);
startActivity(showFile);
}
}
};
return listener;
}
private class DownloadFileList extends AsyncTask<String, ListEntryItem, Boolean> {
private boolean isProjectsDirectory = false;
@Override
protected void onPreExecute() {
((BrowsingActivity) getActivity()).setRefreshingState(true);
}
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) {
String server = params[0];
try {
// TODO: Refactor I/O here and in SetupActivity to central place
HttpClient client = getNewHttpClient();
HttpGet get = new HttpGet(server);
get.setHeader("X-SPARKLE-IDENT", ident);
get.setHeader("X-SPARKLE-AUTH", authCode);
HttpResponse response = client.execute(get);
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();
JSONArray folderList = new JSONArray(sb.toString());
for (int i=0; i<folderList.length(); i++) {
JSONObject json = folderList.getJSONObject(i);
ListEntryItem item = new ListEntryItem();
item.setTitle(json.getString("name"));
item.setId(json.getString("id"));
String type = json.getString("type");
if (type.equals("git")) {
isProjectsDirectory = true;
URI uri = new URI(serverUrl);
item.setSubtitle(uri.getHost());
} if (type.equals("file")) {
item.setFilesize(json.getString("fileSize"));
}
item.setType(json.getString("type"));
if (json.has("url")) {
item.setUrl(json.getString("url"));
}
if (json.has("mimeBase")) {
item.setMimetype(json.getString("mimeBase"));
}
if (json.has("mime")) {
item.setMimetype(json.getString("mime"));
}
publishProgress(item);
}
}
} catch (ClientProtocolException e) {
Log.e("Browsing failed", e.getLocalizedMessage());
return false;
} catch (IOException e) {
Log.e("Browsing failed", e.getLocalizedMessage());
return false;
} catch (JSONException e) {
Log.e("Browsing failed", e.getLocalizedMessage());
return false;
} catch (URISyntaxException e) {
Log.e("Browsing failed", e.getLocalizedMessage());
return false;
}
return true;
}
@Override
protected void onProgressUpdate(ListEntryItem... values) {
adapter.addEntry(values[0]);
}
@Override
protected void onPostExecute(Boolean result) {
((BrowsingActivity) getActivity()).setRefreshingState(false);
getActivity().setTitle(isProjectsDirectory ? getString(R.string.projects) : foldername);
}
}
}