/*
* Copyright (C) 2009 Android Shuffle Open Source Project
*
* 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.
*/
package org.dodgybits.shuffle.android.list.activity.task;
import org.dodgybits.android.shuffle.R;
import org.dodgybits.shuffle.android.core.model.Task;
import org.dodgybits.shuffle.android.core.model.persistence.TaskPersister;
import org.dodgybits.shuffle.android.core.view.MenuUtils;
import org.dodgybits.shuffle.android.list.activity.AbstractListActivity;
import org.dodgybits.shuffle.android.list.config.TaskListConfig;
import org.dodgybits.shuffle.android.list.view.SwipeListItemListener;
import org.dodgybits.shuffle.android.list.view.SwipeListItemWrapper;
import org.dodgybits.shuffle.android.list.view.TaskView;
import org.dodgybits.shuffle.android.persistence.provider.TaskProvider;
import roboguice.inject.InjectView;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.internal.Nullable;
public abstract class AbstractTaskListActivity extends AbstractListActivity<Task>
implements SwipeListItemListener, View.OnClickListener {
private static final String cTag = "AbstractTaskListActivity";
@Inject Provider<TaskView> mTaskViewProvider;
@InjectView(R.id.add_task_button) @Nullable Button mAddTaskButton;
protected Button mOtherButton;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
// register self as swipe listener
SwipeListItemWrapper wrapper = (SwipeListItemWrapper) findViewById(R.id.swipe_wrapper);
wrapper.setSwipeListItemListener(this);
// lookup and setup icons in icon_bar (if present)
if (mAddTaskButton != null) {
Drawable addIcon = getResources().getDrawable(android.R.drawable.ic_menu_add);
addIcon.setBounds(0, 0, 24, 24);
mAddTaskButton.setCompoundDrawables(addIcon, null, null, null);
mAddTaskButton.setOnClickListener(this);
mOtherButton = (Button) findViewById(R.id.other_button);
mOtherButton.setText(R.string.title_delete_completed_preference);
Drawable deleteIcon = getResources().getDrawable(android.R.drawable.ic_menu_delete);
deleteIcon.setBounds(0, 0, 24, 24);
mOtherButton.setCompoundDrawables(deleteIcon, null, null, null);
mOtherButton.setVisibility(View.VISIBLE);
mOtherButton.setOnClickListener(this);
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, view, menuInfo);
// ... add complete command.
MenuUtils.addCompleteMenuItem(menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info;
try {
info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
} catch (ClassCastException e) {
Log.e(cTag, "bad menuInfo", e);
return false;
}
switch (item.getItemId()) {
case MenuUtils.COMPLETE_ID:
toggleComplete(info.position);
return true;
}
return super.onContextItemSelected(item);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.add_task_button:
startActivityForResult(getInsertIntent(), NEW_ITEM);
break;
case R.id.other_button:
onOtherButtonClicked();
break;
}
}
protected TaskPersister getTaskPersister() {
return ((TaskListConfig)getListConfig()).getTaskPersister();
}
protected void onOtherButtonClicked() {
int deletedTasks = getTaskPersister().deleteCompletedTasks();
CharSequence message = getString(R.string.clean_task_message, new Object[] {deletedTasks});
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
@Override
protected Intent getClickIntent(Uri uri) {
return new Intent(Intent.ACTION_EDIT, uri);
}
@Override
protected ListAdapter createListAdapter(Cursor cursor) {
ListAdapter adapter = new SimpleCursorAdapter(this,
R.layout.list_task_view, cursor,
new String[] { TaskProvider.Tasks.DESCRIPTION },
new int[] { R.id.description }) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d(cTag, "getView position=" + position + ". Old view=" + convertView);
Cursor cursor = (Cursor)getItem(position);
Task task = getListConfig().getPersister().read(cursor);
TaskView taskView;
if (convertView instanceof TaskView) {
taskView = (TaskView) convertView;
} else {
taskView = mTaskViewProvider.get();
}
taskView.setShowContext(showTaskContext());
taskView.setShowProject(showTaskProject());
taskView.updateView(task);
return taskView;
}
};
return adapter;
}
public void onListItemSwiped(int position) {
toggleComplete(position);
}
protected final void toggleComplete() {
toggleComplete(getSelectedItemPosition());
}
protected final void toggleComplete(int position) {
if (position >= 0 && position < getItemCount())
{
Cursor c = (Cursor) getListAdapter().getItem(position);
getTaskPersister().toggleTaskComplete(c);
}
}
protected boolean showTaskContext() {
return true;
}
protected boolean showTaskProject() {
return true;
}
}