package org.sana.android.activity;
import org.sana.R;
import org.sana.android.Constants;
import org.sana.android.app.Locales;
import org.sana.android.app.Preferences;
import org.sana.android.content.DispatchResponseReceiver;
import org.sana.android.content.Intents;
import org.sana.android.content.Uris;
import org.sana.android.content.core.PatientWrapper;
import org.sana.android.db.ModelWrapper;
import org.sana.android.fragment.PatientListFragment;
import org.sana.android.fragment.PatientListFragment.OnPatientSelectedListener;
import org.sana.android.provider.Encounters;
import org.sana.android.provider.Patients;
import org.sana.android.provider.Procedures;
import org.sana.android.provider.Subjects;
import org.sana.android.service.impl.DispatchService;
import org.sana.android.util.SanaUtil;
import org.sana.android.widget.ScrollCompleteListener;
import org.sana.net.Response;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
/** Activity for creating new and display existing patients. The resulting
* patient selected or created, will be returned to the calling Activity.
*
* @author Sana Development Team */
public class PatientsList extends FragmentActivity implements
OnPatientSelectedListener, ScrollCompleteListener {
public static final String TAG = PatientsList.class.getSimpleName();
/** Intent extra for a patient's ID. */
public static final String EXTRA_PATIENT_ID = "extra_patient_id";
public static final int INVALID_PATIENT_ID = -1;
// Activity request codes
/** Intent request code for creating a new patient. */
private static final int CREATE_PATIENT = 2;
// Fragments
private PatientListFragment mFragmentPatientList;
private boolean mAdmin = true;
protected BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Extract data included in the Intent
Log.d(TAG, "context: " + context.getClass().getSimpleName() +
", intent: " + intent.toUri(Intent.URI_INTENT_SCHEME));
handleBroadcast(intent);
}
};
protected ProgressDialog mProgressDialog = null;
/** {@inheritDoc} */
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onStart()");
super.onCreate(savedInstanceState);
Locales.updateLocale(this, getString(R.string.force_locale));
setContentView(R.layout.patient_list_activity);
// Set the registration disabled by default
findViewById(R.id.register).setEnabled(false);
}
/** {@inheritDoc} */
@Override
public void onAttachFragment(Fragment fragment) {
Log.d(TAG, "onStart()");
super.onAttachFragment(fragment);
Locales.updateLocale(this, getString(R.string.force_locale));
if (fragment.getClass() == PatientListFragment.class) {
mFragmentPatientList = (PatientListFragment) fragment;
mFragmentPatientList.setOnPatientSelectedListener(this);
mFragmentPatientList.setOnScrollCompleteListener(this);
if(mFragmentPatientList.sync(this, Subjects.CONTENT_URI)) {
showProgressDialog(getString(R.string.general_synchronizing),
getString(R.string.general_fetching_patients));
}
}
}
/** {@inheritDoc} */
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
SanaUtil.logActivityResult(TAG, requestCode, resultCode);
switch (requestCode) {
case CREATE_PATIENT:
if (resultCode == RESULT_OK) {
onPatientSelected(data.getData());
} else {
}
break;
}
}
/** {@inheritDoc} */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
/*
if(mAdmin)
getMenuInflater().inflate(R.menu.patients_list_menu_admin, menu);
else
getMenuInflater().inflate(R.menu.patients_list_menu, menu);
*/
return super.onCreateOptionsMenu(menu);
}
/** {@inheritDoc} */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_new_patient:
registerNewPatient();
return true;
case R.id.menu_sync_patients:
getContentResolver().delete(Subjects.CONTENT_URI, null,null);
mFragmentPatientList.syncForced(this, Subjects.CONTENT_URI);
return true;
case R.id.menu_delete_patients:
getContentResolver().delete(Subjects.CONTENT_URI, null,null);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
// Starts PatientRunnerFragment for creating a new patient.
private void registerNewPatient() {
Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT,
Subjects.CONTENT_URI);
//Toast.makeText(this, "Not available.", Toast.LENGTH_LONG);
startActivityForResult(intent, CREATE_PATIENT);
}
/** {@inheritDoc} */
@Override
public void onPatientSelected(long patientId) {
Log.i(TAG, "onPatientSelected(long)");
// A patient was selected so return to caller activity.
//Intent data = getIntent();
Uri uri = ContentUris.withAppendedId(Patients.CONTENT_URI,patientId);
Log.d(TAG,"...patient selected: " + uri);
Intent data = new Intent();
data.setDataAndType(uri,Patients.CONTENT_ITEM_TYPE);
data.putExtra(EXTRA_PATIENT_ID, patientId);
data.putExtra(Intents.EXTRA_SUBJECT, uri);
setResult(RESULT_OK, data);
finish();
}
public void onPatientSelected(Uri uri) {
Log.i(TAG, "onPatientSelected(long)");
// A patient was selected so return to caller activity.
//Intent data = getIntent();
Log.d(TAG,"...patient selected: " + uri);
Intent data = new Intent();
data.setDataAndType(uri,Patients.CONTENT_ITEM_TYPE);
//data.putExtra(EXTRA_PATIENT_ID, patientId);
data.putExtra(Intents.EXTRA_SUBJECT, uri);
setResult(RESULT_OK, data);
finish();
}
@Override
public void onStart(){
super.onStart();
Log.d(TAG, "onStart()");
//bindService(new Intent(Intent.ACTION_SYNC, Subjects.CONTENT_URI), null, 0);
}
@Override
public void onPause() {
super.onPause();
hideProgressDialog();
LocalBroadcastManager.getInstance(
getApplicationContext()).unregisterReceiver(mReceiver);
}
@Override
public void onResume() {
super.onResume();
registerLocalBroadcastReceiver(mReceiver);
}
Binder mBinder = null;
boolean mBound = false;
protected ServiceConnection mConnection = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mBinder = (Binder) service;
mBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
mBinder = null;
mBound = false;
}
};
protected void handleBroadcast(Intent intent){
Log.i(TAG,"handleBroadcast(Intent)");
// Extract data included in the Intent
Log.d(TAG, "...intent: " + ((intent != null)?
intent.toUri(Intent.URI_INTENT_SCHEME):
"null"
));
int result = intent.getIntExtra(Response.CODE, 400);
Log.d(TAG, "...code=" + result);
if (result == 100) {
Log.d(TAG, "...code=100, CONTINUE" );
// do nothing
} else if (result == 200){
Log.d(TAG, "...code=" + result + ", unknown");
hideProgressDialog();
} else if (result >= 400){
}
}
public void showProgressDialog(String title, String message){
Log.i(TAG,"hideProgressDialog(String,String)");
hideProgressDialog();
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setTitle(title);
mProgressDialog.setMessage(message);
mProgressDialog.show();
}
public void hideProgressDialog(){
Log.i(TAG, "hideProgressDialog()");
if(mProgressDialog != null){
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
public IntentFilter buildFilter(){
Log.i(TAG,"buildFilter()");
IntentFilter filter = new IntentFilter(Response.RESPONSE);
filter.addDataScheme(Subjects.CONTENT_URI.getScheme());
try {
filter.addDataType(Subjects.CONTENT_TYPE);
filter.addDataType(Subjects.CONTENT_ITEM_TYPE);
} catch (IntentFilter.MalformedMimeTypeException e) {
}
return filter;
}
protected void registerLocalBroadcastReceiver(BroadcastReceiver receiver, IntentFilter filter){
Log.i(TAG, "registerLocalBroadcastReceiver(BroadcastReceiver,IntentFilter)");
LocalBroadcastManager.getInstance(
getApplicationContext()).registerReceiver(receiver, filter);
}
protected void registerLocalBroadcastReceiver(BroadcastReceiver receiver){
Log.i(TAG, "registerLocalBroadcastReceiver(BroadcastReceiver)");
IntentFilter filter = buildFilter();
registerLocalBroadcastReceiver(receiver, filter);
}
public void submit(View view){
Intent intent = null;
switch(view.getId()){
case R.id.register:
// TODO Should really use an asset file
int resId = getProcedureResourceId("registration_short");
// Default to english version
resId = (resId != 0)? resId: R.raw.registration_short_en;
// build launch intent
intent = new Intent(Intents.ACTION_RUN_PROCEDURE);
intent.setDataAndType(Patients.CONTENT_URI, Subjects.CONTENT_TYPE)
.putExtra(Intents.EXTRA_PROCEDURE, Uris.withAppendedUuid(Procedures.CONTENT_URI,
getString(R.string.procs_subject_short_form)))
.putExtra(Intents.EXTRA_PROCEDURE_ID, resId);
startActivityForResult(intent, CREATE_PATIENT);
break;
case R.id.sync:
getContentResolver().delete(Subjects.CONTENT_URI, null,null);
mFragmentPatientList.syncForced(this, Subjects.CONTENT_URI);
break;
default:
}
}
public void onScrollComplete(){
Log.i(TAG, "onScrollComplete");
View v = findViewById(R.id.register);
v.setEnabled(true);
}
public int getProcedureResourceId(String name){
String localeStr = Preferences.getString(this, Constants.PREFERENCE_LOCALE);
String localizedName = String.format("%s_%s", name, localeStr);
int resId = getResources().getIdentifier(localizedName, "raw", getPackageName());
return resId;
}
}