package org.sana.android.activity;
import java.util.concurrent.atomic.AtomicBoolean;
import org.sana.R;
import org.sana.net.Response;
import org.sana.android.app.Locales;
import org.sana.android.content.DispatchResponseReceiver;
import org.sana.android.content.Intents;
import org.sana.android.content.Uris;
import org.sana.android.db.ModelWrapper;
import org.sana.android.fragment.EncounterTaskListFragment;
import org.sana.android.fragment.EncounterTaskListCompleteFragment;
import org.sana.android.fragment.EncounterTaskListFragment.OnModelItemSelectedListener;
import org.sana.android.provider.EncounterTasks;
import org.sana.android.provider.Subjects;
import org.sana.android.util.Logf;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentFilter.MalformedMimeTypeException;
import android.net.Uri;
import android.os.Bundle;
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.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 EncounterTaskList extends FragmentActivity implements
OnModelItemSelectedListener {
public static final String TAG = EncounterTaskList.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;
// Fragments
private EncounterTaskListFragment mListFragment;
private EncounterTaskListCompleteFragment mCompleteListFragment;
/** {@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.encountertask_list_activity);
}
/** {@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() == EncounterTaskListFragment.class) {
mListFragment = (EncounterTaskListFragment) fragment;
mListFragment.setOnModelItemSelectedListener(this);
showProgressDialogFragment(getString(R.string.network_synchronizing));
}
else if (fragment.getClass() == EncounterTaskListCompleteFragment.class) {
mCompleteListFragment = (EncounterTaskListCompleteFragment) fragment;
mCompleteListFragment.setOnModelItemSelectedListener(this);
showProgressDialogFragment(getString(R.string.network_synchronizing));;
}
}
@Override
public void onModelItemSelected(long id) {
// A patient was selected so return to caller activity.
Log.i(TAG, ".onModelItemSelected(): selected item: " + id);
Bundle selected = mListFragment.getSelectedData(id);
if(selected != null){
Uri subj = selected.getParcelable(Intents.EXTRA_SUBJECT);
Uri procedure = selected.getParcelable(Intents.EXTRA_PROCEDURE);
Uri task = selected.getParcelable(Intents.EXTRA_TASK_ENCOUNTER);
Intent data = new Intent();
data.setDataAndType(task,EncounterTasks.CONTENT_ITEM_TYPE);
data.putExtra(Intents.EXTRA_SUBJECT, subj);
data.putExtra(Intents.EXTRA_PROCEDURE, procedure);
data.putExtra(Intents.EXTRA_TASK, task);
String status = selected.getString(EncounterTasks.Contract.STATUS);
boolean complete = (status.compareToIgnoreCase("Completed") == 0)? true: false;
if(complete)
data.addCategory(Intents.CATEGORY_TASK_COMPLETE);
// set the notification flag
setResult(RESULT_OK, data);
finish();
} else {
Log.w(TAG, "Why are we not binding position: " + id);
}
}
@Override
public void onPause(){
super.onPause();
if(mWaitDialog != null){
mWaitDialog.dismiss();
mWaitDialog = null;
}
LocalBroadcastManager.getInstance(this.getApplicationContext()).unregisterReceiver(mReceiver);
}
@Override
public void onResume(){
super.onResume();
if(mWaiting.get()){
if(mWaitDialog != null){
Logf.D(TAG, "mUploadingDialog != null && mUploading.get() = true");
mWaitDialog.show();
} else {
Logf.D(TAG, "mUploadingDialog == null && mUploading.get() = true");
mWaitDialog = new ProgressDialog(this);
mWaitDialog.setTitle(R.string.general_upload_in_progress);
mWaitDialog.setCancelable(false);
mWaitDialog.show();
}
}
LocalBroadcastManager.getInstance(this.getApplicationContext()).registerReceiver(mReceiver, buildFilter());
}
public IntentFilter buildFilter(){
IntentFilter filter = new IntentFilter(Response.RESPONSE);
try{
filter.addDataType(EncounterTasks.CONTENT_TYPE);
filter.addDataType(EncounterTasks.CONTENT_ITEM_TYPE);
filter.addDataType(Subjects.CONTENT_TYPE);
} catch (MalformedMimeTypeException e) {
}
return filter;
}
@Override
public void onStart(){
super.onStart();
Log.d(TAG, "onStart()");
//bindService(new Intent(Intent.ACTION_SYNC, Subjects.CONTENT_URI), null, 0);
}
private static final int OPTION_SYNC_PATIENT = 1;
private static final int OPTION_SYNC_TASKS = 2;
private static final int OPTION_CLEAR = 3;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
Locales.updateLocale(this, getString(R.string.force_locale));
menu.add(0, OPTION_SYNC_PATIENT, 0, getString(R.string.title_synch_subjects));
menu.add(0, OPTION_SYNC_TASKS, 1, getString(R.string.title_synch_tasks));
//menu.add(0, OPTION_CLEAR, 2, "CLEAR");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
Uri observer = getIntent().getParcelableExtra(Intents.EXTRA_OBSERVER);
switch (item.getItemId()) {
case OPTION_SYNC_PATIENT:
//getContentResolver().delete(EncounterTasks.CONTENT_URI, null,null);
Log.i(TAG, "observer: " + observer);
if(!Uris.isEmpty(observer)){
Log.i(TAG, "observer: " + observer);
mListFragment.sync(this, Subjects.CONTENT_URI);
}
return true;
case OPTION_SYNC_TASKS:
Log.i(TAG, "observer: " + observer);
if(!Uris.isEmpty(observer)){
String observerUuid = ModelWrapper.getUuid(observer, getContentResolver());
Log.i(TAG, "observer: " + observer);
Uri u = EncounterTasks.CONTENT_URI.buildUpon().appendQueryParameter("assigned_to__uuid",observerUuid).build();
mListFragment.sync(this, u);
}
return true;
case OPTION_CLEAR:
getContentResolver().delete(EncounterTasks.CONTENT_URI, null,null);
return true;
}
return false;
}
ProgressDialog mWaitDialog = null;
AtomicBoolean mWaiting = new AtomicBoolean(false);
void showProgressDialogFragment(String message) {
if (mWaitDialog != null && mWaitDialog.isShowing()) {
hideProgressDialogFragment();
}
// No need to create dialog if this is finishing
if(isFinishing())
return;
mWaitDialog = new ProgressDialog(this);
mWaitDialog.setMessage(message);
mWaitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mWaitDialog.show();
mWaiting.set(true);
}
void hideProgressDialogFragment() {
mWaiting.set(false);
if (mWaitDialog == null) {
return;
}
// dismiss if finishing
try{
if(isFinishing())
mWaitDialog.dismiss();
else
mWaitDialog.hide();
} catch (Exception e){
e.printStackTrace();
}
}
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));
onDispatchResult(intent);
}
};
public final void onDispatchResult(Intent intent){
Log.i(TAG,"onDispatchResult()");
String text = intent.hasExtra(Response.MESSAGE)? intent.getStringExtra(DispatchResponseReceiver.KEY_RESPONSE_MESSAGE): "Upload Result Received: " + intent.getDataString();
int result = intent.getIntExtra(Response.CODE, 400);
Uri uri = intent.getData();
Uri observer = getIntent().getParcelableExtra(Intents.EXTRA_OBSERVER);
int descriptor = Uris.getContentDescriptor(uri);
Log.d(TAG, "....result: " + result );
Log.d(TAG, "....descriptor: " + descriptor );
if(result == 200){
Log.d(TAG, ".... got 200");
switch(descriptor){
case Uris.SUBJECT:
Log.d(TAG, ".... got subject 200");
String observerUuid = ModelWrapper.getUuid(observer, getContentResolver());
Uri u = EncounterTasks.CONTENT_URI.buildUpon().appendQueryParameter("assigned_to__uuid",observerUuid).build();
mListFragment.sync(this, u);
break;
case Uris.ENCOUNTER_TASK:
Log.d(TAG, ".... got EncounterTask 200");
hideProgressDialogFragment();
break;
}
return;
} else if(result == 100){
Log.d(TAG, ".... got 100");
switch(descriptor){
case Uris.SUBJECT:
Log.d(TAG, ".... got subject 100");
break;
case Uris.ENCOUNTER_TASK:
Log.d(TAG, ".... got EncounterTask 100");
break;
}
return;
} else if(result == 400){
Log.e(TAG, ".... got error");
hideProgressDialogFragment();
Toast.makeText(this, R.string.network_synch_error,
Toast.LENGTH_LONG);
} else {
hideProgressDialogFragment();
}
}
}