// Copyright 2015 The Project Buendia Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at: http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software distrib-
// uted under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
// OR CONDITIONS OF ANY KIND, either express or implied. See the License for
// specific language governing permissions and limitations under the License.
package org.projectbuendia.client.ui.lists;
import android.content.Context;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.inputmethod.InputMethodManager;
import android.widget.SearchView;
import com.joanzapata.android.iconify.IconDrawable;
import com.joanzapata.android.iconify.Iconify;
import org.projectbuendia.client.App;
import org.projectbuendia.client.R;
import org.projectbuendia.client.events.CrudEventBus;
import org.projectbuendia.client.events.actions.SyncCancelRequestedEvent;
import org.projectbuendia.client.models.AppModel;
import org.projectbuendia.client.models.Patient;
import org.projectbuendia.client.models.TypedCursor;
import org.projectbuendia.client.sync.SyncManager;
import org.projectbuendia.client.ui.BaseLoggedInActivity;
import org.projectbuendia.client.ui.BigToast;
import org.projectbuendia.client.ui.LoadingState;
import org.projectbuendia.client.ui.UpdateNotificationController;
import org.projectbuendia.client.ui.chart.PatientChartActivity;
import org.projectbuendia.client.ui.dialogs.EditPatientDialogFragment;
import org.projectbuendia.client.ui.dialogs.GoToPatientDialogFragment;
import org.projectbuendia.client.utils.EventBusWrapper;
import org.projectbuendia.client.utils.Utils;
import javax.inject.Inject;
import butterknife.ButterKnife;
import de.greenrobot.event.EventBus;
/**
* A {@link BaseLoggedInActivity} with a {@link SearchView} that filters a patient list.
* Clicking on patients in the list displays details for that patient.
*/
public abstract class BaseSearchablePatientListActivity extends BaseLoggedInActivity {
@Inject AppModel mAppModel;
@Inject EventBus mEventBus;
@Inject CrudEventBus mCrudEventBus;
@Inject SyncManager mSyncManager;
private PatientSearchController mSearchController;
private SearchView mSearchView;
private CancelButtonListener mCancelListener = new CancelButtonListener();
// TODO/i18n: Populate properly.
protected final String mLocale = "en";
public PatientSearchController getSearchController() {
return mSearchController;
}
@Override public void onExtendOptionsMenu(Menu menu) {
super.onExtendOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
menu.findItem(R.id.action_new_patient).setOnMenuItemClickListener(
new MenuItem.OnMenuItemClickListener() {
@Override public boolean onMenuItemClick(MenuItem menuItem) {
Utils.logEvent("add_patient_pressed");
EditPatientDialogFragment.newInstance(null)
.show(getSupportFragmentManager(), null);
return true;
}
});
menu.findItem(R.id.action_go_to).setOnMenuItemClickListener(
new MenuItem.OnMenuItemClickListener() {
@Override public boolean onMenuItemClick(MenuItem menuItem) {
Utils.logUserAction("go_to_patient_pressed");
GoToPatientDialogFragment.newInstance()
.show(getSupportFragmentManager(), null);
return true;
}
});
MenuItem search = menu.findItem(R.id.action_search);
search.setIcon(
new IconDrawable(this, Iconify.IconValue.fa_search)
.color(0xCCFFFFFF)
.sizeDp(36));
search.setVisible(getLoadingState() == LoadingState.LOADED);
MenuItem addPatient = menu.findItem(R.id.action_new_patient);
addPatient.setIcon(
new IconDrawable(this, Iconify.IconValue.fa_plus)
.color(0xCCFFFFFF)
.sizeDp(36));
addPatient.setVisible(getLoadingState() == LoadingState.LOADED);
mSearchView = (SearchView) search.getActionView();
mSearchView.setIconifiedByDefault(false);
MenuItem cancel = menu.findItem(R.id.action_cancel);
cancel.setIcon(
new IconDrawable(this, Iconify.IconValue.fa_close)
.color(0xCCFFFFFF)
.sizeDp(36));
cancel.setOnMenuItemClickListener(mCancelListener);
cancel.setVisible(getLoadingState() == LoadingState.SYNCING);
InputMethodManager mgr =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override public boolean onQueryTextSubmit(String query) {
InputMethodManager mgr = (InputMethodManager) getSystemService(
Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(mSearchView.getWindowToken(), 0);
return true;
}
@Override public boolean onQueryTextChange(String newText) {
mSearchController.onQuerySubmitted(newText);
return true;
}
});
}
@Override protected void onCreateImpl(Bundle savedInstanceState) {
super.onCreateImpl(savedInstanceState);
App.getInstance().inject(this);
mSearchController = new PatientSearchController(
new SearchUi(),
mCrudEventBus,
new EventBusWrapper(mEventBus),
mAppModel,
mSyncManager,
mLocale);
mUpdateNotificationController = new UpdateNotificationController(
new UpdateNotificationUi()
);
ButterKnife.inject(this);
}
@Override protected void onResumeImpl() {
super.onResumeImpl();
mSearchController.init();
mSearchController.loadSearchResults();
}
@Override protected void onPauseImpl() {
super.onPauseImpl();
mSearchController.suspend();
}
protected void setPatients(TypedCursor<Patient> patients) {
// By default, do nothing.
}
private final class SearchUi implements PatientSearchController.Ui {
@Override public void setPatients(TypedCursor<Patient> patients) {
// Delegate to implementers.
BaseSearchablePatientListActivity.this.setPatients(patients);
}
@Override public void goToPatientChart(String patientUuid) {
BigToast.show(BaseSearchablePatientListActivity.this, R.string.patient_creation_success);
PatientChartActivity.start(BaseSearchablePatientListActivity.this, patientUuid);
}
}
private class CancelButtonListener implements MenuItem.OnMenuItemClickListener {
@Override public boolean onMenuItemClick(MenuItem item) {
mEventBus.post(new SyncCancelRequestedEvent());
return true;
}
}
}