package de.andlabs.teleporter;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Map;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.sqlite.SQLiteDatabase;
import android.location.Location;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.Preference.OnPreferenceClickListener;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class DownloadsActivity extends PreferenceActivity implements OnPreferenceClickListener {
private static final String TAG = "Settings";
private ProgressDialog progress;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(getString(R.string.downloads_activity_titel));
getPreferenceManager().setSharedPreferencesName("autocompletion");
setPreferenceScreen(getPreferenceManager().createPreferenceScreen(this));
// clean up (autocompletion downloads deleted on sdcard)
final Map<String, ?> vals = getPreferenceManager().getSharedPreferences().getAll();
getPreferenceManager().getSharedPreferences().edit().clear().commit();
File dir = new File(Environment.getExternalStorageDirectory().getPath()+"/teleporter");
if (!dir.exists()) dir.mkdir();
for (String file : dir.list()) {
CheckBoxPreference c = new CheckBoxPreference(this);
getPreferenceScreen().addItemFromInflater(c);
c.setKey(file);
c.setTitle(file.split("_")[0]);
c.setSummary(file.substring(file.indexOf("_")+1, file.lastIndexOf(".")));
if (vals.containsKey(file)) {
c.setChecked((Boolean)vals.get(file));
}
}
if (getPreferenceScreen().getPreferenceCount() == 0)
new FetchNearbyDownloads().execute("");
}
@Override
public boolean onPreferenceClick(final Preference preference) {
new AlertDialog.Builder(DownloadsActivity.this)
.setTitle(preference.getTitle())
.setMessage(preference.getSummary())
.setPositiveButton(getString(R.string.dialog_yes), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new Download().execute((preference.getKey()));
}
})
.setNegativeButton(getString(R.string.dialog_no), new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
((CheckBoxPreference)preference).setChecked(false);
getPreferenceScreen().getSharedPreferences().edit().remove(preference.getKey()).commit();
}
})
.show();
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.settings, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
new FetchNearbyDownloads().execute("");
return super.onOptionsItemSelected(item);
}
private class Download extends AsyncTask<String, String, Boolean> {
@Override
protected void onPreExecute() {
progress = new ProgressDialog(DownloadsActivity.this);
progress.setMessage(getString(R.string.downloading_prog_dnld));
progress.show();
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
try {
new DefaultHttpClient().execute(
new HttpGet("http://may.base45.de:3000/downloads/"+params[0])).getEntity()
.writeTo(
new FileOutputStream(new File("/sdcard/teleporter/"+params[0])));
progress.setProgress(50);
// progress.setMessage(getString(R.string.downloading_prog_indx));
SQLiteDatabase newDB = SQLiteDatabase.openDatabase("/sdcard/teleporter/"+params[0], null, SQLiteDatabase.OPEN_READWRITE);
newDB.execSQL("CREATE INDEX nameIdx ON places (name);");
newDB.close();
getPreferenceScreen().getSharedPreferences().edit().putBoolean(params[0], true).commit();
} catch (Exception e) {
Log.e(TAG, "error while downloading "+params[0]);
return false;
}
return true;
}
@Override
protected void onPostExecute(Boolean success) {
super.onPostExecute(success);
progress.dismiss();
if (!success)
Toast.makeText(DownloadsActivity.this, getString(R.string.download_error), Toast.LENGTH_LONG).show();
}
}
private class FetchNearbyDownloads extends AsyncTask<String, String, JSONArray> {
@Override
protected void onPreExecute() {
progress = new ProgressDialog(DownloadsActivity.this);
progress.setMessage(getString(R.string.downloads_fetch_progress));
progress.show();
super.onPreExecute();
}
@Override
protected JSONArray doInBackground(String... params) {
try {
Location loc = ((LocationManager)getSystemService(LOCATION_SERVICE)).getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (loc == null)
loc = ((LocationManager)getSystemService(LOCATION_SERVICE)).getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (loc == null) { // fallback berlin
loc = new Location(LocationManager.GPS_PROVIDER);
loc.setLatitude(52.5);
loc.setLongitude(13.4);
}
URL url = new URL("http://may.base45.de:3000/downloads.json?lat="+loc.getLatitude()+"&lon="+loc.getLongitude());
return new JSONArray(new BufferedReader(new InputStreamReader(url.openStream())).readLine());
} catch (Exception e) {
Log.e(TAG, "problem location or internet");
return null;
}
}
@Override
protected void onPostExecute(JSONArray json) {
try {
for (int i = 0; i < json.length(); i++) {
JSONObject j = json.getJSONObject(i).getJSONObject("download");
if (!getPreferenceScreen().getSharedPreferences().contains(j.getString("file"))) {
CheckBoxPreference c = new CheckBoxPreference(DownloadsActivity.this);
c.setKey(j.getString("file"));
String title = j.getString("title");
c.setTitle(title.split(" ")[0]);
c.setSummary(title.substring(title.indexOf(" ")));
c.setOnPreferenceClickListener(DownloadsActivity.this);
getPreferenceScreen().addItemFromInflater(c);
}
}
} catch (Exception e) {
Toast.makeText(DownloadsActivity.this, getString(R.string.download_error), Toast.LENGTH_LONG).show();
}
progress.dismiss();
super.onPostExecute(json);
}
}
}