package com.ushahidi.android.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.ushahidi.android.app.checkin.CheckinActivity;
import com.ushahidi.android.app.util.ApiUtils;
import com.ushahidi.android.app.util.Util;
public class Dashboard extends Activity {
public void onClickHome(View v) {
goHome(this);
}
/**
* Handle the click on the search button.
*
* @param v View
* @return void
*/
public void onClickSearch(View v) {
onSearchRequested();
}
public void onSearchDeployments(View v) {
Intent intent = new Intent(Dashboard.this, DeploymentSearch.class);
startActivityForResult(intent, REQUEST_CODE_DEPLOYMENT_SEARCH);
setResult(RESULT_OK);
}
/**
* Handle the click on the About button.
*
* @param v View
* @return void
*/
public void onClickAdd(View v) {
startActivity(new Intent(getApplicationContext(), Object.class));
}
/**
* Go back to the home activity.
*
* @param context Context
* @return void
*/
public void goHome(Context context) {
final Intent intent = new Intent(context, Dashboard.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(intent);
}
/**
* Use the activity label to set the text in the activity's title text view.
* The argument gives the name of the view.
* <p>
* This method is needed because we have a custom title bar rather than the
* default Android title bar. See the theme definitons in styles.xml.
*
* @param textViewId int
* @return void
*/
public void setTitleFromActivityLabel(int textViewId) {
TextView tv = (TextView)findViewById(textViewId);
if (tv != null)
tv.setText(getTitle());
} // end setTitleText
/** Called when the activity is first created. */
private static final int ADD_INCIDENT = Menu.FIRST + 1;
private static final int LIST_INCIDENT = Menu.FIRST + 2;
private static final int INCIDENT_MAP = Menu.FIRST + 3;
private static final int SETTINGS = Menu.FIRST + 4;
private static final int ABOUT = Menu.FIRST + 5;
private static final int SYNC = Menu.FIRST + 6;
private static final int LIST_INCIDENTS = 0;
private static final int MAP_INCIDENTS = 1;
private static final int ADD_INCIDENTS = 2;
private static final int INCIDENTS = 3;
private static final int VIEW_SETTINGS = 4;
private static final int REQUEST_CODE_DEPLOYMENT_SEARCH = 1;
private static final int REQUEST_CODE_ABOUT = 2;
private static final int REQUEST_CODE_SETTINGS = 3;
private static final int DIALOG_PROMPT = 0;
private static final int DIALOG_ERROR = 1;
private Handler mHandler;
private Button listBtn;
private Button addBtn;
private Button checkinListBtn;
private Button checkinAddBtn;
private Button settingsBtn;
private Button mapBtn;
private Button aboutBtn;
private Button searchBtn;
private LinearLayout middleGrid;
private Bundle bundle;
private boolean refreshState = false;
// Checkin specific variables and functions
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.dashboard);
setTitleFromActivityLabel(R.id.title_text);
mHandler = new Handler();
bundle = new Bundle();
// load settings
Preferences.loadSettings(this);
// check for default deployment
checkDefaultDeployment();
// check if domain has been set
promptForDeployment();
listBtn = (Button)findViewById(R.id.incident_list);
checkinListBtn = (Button)findViewById(R.id.checkin_list_btn);
addBtn = (Button)findViewById(R.id.incident_add);
checkinAddBtn = (Button)findViewById(R.id.checkin_add_btn);
settingsBtn = (Button)findViewById(R.id.deployment_settings);
mapBtn = (Button)findViewById(R.id.incident_map);
searchBtn = (Button)findViewById(R.id.deployment_search);
aboutBtn = (Button)findViewById(R.id.deployment_about);
initializeUI();
}
/**
* Prompt user for deployment because there is not default deployment set.
*/
protected void promptForDeployment() {
// check if domain has been set
if (Preferences.domain.length() == 0 || Preferences.domain.equals("http://")) {
mHandler.post(mDisplayPrompt);
}
}
/**
* Check if default deployment has been set.
*/
private void checkDefaultDeployment() {
try {
// Check if default domain has been set.
final String deployment = getString(R.string.deployment_url);
if (!TextUtils.isEmpty(deployment)) {
Log.i("Dashboard", "Determing if default deployment has been set " + deployment);
// validate URL
if (ApiUtils.validateUshahidiInstance(deployment)) {
Log.i("Dashboard", "Validate Domain " + deployment);
middleGrid = (LinearLayout)findViewById(R.id.middle_grid);
middleGrid.setVisibility(View.GONE);
Preferences.domain = deployment;
Preferences.saveSettings(this);
// refresh for new reports
if (Preferences.appRunsFirstTime == 0) {
refreshReports();
Preferences.appRunsFirstTime = 1;
Preferences.saveSettings(this);
}
}
}
} catch (Exception ex) {
Log.e("Dashboard", "checkDefaultDeployment Exception", ex);
}
}
public void onRefreshReports(View v) {
refreshReports();
}
private void refreshReports() {
// load settings
Preferences.loadSettings(this);
// make sure there is a deployment to fetch reports/checkins from
if (Preferences.domain.length() == 0 || Preferences.domain.equals("http://")) {
mHandler.post(mDisplayPrompt);
} else {
ReportsTask reportsTask = new ReportsTask();
reportsTask.appContext = this;
reportsTask.execute();
}
}
@Override
public void onResume() {
promptForDeployment();
initializeUI();
super.onResume();
}
/**
* Initializes some of the UI components and test
*/
protected void initializeUI() {
Preferences.loadSettings(this);
// This is to temporarily disable reports stuff
if (Preferences.isCheckinEnabled == 1) {
listBtn.setVisibility(View.GONE);
addBtn.setVisibility(View.GONE);
checkinListBtn.setVisibility(View.VISIBLE);
checkinAddBtn.setVisibility(View.VISIBLE);
} else {
listBtn.setVisibility(View.VISIBLE);
addBtn.setVisibility(View.VISIBLE);
checkinListBtn.setVisibility(View.GONE);
checkinAddBtn.setVisibility(View.GONE);
}
listBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Dashboard.this, IncidentTab.class);
startActivityForResult(intent, INCIDENTS);
setResult(RESULT_OK);
}
});
checkinListBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Dashboard.this, IncidentTab.class);
startActivityForResult(intent, INCIDENTS);
setResult(RESULT_OK);
}
});
settingsBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Dashboard.this, Settings.class);
startActivityForResult(intent, VIEW_SETTINGS);
setResult(RESULT_OK);
}
});
addBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Dashboard.this, IncidentAdd.class);
startActivityForResult(intent, ADD_INCIDENTS);
setResult(RESULT_OK);
}
});
checkinAddBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent checkinActivityIntent = new Intent().setClass(Dashboard.this,
CheckinActivity.class);
startActivity(checkinActivityIntent);
setResult(RESULT_OK);
}
});
searchBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(Dashboard.this, DeploymentSearch.class);
startActivityForResult(intent, REQUEST_CODE_DEPLOYMENT_SEARCH);
setResult(RESULT_OK);
}
});
aboutBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent launchIntent = new Intent(Dashboard.this, About.class);
startActivityForResult(launchIntent, REQUEST_CODE_ABOUT);
setResult(RESULT_OK);
}
});
mapBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
bundle.putInt("tab_index", 1);
Intent launchIntent = new Intent(Dashboard.this, IncidentTab.class);
launchIntent.putExtra("tab", bundle);
startActivityForResult(launchIntent, MAP_INCIDENTS);
setResult(RESULT_OK);
}
});
}
public void onAddReport(View v) {
Preferences.loadSettings(Dashboard.this);
if (Preferences.isCheckinEnabled == 1) {
Intent checkinActivityIntent = new Intent().setClass(Dashboard.this,
CheckinActivity.class);
startActivity(checkinActivityIntent);
setResult(RESULT_OK);
} else {
Intent intent = new Intent(Dashboard.this, IncidentAdd.class);
startActivityForResult(intent, ADD_INCIDENTS);
setResult(RESULT_OK);
}
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_PROMPT: {
AlertDialog dialog = (new AlertDialog.Builder(this)).create();
dialog.setTitle(R.string.ushahidi_setup_title);
dialog.setMessage(getString(R.string.ushahidi_setup_blub));
dialog.setButton2(getString(R.string.btn_ok), new Dialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Dashboard.this, DeploymentSearch.class);
startActivityForResult(intent, REQUEST_CODE_DEPLOYMENT_SEARCH);
dialog.dismiss();
}
});
dialog.setCancelable(false);
return dialog;
}
case DIALOG_ERROR: {
AlertDialog dialog = (new AlertDialog.Builder(this)).create();
dialog.setTitle(R.string.alert_dialog_error_title);
dialog.setMessage(getString(R.string.ushahidi_setup_blub));
dialog.setButton2(getString(R.string.btn_ok), new Dialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Dashboard.this, Settings.class);
startActivityForResult(intent, REQUEST_CODE_SETTINGS);
dialog.dismiss();
}
});
dialog.setCancelable(false);
return dialog;
}
}
return null;
}
final Runnable mDisplayPrompt = new Runnable() {
public void run() {
showDialog(DIALOG_PROMPT);
}
};
final Runnable mDisplayErrorPrompt = new Runnable() {
public void run() {
showDialog(DIALOG_ERROR);
}
};
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_SETTINGS:
if (resultCode != RESULT_OK) {
break;
}
break;
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
populateMenu(menu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
populateMenu(menu);
return (super.onCreateOptionsMenu(menu));
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// applyMenuChoice(item);
return (applyMenuChoice(item) || super.onOptionsItemSelected(item));
}
@Override
public boolean onContextItemSelected(MenuItem item) {
return (applyMenuChoice(item) || super.onContextItemSelected(item));
}
private void updateRefreshStatus() {
findViewById(R.id.refresh_report_btn)
.setVisibility(refreshState ? View.GONE : View.VISIBLE);
findViewById(R.id.title_refresh_progress).setVisibility(
refreshState ? View.VISIBLE : View.GONE);
}
private void populateMenu(Menu menu) {
MenuItem i;
if (Preferences.isCheckinEnabled == 1) {
i = menu.add(Menu.NONE, ADD_INCIDENT, Menu.NONE, R.string.checkin_btn);
i.setIcon(R.drawable.menu_add);
} else {
i = menu.add(Menu.NONE, ADD_INCIDENT, Menu.NONE, R.string.incident_menu_add);
i.setIcon(R.drawable.menu_add);
}
if (Preferences.isCheckinEnabled == 1) {
i = menu.add(Menu.NONE, LIST_INCIDENT, Menu.NONE, R.string.checkin_list);
i.setIcon(R.drawable.menu_list);
} else {
i = menu.add(Menu.NONE, LIST_INCIDENT, Menu.NONE, R.string.incident_list);
i.setIcon(R.drawable.menu_list);
}
i = menu.add(Menu.NONE, INCIDENT_MAP, Menu.NONE, R.string.incident_menu_map);
i.setIcon(R.drawable.menu_map);
i = menu.add(Menu.NONE, SYNC, Menu.NONE, R.string.menu_sync);
i.setIcon(R.drawable.menu_refresh);
i = menu.add(Menu.NONE, SETTINGS, Menu.NONE, R.string.menu_settings);
i.setIcon(R.drawable.menu_settings);
i = menu.add(Menu.NONE, ABOUT, Menu.NONE, R.string.menu_about);
i.setIcon(R.drawable.menu_about);
}
private boolean applyMenuChoice(MenuItem item) {
Intent launchIntent;
switch (item.getItemId()) {
case LIST_INCIDENT:
bundle.putInt("tab_index", 0);
launchIntent = new Intent(Dashboard.this, IncidentTab.class);
launchIntent.putExtra("tab", bundle);
startActivityForResult(launchIntent, LIST_INCIDENTS);
setResult(RESULT_OK);
return true;
case INCIDENT_MAP:
bundle.putInt("tab_index", 1);
launchIntent = new Intent(Dashboard.this, IncidentTab.class);
launchIntent.putExtra("tab", bundle);
startActivityForResult(launchIntent, MAP_INCIDENTS);
setResult(RESULT_OK);
return true;
case ADD_INCIDENT:
if (Preferences.isCheckinEnabled == 1) {
launchIntent = new Intent(Dashboard.this, CheckinActivity.class);
startActivityForResult(launchIntent, ADD_INCIDENTS);
setResult(RESULT_OK);
} else {
launchIntent = new Intent(Dashboard.this, IncidentAdd.class);
startActivityForResult(launchIntent, ADD_INCIDENTS);
setResult(RESULT_OK);
}
return true;
case ABOUT:
launchIntent = new Intent(Dashboard.this, About.class);
startActivityForResult(launchIntent, REQUEST_CODE_ABOUT);
setResult(RESULT_OK);
return true;
case SETTINGS:
launchIntent = new Intent().setClass(Dashboard.this, Settings.class);
// Make it a subactivity so we know when it returns
startActivityForResult(launchIntent, REQUEST_CODE_SETTINGS);
setResult(RESULT_OK);
return true;
case SYNC:
this.checkDefaultDeployment();
this.refreshReports();
return true;
}
return false;
}
// thread class
private class ReportsTask extends AsyncTask<Void, Void, Integer> {
protected Integer status;
private ProgressDialog dialog;
protected Context appContext;
@Override
protected void onPreExecute() {
refreshState = true;
updateRefreshStatus();
this.dialog = ProgressDialog.show(appContext, getString(R.string.please_wait),
getString(R.string.loading), true);
}
@Override
protected Integer doInBackground(Void... params) {
ApiUtils.checkForCheckin(appContext);
if (Preferences.isCheckinEnabled == 0) {
status = ApiUtils.processReports(appContext);
} else {
status = ApiUtils.processCheckins(appContext);
}
return status;
}
@Override
protected void onPostExecute(Integer result) {
if (result == 4) {
Util.showToast(appContext, R.string.internet_connection);
} else if (result == 3) {
Util.showToast(appContext, R.string.invalid_ushahidi_instance);
} else if (result == 2) {
Util.showToast(appContext, R.string.could_not_fetch_reports);
} else if (result == 1) {
Util.showToast(appContext, R.string.could_not_fetch_reports);
} else {
Util.showToast(appContext, R.string.reports_successfully_fetched);
}
this.dialog.cancel();
refreshState = false;
updateRefreshStatus();
}
}
}