/*
* Copyright (c) 2014. The Trustees of Indiana University.
*
* This version of the code is licensed under the MPL 2.0 Open Source license with additional
* healthcare disclaimer. If the user is an entity intending to commercialize any application
* that uses this code in a for-profit venture, please contact the copyright holder.
*/
package com.muzima.view.preferences;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AutoCompleteTextView;
import android.widget.ListView;
import android.widget.Toast;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import com.muzima.MuzimaApplication;
import com.muzima.R;
import com.muzima.adapters.concept.AutoCompleteConceptAdapter;
import com.muzima.adapters.concept.SelectedConceptAdapter;
import com.muzima.api.model.Concept;
import com.muzima.utils.StringUtils;
import com.muzima.view.BroadcastListenerActivity;
import com.muzima.view.HelpActivity;
import java.util.ArrayList;
import java.util.List;
import static com.muzima.utils.Constants.DataSyncServiceConstants;
import static com.muzima.utils.Constants.DataSyncServiceConstants.SyncStatusConstants;
public class ConceptPreferenceActivity extends BroadcastListenerActivity {
private static final String TAG = ConceptPreferenceActivity.class.getSimpleName();
private SelectedConceptAdapter selectedConceptAdapter;
private ListView selectedConceptListView;
private AutoCompleteTextView autoCompleteConceptTextView;
private AutoCompleteConceptAdapter autoCompleteConceptAdapter;
private boolean actionModeActive = false;
private ActionMode actionMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getContentView());
selectedConceptListView = (ListView) findViewById(R.id.concept_preference_list);
final MuzimaApplication applicationContext = (MuzimaApplication) getApplicationContext();
selectedConceptAdapter = new SelectedConceptAdapter(this, R.layout.item_concept_list,
(applicationContext).getConceptController());
selectedConceptListView.setAdapter(selectedConceptAdapter);
selectedConceptListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
selectedConceptListView.setSelected(true);
selectedConceptListView.setClickable(true);
selectedConceptListView.setEmptyView(findViewById(R.id.no_concept_added));
selectedConceptListView.setOnItemClickListener(selectedConceptOnClickListener());
autoCompleteConceptTextView = (AutoCompleteTextView) findViewById(R.id.concept_add_concept);
autoCompleteConceptAdapter = new AutoCompleteConceptAdapter(applicationContext, R.layout.item_option_autocomplete, autoCompleteConceptTextView);
autoCompleteConceptTextView.setAdapter(autoCompleteConceptAdapter);
autoCompleteConceptTextView.setOnItemClickListener(autoCompleteOnClickListener());
// this can happen on orientation change
if (actionModeActive) {
actionMode = startActionMode(new DeleteConceptsActionModeCallback());
actionMode.setTitle(String.valueOf(getSelectedConcepts().size()));
}
}
private AdapterView.OnItemClickListener selectedConceptOnClickListener() {
return new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
if (!actionModeActive) {
actionMode = startActionMode(new DeleteConceptsActionModeCallback());
actionModeActive = true;
}
int selectedConceptsCount = getSelectedConcepts().size();
if (selectedConceptsCount == 0 && actionModeActive) {
actionMode.finish();
}
actionMode.setTitle(String.valueOf(selectedConceptsCount));
}
};
}
private AdapterView.OnItemClickListener autoCompleteOnClickListener() {
return new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
Concept selectedConcept = (Concept) parent.getItemAtPosition(position);
if (selectedConceptAdapter.doesConceptAlreadyExist(selectedConcept)) {
Log.e(TAG, "Concept Already exists");
Toast.makeText(ConceptPreferenceActivity.this, "Concept " + selectedConcept.getName() + " already exists", Toast.LENGTH_SHORT).show();
} else {
selectedConceptAdapter.addConcept(selectedConcept);
selectedConceptAdapter.notifyDataSetChanged();
}
autoCompleteConceptTextView.setText(StringUtils.EMPTY);
}
};
}
protected int getContentView() {
return R.layout.activity_concept_preference;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_help:
Intent intent = new Intent(this, HelpActivity.class);
intent.putExtra(HelpActivity.HELP_TYPE, HelpActivity.CUSTOM_CONCEPT_HELP);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
protected void onResume() {
super.onResume();
selectedConceptAdapter.reloadData();
}
@Override
protected void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
int syncStatus = intent.getIntExtra(DataSyncServiceConstants.SYNC_STATUS, SyncStatusConstants.UNKNOWN_ERROR);
int syncType = intent.getIntExtra(DataSyncServiceConstants.SYNC_TYPE, -1);
if (syncType == DataSyncServiceConstants.SYNC_TEMPLATES) {
if (syncStatus == SyncStatusConstants.SUCCESS) {
selectedConceptAdapter.reloadData();
}
}
}
protected View setupMainView(LayoutInflater inflater, ViewGroup container) {
return inflater.inflate(R.layout.layout_list, container, false);
}
public final class DeleteConceptsActionModeCallback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
getMenuInflater().inflate(R.menu.actionmode_menu_delete, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.menu_delete:
List<Concept> selectedConcepts = getSelectedConcepts();
selectedConceptAdapter.removeAll(selectedConcepts);
onCompleteOfConceptDelete(selectedConcepts.size());
}
return false;
}
private void onCompleteOfConceptDelete(int numberOfDeletedConcepts) {
endActionMode();
selectedConceptListView.clearChoices();
selectedConceptAdapter.reloadData();
Toast.makeText(getApplicationContext(), getString(R.string.info_concept_delete_success, numberOfDeletedConcepts), Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
actionModeActive = false;
selectedConceptAdapter.clearSelectedForms();
}
}
public void endActionMode() {
if (actionMode != null) {
actionMode.finish();
}
}
private List<Concept> getSelectedConcepts() {
List<Concept> concepts = new ArrayList<Concept>();
SparseBooleanArray checkedItemPositions = selectedConceptListView.getCheckedItemPositions();
for (int i = 0; i < checkedItemPositions.size(); i++) {
if (checkedItemPositions.valueAt(i)) {
concepts.add(((Concept) selectedConceptListView.getItemAtPosition(checkedItemPositions.keyAt(i))));
}
}
return concepts;
}
}