/* * 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.expandable; import org.dodgybits.shuffle.android.core.model.Id; import org.dodgybits.shuffle.android.core.model.Project; import org.dodgybits.shuffle.android.core.model.Task; import org.dodgybits.shuffle.android.core.view.MenuUtils; import org.dodgybits.shuffle.android.list.config.ExpandableListConfig; import org.dodgybits.shuffle.android.list.config.ProjectExpandableListConfig; import org.dodgybits.shuffle.android.list.view.ExpandableProjectView; import org.dodgybits.shuffle.android.list.view.ExpandableTaskView; import org.dodgybits.shuffle.android.list.view.ProjectView; import org.dodgybits.shuffle.android.list.view.TaskView; import org.dodgybits.shuffle.android.persistence.provider.ProjectProvider; import org.dodgybits.shuffle.android.persistence.provider.TaskProvider; import android.database.Cursor; import android.os.Bundle; import android.util.Log; import android.util.SparseIntArray; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.ContextMenu.ContextMenuInfo; import android.widget.ExpandableListAdapter; import android.widget.ExpandableListView; import com.google.inject.Inject; import com.google.inject.Provider; public class ExpandableProjectsActivity extends AbstractExpandableActivity<Project> { private static final String cTag = "ExpandableProjectsActivity"; private int mChildIdColumnIndex; private int mGroupIdColumnIndex; private SparseIntArray mTaskCountArray; @Inject ProjectExpandableListConfig mListConfig; @Inject Provider<ExpandableTaskView> mTaskViewProvider; @Override protected ExpandableListConfig<Project> getListConfig() { return mListConfig; } @Override protected void refreshChildCount() { Cursor cursor = getContentResolver().query( ProjectProvider.Projects.PROJECT_TASKS_CONTENT_URI, ProjectProvider.Projects.FULL_TASK_PROJECTION, null, null, null); mTaskCountArray = getListConfig().getChildPersister().readCountArray(cursor); cursor.close(); } @Override protected Cursor createGroupQuery() { Cursor cursor = managedQuery(ProjectProvider.Projects.CONTENT_URI, ProjectProvider.Projects.FULL_PROJECTION, ProjectProvider.Projects.DELETED + " = 0", null, ProjectProvider.Projects.NAME + " ASC"); mGroupIdColumnIndex = cursor.getColumnIndex(ProjectProvider.Projects._ID); return cursor; } @Override protected int getGroupIdColumnIndex() { return mGroupIdColumnIndex; } @Override protected int getChildIdColumnIndex() { return mChildIdColumnIndex; } @Override protected Cursor createChildQuery(long groupId) { Cursor cursor = managedQuery(TaskProvider.Tasks.CONTENT_URI, TaskProvider.Tasks.FULL_PROJECTION, TaskProvider.Tasks.PROJECT_ID + " = ? AND " + TaskProvider.Tasks.DELETED + "=0", new String[] {String.valueOf(groupId)}, TaskProvider.Tasks.DUE_DATE + " ASC," + TaskProvider.Tasks.DISPLAY_ORDER + " ASC"); mChildIdColumnIndex = cursor.getColumnIndex(TaskProvider.Tasks._ID); return cursor; } @Override protected void updateInsertExtras(Bundle extras, Project project) { extras.putLong(TaskProvider.Tasks.PROJECT_ID, project.getLocalId().getId()); final Id defaultContextId = project.getDefaultContextId(); if (defaultContextId.isInitialised()) { extras.putLong(TaskProvider.Tasks.CONTEXT_ID, defaultContextId.getId()); } } @Override protected ExpandableListAdapter createExpandableListAdapter(Cursor cursor) { return new MyExpandableListAdapter(this, cursor, android.R.layout.simple_expandable_list_item_1, android.R.layout.simple_expandable_list_item_1, new String[] {ProjectProvider.Projects.NAME}, new int[] {android.R.id.text1}, new String[] {TaskProvider.Tasks.DESCRIPTION}, new int[] {android.R.id.text1}) { public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { Cursor cursor = (Cursor) getChild(groupPosition, childPosition); Task task = getListConfig().getChildPersister().read(cursor); TaskView taskView; if (convertView instanceof ExpandableTaskView) { taskView = (ExpandableTaskView) convertView; } else { taskView = mTaskViewProvider.get(); } taskView.setShowContext(true); taskView.setShowProject(false); taskView.updateView(task); return taskView; } public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { Cursor cursor = (Cursor) getGroup(groupPosition); Project project = getListConfig().getGroupPersister().read(cursor); ProjectView projectView; if (convertView instanceof ExpandableProjectView) { projectView = (ExpandableProjectView) convertView; } else { projectView = new ExpandableProjectView(parent.getContext()); } projectView.setTaskCountArray(mTaskCountArray); projectView.updateView(project); return projectView; } }; } @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, view, menuInfo); ExpandableListView.ExpandableListContextMenuInfo info; try { info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo; } catch (ClassCastException e) { Log.e(cTag, "bad menuInfo", e); return; } long packedPosition = info.packedPosition; int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition); int childPosition = ExpandableListView.getPackedPositionChild(packedPosition); boolean isChild = isChild(packedPosition); if (isChild) { MenuUtils.addMoveMenuItems(menu, moveUpPermitted(groupPosition, childPosition), moveDownPermitted(groupPosition, childPosition)); } } @Override public boolean onContextItemSelected(MenuItem item) { ExpandableListView.ExpandableListContextMenuInfo info; try { info = (ExpandableListView.ExpandableListContextMenuInfo) item.getMenuInfo(); } catch (ClassCastException e) { Log.e(cTag, "bad menuInfo", e); return false; } switch (item.getItemId()) { case MenuUtils.MOVE_UP_ID: moveUp(info.packedPosition); return true; case MenuUtils.MOVE_DOWN_ID: moveDown(info.packedPosition); return true; } return super.onContextItemSelected(item); } private boolean moveUpPermitted(int groupPosition,int childPosition) { return childPosition > 0; } private boolean moveDownPermitted(int groupPosition,int childPosition) { int childCount = getExpandableListAdapter().getChildrenCount(groupPosition); return childPosition < childCount - 1; } protected final void moveUp(long packedPosition) { int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition); int childPosition = ExpandableListView.getPackedPositionChild(packedPosition); if (moveUpPermitted(groupPosition, childPosition)) { Cursor cursor = (Cursor) getExpandableListAdapter().getChild( groupPosition, childPosition); getListConfig().getChildPersister().swapTaskPositions(cursor, childPosition - 1, childPosition); } } protected final void moveDown(long packedPosition) { int groupPosition = ExpandableListView.getPackedPositionGroup(packedPosition); int childPosition = ExpandableListView.getPackedPositionChild(packedPosition); if (moveDownPermitted(groupPosition, childPosition)) { Cursor cursor = (Cursor) getExpandableListAdapter().getChild( groupPosition, childPosition); getListConfig().getChildPersister().swapTaskPositions(cursor, childPosition, childPosition + 1); } } }