package monakhv.android.samlib; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.database.Cursor; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.widget.SimpleCursorAdapter; import android.util.Log; import android.util.SparseBooleanArray; import android.view.*; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import com.j256.ormlite.android.AndroidDatabaseResults; import monakhv.android.samlib.dialogs.EnterStringDialog; import monakhv.samlib.db.AuthorController; import monakhv.samlib.db.SQLController; import monakhv.samlib.db.TagController; import monakhv.samlib.db.entity.Author; import monakhv.samlib.db.entity.Tag; import monakhv.samlib.service.AuthorGuiState; import java.util.ArrayList; import java.util.List; /* * Copyright 2015 Dmitry Monakhov * * 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 * distributed 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 the specific language governing permissions and * limitations under the License. * * 4/9/15. */ public class AuthorTagFragment extends MyBaseAbstractFragment { public interface AuthorTagCallback{ AuthorGuiState getAuthorGuiState(); void onFinish(long id); } private static final String DEBUG_TAG = "AuthorTagFragment"; private long author_id=0; private SimpleCursorAdapter adapter; private AuthorTagCallback mCallBack; private boolean addVisible = false; private ListView listView; private TagController mTagController; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle extra =getActivity(). getIntent().getExtras(); if (extra != null){ author_id =extra.getLong(AuthorTagsActivity.AUTHOR_ID); } mTagController = getAuthorController().getTagController(); String[] from = {SQLController.COL_TAG_NAME}; int[] to = {android.R.id.text1}; Cursor attributesCursor = getCursor(); adapter = new SimpleCursorAdapter( getActivity(), android.R.layout.simple_list_item_multiple_choice, attributesCursor, from, to, 0); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.tags_fargment, container, false); Log.i(DEBUG_TAG, "Done making view author_id = "+author_id); listView = (ListView) view.findViewById(R.id.listTags); listView.setAdapter(adapter); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); listView.setItemsCanFocus(false); registerForContextMenu(listView); Button bt; bt = (Button)view.findViewById(R.id.addTagBt); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { addTag(); } }); bt = (Button) view.findViewById(R.id.cancelTags); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { cancelClick(); } }); bt = (Button) view.findViewById(R.id.okTags); bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { okClick(); } }); return view; } @Override public void onResume() { super.onResume(); Log.d(DEBUG_TAG, "onResume"); loadTagData(); } @Override public void onAttach(Context activity) { super.onAttach(activity); if (!(activity instanceof AuthorTagCallback)) { throw new IllegalStateException( "Activity must implement fragment's callbacks."); } mCallBack = (AuthorTagCallback) activity; } public long getAuthor_id() { return author_id; } private int delete_menu_id = 1; private int edit_menu_id = 2; private Cursor cursor = null; @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { cursor = null; if (v.getId() == R.id.listTags) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; cursor = (Cursor) adapter.getItem(info.position); menu.add(1, delete_menu_id, 2, getText(R.string.menu_delete)); menu.add(1, edit_menu_id, 1, getText(R.string.menu_edit)); } } private Dialog tagRemoveAlert() { AlertDialog.Builder adb = new AlertDialog.Builder(getActivity()); adb.setTitle(R.string.Attention); String tagName = cursor.getString(cursor.getColumnIndex(SQLController.COL_TAG_NAME)); String msg = getString(R.string.alert_tag_delete); msg = msg.replaceAll("__", tagName); adb.setMessage(msg); adb.setIcon(android.R.drawable.ic_dialog_alert); adb.setPositiveButton(R.string.Yes, deleteTagListener); adb.setNegativeButton(R.string.No, deleteTagListener); return adb.create(); } private DialogInterface.OnClickListener deleteTagListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { switch (which) { case Dialog.BUTTON_POSITIVE: if (cursor != null) { Tag tag = mTagController.getById(cursor.getInt(cursor.getColumnIndex(SQLController.COL_ID))); mTagController.delete(tag); cursor = null; getSamlibOperation().makeUpdateTags(mCallBack.getAuthorGuiState()); refreshList(); } break; case Dialog.BUTTON_NEGATIVE: break; } } }; @Override public boolean onContextItemSelected(MenuItem item) { if (item.getItemId() == delete_menu_id) { Dialog alert = tagRemoveAlert(); alert.show(); } if (item.getItemId() == edit_menu_id && cursor != null) { final Tag tag = mTagController.getById(cursor.getInt(cursor.getColumnIndex(SQLController.COL_ID))); EnterStringDialog dialog = new EnterStringDialog(getActivity(), new EnterStringDialog.ClickListener() { public void okClick(String txt) { tag.setName(txt); mTagController.update(tag); getSamlibOperation().makeUpdateTags(mCallBack.getAuthorGuiState()); refreshList(); } },getText(R.string.tag_edit_title).toString(),tag.getName()); dialog.show(); } return super.onContextItemSelected(item); } /** * User pre Ok button * */ public void okClick() { SparseBooleanArray checked = listView.getCheckedItemPositions(); List<Tag> tags = new ArrayList<>(); for (int i = 0; i < checked.size(); i++) { if (checked.valueAt(i)) { Object o = listView.getItemAtPosition(checked.keyAt(i)); Cursor cur = (Cursor) o;//selected cursors Log.d(DEBUG_TAG, "okClick: selected: " + cur.getString(cur.getColumnIndex(SQLController.COL_TAG_NAME))); tags.add(mTagController.getById(cur.getInt(cur.getColumnIndex(SQLController.COL_ID)))); } } final AuthorController sql = getAuthorController(); Author a = sql.getById(author_id); sql.syncTags(a, tags); getSamlibOperation().makeUpdateTags(mCallBack.getAuthorGuiState()); getSettingsHelper().requestBackup(); a=sql.getById(author_id); //Log.d(DEBUG_TAG, "okClick: " + a.getName() + ": " + a.getAll_tags_name() + " - " + a.getTagIds().size() + " = " + a.getTag2Authors().size()); for (Integer ii : a.getTagIds()){ Log.d(DEBUG_TAG, "okClick: tagId -" +ii); } cancelClick(); } public void setAuthor_id(long author_id) { this.author_id = author_id; loadTagData(); } /** * Get selected TAGs to display in the ListView * * @return Cursor */ private Cursor getCursor() { AndroidDatabaseResults results = (AndroidDatabaseResults) mTagController.getRowResult(); return results.getRawCursor(); } /** * Add new Tag into DB * * */ public void addTag() { EditText editText = (EditText) getActivity().findViewById(R.id.addTagText); if (editText == null) { Log.e(DEBUG_TAG, "add tag textEdit not found!"); return; } String text = editText.getText().toString(); if (text.equalsIgnoreCase("")) { Log.i(DEBUG_TAG, "can not add empty tag"); return; } Log.i(DEBUG_TAG, "adding tag: " + text + " ..."); Tag tag = new Tag(text); mTagController.insert(tag); addVisible = !addVisible; editText.setText(""); View v =getActivity(). findViewById(R.id.add_tag_panel); v.setVisibility(View.GONE); refreshList(); } /** * Reread tags from the cursor */ private void refreshList() { adapter.swapCursor(getCursor()); } /** * Mark selected tags for the author */ private void loadTagData() { if (listView == null){ return; } int size =listView.getAdapter().getCount(); final AuthorController sql = getAuthorController(); Author a = sql.getById(author_id); if (a==null){ Log.e(DEBUG_TAG,"loadTagData: author is NULL"); return; } for (int i = 0; i < size; i++) { Cursor cur = (Cursor) listView.getAdapter().getItem(i); int tag_id = cur.getInt(cur.getColumnIndex(SQLController.COL_ID)); listView.setItemChecked(i, a.getTagIds().contains(tag_id)); } } /** * User press cancel button * */ public void cancelClick() { mCallBack.onFinish(author_id); } public void panelFlip(){ addVisible = !addVisible; View v = getActivity().findViewById(R.id.add_tag_panel); if (addVisible) { v.setVisibility(View.VISIBLE); } else { v.setVisibility(View.GONE); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.tags_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { int sel = item.getItemId(); if (sel == android.R.id.home ){ mCallBack.onFinish(getAuthor_id()); return true; } if (sel == R.id.add_option_item) { panelFlip(); return true; } return super.onOptionsItemSelected(item); } }