1c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu/* 2c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Copyright (C) 2013 The Android Open Source Project 3c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * 4c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Licensed under the Apache License, Version 2.0 (the "License"); 5c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * you may not use this file except in compliance with the License. 6c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * You may obtain a copy of the License at 7c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * 8c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * http://www.apache.org/licenses/LICENSE-2.0 9c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * 10c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Unless required by applicable law or agreed to in writing, software 11c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * distributed under the License is distributed on an "AS IS" BASIS, 12c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * See the License for the specific language governing permissions and 14c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * limitations under the License. 15c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 16c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 17c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescupackage com.android.photos; 18c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 19c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.app.Activity; 20c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.app.Fragment; 21c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.os.Bundle; 22c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.os.Handler; 23c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.util.SparseBooleanArray; 24c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.view.LayoutInflater; 25c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.view.View; 26c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.view.ViewGroup; 27c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.view.animation.AnimationUtils; 28c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.widget.AdapterView; 29c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.widget.GridView; 30c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.widget.ListAdapter; 31c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport android.widget.TextView; 32c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 33c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescuimport com.android.gallery3d.R; 34c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 35c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescupublic abstract class MultiSelectGridFragment extends Fragment 36c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu implements MultiChoiceManager.Delegate, AdapterView.OnItemClickListener { 37c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 38c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu final private Handler mHandler = new Handler(); 39c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 40c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu final private Runnable mRequestFocus = new Runnable() { 41559535174c8c70f12a342fe46f00647c31080383Bobby Georgescu @Override 42c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void run() { 43c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.focusableViewAvailable(mGrid); 44c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 45c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu }; 46c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 47c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ListAdapter mAdapter; 48c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu GridView mGrid; 49c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu TextView mEmptyView; 50c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu View mProgressContainer; 51c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu View mGridContainer; 52c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu CharSequence mEmptyText; 53c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu boolean mGridShown; 54c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu MultiChoiceManager.Provider mHost; 55c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 56c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public MultiSelectGridFragment() { 57c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 58c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 59c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 60c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Provide default implementation to return a simple grid view. Subclasses 61c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * can override to replace with their own layout. If doing so, the returned 62c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * view hierarchy <em>must</em> have a GridView whose id is 63c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * {@link android.R.id#grid android.R.id.list} and can optionally have a 64c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * sibling text view id {@link android.R.id#empty android.R.id.empty} that 65c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * is to be shown when the grid is empty. 66c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 67c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 68c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public View onCreateView(LayoutInflater inflater, ViewGroup container, 69c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu Bundle savedInstanceState) { 70c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return inflater.inflate(R.layout.multigrid_content, container, false); 71c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 72c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 73c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 74c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void onAttach(Activity activity) { 75c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu super.onAttach(activity); 76c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mHost = (MultiChoiceManager.Provider) activity; 77c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mGrid != null) { 78c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.setMultiChoiceModeListener(mHost.getMultiChoiceManager()); 79c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 80c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 81c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 82c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 83c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void onDetach() { 84c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu super.onDetach(); 85c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mHost = null; 86c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 87c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 88c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 89c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Attach to grid view once the view hierarchy has been created. 90c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 91c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 92c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void onViewCreated(View view, Bundle savedInstanceState) { 93c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu super.onViewCreated(view, savedInstanceState); 94c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ensureGrid(); 95c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 96c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 97c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 98c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Detach from grid view. 99c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 100c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 101c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void onDestroyView() { 102c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mHandler.removeCallbacks(mRequestFocus); 103c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid = null; 104c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridShown = false; 105c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mEmptyView = null; 106c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer = mGridContainer = null; 107c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu super.onDestroyView(); 108c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 109c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 110c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 111c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * This method will be called when an item in the grid is selected. 112c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Subclasses should override. Subclasses can call 113c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * getGridView().getItemAtPosition(position) if they need to access the data 114c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * associated with the selected item. 115c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * 116c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param g The GridView where the click happened 117c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param v The view that was clicked within the GridView 118c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param position The position of the view in the grid 119c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param id The id of the item that was clicked 120c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 121c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void onGridItemClick(GridView g, View v, int position, long id) { 122c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 123c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 124c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 125c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Provide the cursor for the grid view. 126c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 127c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void setAdapter(ListAdapter adapter) { 128c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu boolean hadAdapter = mAdapter != null; 129c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mAdapter = adapter; 130c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mGrid != null) { 131c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.setAdapter(adapter); 132c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (!mGridShown && !hadAdapter) { 133c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu // The grid was hidden, and previously didn't have an 134c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu // adapter. It is now time to show it. 135c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu setGridShown(true, getView().getWindowToken() != null); 136c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 137c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 138c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 139c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 140c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 141c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Set the currently selected grid item to the specified position with the 142c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * adapter's data 143c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * 144c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param position 145c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 146c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void setSelection(int position) { 147c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ensureGrid(); 148c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.setSelection(position); 149c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 150c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 151c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 152c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Get the position of the currently selected grid item. 153c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 154c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public int getSelectedItemPosition() { 155c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ensureGrid(); 156c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return mGrid.getSelectedItemPosition(); 157c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 158c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 159c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 160c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Get the cursor row ID of the currently selected grid item. 161c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 162c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public long getSelectedItemId() { 163c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ensureGrid(); 164c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return mGrid.getSelectedItemId(); 165c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 166c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 167c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 168c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Get the activity's grid view widget. 169c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 170c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public GridView getGridView() { 171c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ensureGrid(); 172c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return mGrid; 173c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 174c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 175c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 176c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * The default content for a MultiSelectGridFragment has a TextView that can 177c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * be shown when the grid is empty. If you would like to have it shown, call 178c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * this method to supply the text it should use. 179c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 180c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void setEmptyText(CharSequence text) { 181c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ensureGrid(); 182c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mEmptyView == null) { 183c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return; 184c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 185c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mEmptyView.setText(text); 186c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mEmptyText == null) { 187c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.setEmptyView(mEmptyView); 188c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 189c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mEmptyText = text; 190c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 191c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 192c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 193c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Control whether the grid is being displayed. You can make it not 194c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * displayed if you are waiting for the initial data to show in it. During 195c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * this time an indeterminate progress indicator will be shown instead. 196c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * <p> 197c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Applications do not normally need to use this themselves. The default 198c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * behavior of MultiSelectGridFragment is to start with the grid not being 199c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * shown, only showing it once an adapter is given with 200c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * {@link #setAdapter(ListAdapter)}. If the grid at that point had not been 201c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * shown, when it does get shown it will be do without the user ever seeing 202c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * the hidden state. 203c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * 204c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param shown If true, the grid view is shown; if false, the progress 205c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * indicator. The initial value is true. 206c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 207c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void setGridShown(boolean shown) { 208c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu setGridShown(shown, true); 209c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 210c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 211c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 212c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Like {@link #setGridShown(boolean)}, but no animation is used when 213c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * transitioning from the previous state. 214c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 215c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void setGridShownNoAnimation(boolean shown) { 216c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu setGridShown(shown, false); 217c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 218c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 219c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 220c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Control whether the grid is being displayed. You can make it not 221c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * displayed if you are waiting for the initial data to show in it. During 222c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * this time an indeterminate progress indicator will be shown instead. 223c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * 224c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param shown If true, the grid view is shown; if false, the progress 225c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * indicator. The initial value is true. 226c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * @param animate If true, an animation will be used to transition to the 227c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * new state. 228c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 229c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu private void setGridShown(boolean shown, boolean animate) { 230c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ensureGrid(); 231c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mProgressContainer == null) { 232c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu throw new IllegalStateException("Can't be used with a custom content view"); 233c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 234c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mGridShown == shown) { 235c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return; 236c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 237c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridShown = shown; 238c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (shown) { 239c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (animate) { 240c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer.startAnimation(AnimationUtils.loadAnimation( 241c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu getActivity(), android.R.anim.fade_out)); 242c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridContainer.startAnimation(AnimationUtils.loadAnimation( 243c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu getActivity(), android.R.anim.fade_in)); 244c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } else { 245c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer.clearAnimation(); 246c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridContainer.clearAnimation(); 247c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 248c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer.setVisibility(View.GONE); 249c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridContainer.setVisibility(View.VISIBLE); 250c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } else { 251c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (animate) { 252c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer.startAnimation(AnimationUtils.loadAnimation( 253c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu getActivity(), android.R.anim.fade_in)); 254c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridContainer.startAnimation(AnimationUtils.loadAnimation( 255c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu getActivity(), android.R.anim.fade_out)); 256c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } else { 257c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer.clearAnimation(); 258c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridContainer.clearAnimation(); 259c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 260c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer.setVisibility(View.VISIBLE); 261c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridContainer.setVisibility(View.GONE); 262c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 263c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 264c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 265c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu /** 266c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu * Get the ListAdapter associated with this activity's GridView. 267c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu */ 268c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public ListAdapter getAdapter() { 269559535174c8c70f12a342fe46f00647c31080383Bobby Georgescu return mGrid.getAdapter(); 270c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 271c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 272c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu private void ensureGrid() { 273c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mGrid != null) { 274c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return; 275c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 276c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu View root = getView(); 277c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (root == null) { 278c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu throw new IllegalStateException("Content view not yet created"); 279c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 280c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (root instanceof GridView) { 281c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid = (GridView) root; 282c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } else { 283c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu View empty = root.findViewById(android.R.id.empty); 284c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (empty != null && empty instanceof TextView) { 285c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mEmptyView = (TextView) empty; 286c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 287c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mProgressContainer = root.findViewById(R.id.progressContainer); 288c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridContainer = root.findViewById(R.id.gridContainer); 289c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu View rawGridView = root.findViewById(android.R.id.list); 290c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (!(rawGridView instanceof GridView)) { 291c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu throw new RuntimeException( 292c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu "Content has view with id attribute 'android.R.id.list' " 293c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu + "that is not a GridView class"); 294c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 295c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid = (GridView) rawGridView; 296c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mGrid == null) { 297c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu throw new RuntimeException( 298c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu "Your content must have a GridView whose id attribute is " + 299c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu "'android.R.id.list'"); 300c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 301c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mEmptyView != null) { 302c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.setEmptyView(mEmptyView); 303c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 304c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 305c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGridShown = true; 306c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.setOnItemClickListener(this); 307c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mGrid.setMultiChoiceModeListener(mHost.getMultiChoiceManager()); 308c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mAdapter != null) { 309c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu ListAdapter adapter = mAdapter; 310c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mAdapter = null; 311c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu setAdapter(adapter); 312c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } else { 313c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu // We are starting without an adapter, so assume we won't 314c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu // have our data right away and start with the progress indicator. 315c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu if (mProgressContainer != null) { 316c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu setGridShown(false, false); 317c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 318c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 319c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu mHandler.post(mRequestFocus); 320c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 321c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 322c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 323c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public Object getItemAtPosition(int position) { 324559535174c8c70f12a342fe46f00647c31080383Bobby Georgescu return getAdapter().getItem(position); 325c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 326c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 327c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 328c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public Object getPathForItemAtPosition(int position) { 329c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return getPathForItem(getItemAtPosition(position)); 330c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 331c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 332c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 333c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public SparseBooleanArray getSelectedItemPositions() { 334c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return mGrid.getCheckedItemPositions(); 335c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 336c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 337c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 338c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public int getSelectedItemCount() { 339c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu return mGrid.getCheckedItemCount(); 340c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 341c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 342c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public abstract Object getPathForItem(Object item); 343c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu 344c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu @Override 345c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 346c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu onGridItemClick((GridView) parent, v, position, id); 347c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu } 348c1a015f3b9a896179d2b4778e50988460cfd34fbBobby Georgescu} 349