package org.greengin.sciencetoolkit.common.ui.remote;
import java.util.Vector;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.greengin.sciencetoolkit.common.R;
import org.greengin.sciencetoolkit.common.logic.remote.RemoteApi;
import org.greengin.sciencetoolkit.common.logic.remote.RemoteJsonAction;
import org.greengin.sciencetoolkit.common.ui.base.AppSettingsActivity;
import org.greengin.sciencetoolkit.common.ui.base.RemoteCapableActivity;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.content.BroadcastReceiver;
public abstract class ProjectBrowserActivity extends RemoteCapableActivity
implements ProjectMembershipListener {
public static final String REMOTE_PROJECT_DATA_EVENT_FILTER = "REMOTE_PROJECT_DATA_EVENT_FILTER";
String projectType;
ProjectBrowserListAdapter adapter;
BroadcastReceiver loginEventReceiver;
BroadcastReceiver projectsEventReceiver;
TextView status;
Button loginToggle;
ListView list;
public ProjectBrowserActivity(String projectType) {
super();
this.projectType = projectType;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_project_browser);
loginEventReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateView();
if (RemoteApi.get().isLogged()) {
remoteRequest(new ProjectMembershipAction());
}
}
};
projectsEventReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
adapter.notifyDataSetChanged();
}
};
adapter = new ProjectBrowserListAdapter(this, LayoutInflater.from(this));
status = (TextView) findViewById(R.id.login_status);
loginToggle = (Button) findViewById(R.id.login_toggle);
list = (ListView) findViewById(R.id.project_list);
list.setAdapter(adapter);
loginToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (RemoteApi.get().isLogged()) {
RemoteApi.get().logout();
} else {
RemoteApi.get().tryToLogin(ProjectBrowserActivity.this);
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.project_browser, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
Intent intent = new Intent(getApplicationContext(), AppSettingsActivity.class);
startActivity(intent);
return true;
} else if (id == R.id.action_application_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(this).registerReceiver(
loginEventReceiver,
new IntentFilter(RemoteApi.REMOTE_LOGIN_EVENT_FILTER));
LocalBroadcastManager.getInstance(this).registerReceiver(
projectsEventReceiver,
new IntentFilter(REMOTE_PROJECT_DATA_EVENT_FILTER));
updateView();
if (RemoteApi.get().isLogged()) {
remoteRequest(new ProjectMembershipAction());
}
}
@Override
public void onPause() {
super.onPause();
LocalBroadcastManager.getInstance(this).unregisterReceiver(
loginEventReceiver);
LocalBroadcastManager.getInstance(this).unregisterReceiver(
projectsEventReceiver);
}
@Override
public void projectMembershipAction(long projectId, boolean join) {
remoteRequest(new ProjectMembershipAction(join ? "join" : "leave",
projectId));
}
private void updateView() {
if (RemoteApi.get().isLogged()) {
loginToggle.setText(R.string.project_browser_logout);
status.setText(String.format(
getResources()
.getString(R.string.project_browser_logged_in),
RemoteApi.get().getUsername()));
list.setVisibility(View.VISIBLE);
adapter.notifyDataSetChanged();
} else {
loginToggle.setText(R.string.project_browser_login);
status.setText(R.string.project_browser_not_logged);
list.setVisibility(View.GONE);
}
findViewById(R.id.project_browser_header).invalidate();
Log.d("stk projects", "updated");
}
/**
* Example of server output:
* <p>
* [ {"id":11,"title":"Fastest lift in the UK","author":"author","joined":
* false}, {"id":32768,"title":"lifts!","author":"evilfer","joined":false} ]
*/
private class ProjectMembershipAction extends RemoteJsonAction {
String action;
long projectId;
public ProjectMembershipAction() {
this(null, 0);
}
public ProjectMembershipAction(String action, long projectId) {
this.projectId = projectId;
this.action = action;
}
@Override
public HttpRequestBase[] createRequests(String urlBase) {
HttpRequestBase[] requests = new HttpRequestBase[1];
if (action == null) {
requests[0] = new HttpGet(String.format("%sprojects/%s",
urlBase, projectType));
} else {
requests[0] = new HttpPut(String.format("%sprojects/%s/%d/%s",
urlBase, projectType, projectId, action));
}
return requests;
}
@Override
public void result(int request, JSONObject shouldbenull,
JSONArray result) {
Log.d("stk remote", "projects: " + result.length());
Vector<ProjectData> projects = new Vector<ProjectData>();
try {
for (int i = 0; i < result.length(); i++) {
JSONObject obj = result.getJSONObject(i);
ProjectData p = new ProjectData();
p.id = obj.getLong("id");
p.title = obj.getString("title");
p.joined = obj.getBoolean("joined");
p.author = obj.getString("author");
projects.add(p);
}
} catch (JSONException e) {
e.printStackTrace();
}
adapter.updateProjectList(projects);
Intent i = new Intent(REMOTE_PROJECT_DATA_EVENT_FILTER);
LocalBroadcastManager.getInstance(getApplicationContext())
.sendBroadcast(i);
projectMembershipUpdated();
}
}
protected abstract void projectMembershipUpdated();
}