/******************************************************************************* * This file is part of Zandy. * * Zandy is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Zandy is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Zandy. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package com.gimranov.zandy.app; import java.util.ArrayList; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.gimranov.zandy.app.data.Database; import com.gimranov.zandy.app.data.Item; import com.gimranov.zandy.app.data.ItemCollection; import com.gimranov.zandy.app.task.APIRequest; import com.gimranov.zandy.app.task.ZoteroAPITask; /** * This Activity handles displaying and editing collection memberships for a * given item. * * @author ajlyon * */ public class CollectionMembershipActivity extends ListActivity { private static final String TAG = "com.gimranov.zandy.app.CollectionMembershipActivity"; static final int DIALOG_CONFIRM_NAVIGATE = 4; static final int DIALOG_COLLECTION_LIST = 1; private String itemKey; private String itemTitle; private Database db; /** * For API <= 7, where we can't pass Bundles to dialogs */ private Bundle b = new Bundle(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); db = new Database(this); /* Get the incoming data from the calling activity */ itemKey = getIntent().getStringExtra("com.gimranov.zandy.app.itemKey"); Item item = Item.load(itemKey, db); if (item == null) { Log.e(TAG, "Null item for key: "+itemKey); finish(); } itemTitle = item.getTitle(); this.setTitle(getResources().getString(R.string.collections_for_item, itemTitle)); ArrayList<ItemCollection> rows = ItemCollection.getCollections(item, db); setListAdapter(new ArrayAdapter<ItemCollection>(this, R.layout.list_data, rows) { @Override public View getView(int position, View convertView, ViewGroup parent) { View row; // We are reusing views, but we need to initialize it if null if (null == convertView) { LayoutInflater inflater = getLayoutInflater(); row = inflater.inflate(R.layout.list_data, null); } else { row = convertView; } /* Our layout has just two fields */ TextView tvLabel = (TextView) row.findViewById(R.id.data_label); tvLabel.setText(""); TextView tvContent = (TextView) row.findViewById(R.id.data_content); tvContent.setText(getItem(position).getTitle()); return row; } }); ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { // Warning here because Eclipse can't tell whether my ArrayAdapter is // being used with the correct parametrization. @SuppressWarnings("unchecked") public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // If we have a click on an entry, prompt to view that tag's items. ArrayAdapter<ItemCollection> adapter = (ArrayAdapter<ItemCollection>) parent.getAdapter(); ItemCollection row = adapter.getItem(position); Bundle b = new Bundle(); b.putString("itemKey", itemKey); b.putString("collectionKey", row.getKey()); CollectionMembershipActivity.this.b = b; removeDialog(DIALOG_CONFIRM_NAVIGATE); showDialog(DIALOG_CONFIRM_NAVIGATE); } }); } @Override public void onDestroy() { if (db != null) db.close(); super.onDestroy(); } @Override public void onResume() { if (db == null) db = new Database(this); super.onResume(); } protected Dialog onCreateDialog(int id) { final String collectionKey = b.getString("collectionKey"); final String itemKey = b.getString("itemKey"); AlertDialog dialog; switch (id) { case DIALOG_COLLECTION_LIST: AlertDialog.Builder builder = new AlertDialog.Builder(this); final ArrayList<ItemCollection> collections = ItemCollection.getCollections(db); int size = collections.size(); String[] collectionNames = new String[size]; for (int i = 0; i < size; i++) { collectionNames[i] = collections.get(i).getTitle(); } builder.setTitle(getResources().getString(R.string.choose_parent_collection)) .setItems(collectionNames, new DialogInterface.OnClickListener() { @SuppressWarnings("unchecked") public void onClick(DialogInterface dialog, int pos) { Item item = Item.load(itemKey, db); collections.get(pos).add(item, false, db); collections.get(pos).saveChildren(db); ArrayAdapter<ItemCollection> la = (ArrayAdapter<ItemCollection>) getListAdapter(); la.clear(); for (ItemCollection b : ItemCollection.getCollections(item,db)) { la.add(b); } la.notifyDataSetChanged(); } }); dialog = builder.create(); return dialog; case DIALOG_CONFIRM_NAVIGATE: dialog = new AlertDialog.Builder(this) .setTitle(getResources().getString(R.string.collection_membership_detail)) .setPositiveButton(getResources().getString(R.string.tag_view), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Intent i = new Intent(getBaseContext(), ItemActivity.class); i.putExtra("com.gimranov.zandy.app.collectionKey", collectionKey); startActivity(i); } }).setNeutralButton(getResources().getString(R.string.cancel), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // do nothing } }).setNegativeButton(getResources().getString(R.string.collection_remove_item), new DialogInterface.OnClickListener() { @SuppressWarnings("unchecked") public void onClick(DialogInterface dialog, int whichButton) { Item item = Item.load(itemKey, db); ItemCollection coll = ItemCollection.load(collectionKey, db); coll.remove(item, false, db); ArrayAdapter<ItemCollection> la = (ArrayAdapter<ItemCollection>) getListAdapter(); la.clear(); for (ItemCollection b : ItemCollection.getCollections(item,db)) { la.add(b); } la.notifyDataSetChanged(); } }).create(); return dialog; default: Log.e(TAG, "Invalid dialog requested"); return null; } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.zotero_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.do_sync: if (!ServerCredentials.check(getApplicationContext())) { Toast.makeText(getApplicationContext(), getResources().getString(R.string.sync_log_in_first), Toast.LENGTH_SHORT).show(); return true; } Log.d(TAG, "Preparing sync requests"); new ZoteroAPITask(getBaseContext()).execute(APIRequest.update(Item.load(itemKey, db))); Toast.makeText(getApplicationContext(), getResources().getString(R.string.sync_started), Toast.LENGTH_SHORT).show(); return true; case R.id.do_new: Bundle b = new Bundle(); b.putString("itemKey", itemKey); removeDialog(DIALOG_COLLECTION_LIST); this.b = b; showDialog(DIALOG_COLLECTION_LIST); return true; case R.id.do_prefs: startActivity(new Intent(this, SettingsActivity.class)); return true; default: return super.onOptionsItemSelected(item); } } }