package org.intermine.app.activity; /* * Copyright (C) 2015 InterMine * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. See the LICENSE file for more * information or http://www.gnu.org/copyleft/lesser.html. * */ import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v7.widget.Toolbar; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.AbsListView; import android.widget.ListView; import org.intermine.app.R; import org.intermine.app.adapter.MinesAdapter; import org.intermine.app.dialog.MineDialogFragment; import org.intermine.app.storage.Storage; import org.intermine.app.util.Collections; import java.util.HashSet; import java.util.Map; import java.util.Set; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import butterknife.OnItemClick; /** * @author Daria Komkova <Daria_Komkova @ hotmail.com> */ public class MinesActivity extends BaseActivity implements MineDialogFragment.MineDialogListener { @Inject Storage mStorage; @InjectView(R.id.mines_list) ListView mMinesList; private MinesAdapter mAdapter; private AbsListView.MultiChoiceModeListener mMultiListener = new AbsListView.MultiChoiceModeListener() { @Override public void onItemCheckedStateChanged(ActionMode mode, int pos, long id, boolean checked) { } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater menuInflater = mode.getMenuInflater(); menuInflater.inflate(R.menu.mine_context, menu); getSupportActionBar().hide(); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.delete: Set<String> selectedMineNames = mStorage.getSelectedMineNames(); Set<String> mineNames = mStorage.getMineNames(); SparseBooleanArray checkedItemIds = mMinesList.getCheckedItemPositions(); for (int i = 0; i < checkedItemIds.size(); i++) { String mineName = (String) mAdapter.getItem(checkedItemIds.keyAt(i)); if (selectedMineNames.contains(mineName)) { selectedMineNames.remove(mineName); } if (mineNames.contains(mineName)) { mineNames.remove(mineName); } mStorage.setMineUrl(mineName, null); } mStorage.setMineNames(mineNames); mStorage.setSelectedMineNames(selectedMineNames); updateMines(); mode.finish(); return true; default: return false; } } @Override public void onDestroyActionMode(ActionMode mode) { getSupportActionBar().show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mines_activity); ButterKnife.inject(this); Toolbar toolbar = (Toolbar) findViewById(R.id.default_toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); mAdapter = new MinesAdapter(this); mMinesList.setAdapter(mAdapter); mMinesList.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL); mMinesList.setMultiChoiceModeListener(mMultiListener); updateMines(); } @Override public boolean onCreateOptionsMenu(Menu menu) { return true; } @Override protected void onPause() { super.onPause(); Map<String, Boolean> minesToState = mAdapter.getMinesToState(); Set<String> selectedMineNames = new HashSet<>(); for (String mineName : minesToState.keySet()) { if (minesToState.get(mineName)) { selectedMineNames.add(mineName); } } mStorage.setSelectedMineNames(selectedMineNames); } @OnItemClick(R.id.mines_list) public void showMineEditDialog(int position) { String mineName = (String) mAdapter.getItem(position); MineDialogFragment.newInstance(mineName, mStorage.getMineUrl(mineName)).show(getFragmentManager(), MineDialogFragment.MINE_DIALOG_TAG); } @OnClick(R.id.fab) public void showAddMineDialog() { MineDialogFragment.newInstance().show(getFragmentManager(), MineDialogFragment.MINE_DIALOG_TAG); } @Override public void onMineAdded(String mineName, String mineUrl) { Set<String> selectedMineNames = mStorage.getSelectedMineNames(); Set<String> mineNames = mStorage.getMineNames(); mineNames.add(mineName); selectedMineNames.add(mineName); mStorage.setMineNames(mineNames); mStorage.setSelectedMineNames(selectedMineNames); mStorage.setMineUrl(mineName, mineUrl); updateMines(); } @Override public void onMineEdited(String oldMineName, String mineName, String mineUrl) { Set<String> selectedMineNames = mStorage.getSelectedMineNames(); Set<String> mineNames = mStorage.getMineNames(); if (selectedMineNames.contains(oldMineName)) { selectedMineNames.remove(oldMineName); } if (mineNames.contains(oldMineName)) { mineNames.remove(oldMineName); } mStorage.setMineUrl(oldMineName, null); mStorage.setMineUrl(mineName, mineUrl); mineNames.add(mineName); selectedMineNames.add(mineName); mStorage.setMineNames(mineNames); mStorage.setSelectedMineNames(selectedMineNames); updateMines(); } private void updateMines() { Set<String> minesNames = mStorage.getMineNames(); Set<String> selectedMinesNames = mStorage.getSelectedMineNames(); Map<String, Boolean> minesToState = Collections.newHashMap(); for (String mine : minesNames) { minesToState.put(mine, selectedMinesNames.contains(mine)); } mAdapter.updateMines(minesToState); } }