TitlesFragment.java revision f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6
19f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas/* 29f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * Copyright (C) 2011 The Android Open Source Project 39f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * 49f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * Licensed under the Apache License, Version 2.0 (the "License"); 59f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * you may not use this file except in compliance with the License. 69f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * You may obtain a copy of the License at 79f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * 89f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * http://www.apache.org/licenses/LICENSE-2.0 99f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * 109f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * Unless required by applicable law or agreed to in writing, software 119f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * distributed under the License is distributed on an "AS IS" BASIS, 129f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * See the License for the specific language governing permissions and 149f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas * limitations under the License. 159f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas */ 169f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 179f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucaspackage com.example.android.hcgallery; 189f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 19821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucasimport android.app.Fragment; 20821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucasimport android.app.FragmentManager; 219f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.app.ListFragment; 229f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.content.ClipData; 23f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurikimport android.content.res.Resources; 24f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurikimport android.content.res.TypedArray; 259f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.graphics.Canvas; 269f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.graphics.Color; 279f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.graphics.drawable.ColorDrawable; 289f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.graphics.drawable.Drawable; 29821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucasimport android.graphics.Paint; 30821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucasimport android.graphics.Typeface; 319f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.os.Bundle; 32821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucasimport android.text.TextPaint; 33f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurikimport android.util.TypedValue; 349f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.view.View; 359f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.widget.AdapterView; 369f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.widget.ArrayAdapter; 379f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.widget.ImageView; 389f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.widget.ListView; 399f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.widget.TextView; 409f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucasimport android.widget.AdapterView.OnItemLongClickListener; 419f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 429f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucaspublic class TitlesFragment extends ListFragment { 439f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas private int mCategory = 0; 449f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas private int mCurPosition = 0; 459f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 469f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas @Override 479f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas public void onActivityCreated(Bundle savedInstanceState) { 489f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas super.onActivityCreated(savedInstanceState); 499f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 509f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas //Current position should survive screen rotations. 519f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas if (savedInstanceState != null) { 529f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas mCategory = savedInstanceState.getInt("category"); 539f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas mCurPosition = savedInstanceState.getInt("listPosition"); 549f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 559f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 569f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas populateTitles(mCategory); 579f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas ListView lv = getListView(); 589f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 59f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik lv.setCacheColorHint(Color.TRANSPARENT); 609f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas lv.setOnItemLongClickListener(new OnItemLongClickListener() { 61f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik public boolean onItemLongClick(AdapterView<?> av, View v, int pos, long id) { 629f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas final String title = (String) ((TextView) v).getText(); 639f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 649f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas // Set up clip data with the category||entry_id format. 659f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas final String textData = String.format("%d||%d", mCategory, pos); 669f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas ClipData data = ClipData.newPlainText(title, textData); 67f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik v.startDrag(data, new MyDragShadowBuilder(v), null, 0); 689f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas return true; 699f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 709f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas }); 71f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik 72f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik selectPosition(mCurPosition); 739f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 749f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 75f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik private class MyDragShadowBuilder extends View.DragShadowBuilder { 76f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik private Drawable mShadow; 77f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik 78f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik public MyDragShadowBuilder(View v) { 799f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas super(v); 80f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik 81f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik final TypedArray a = v.getContext().obtainStyledAttributes(R.styleable.AppTheme); 82f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik mShadow = a.getDrawable(R.styleable.AppTheme_listDragShadowBackground); 83f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik mShadow.setCallback(v); 84821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucas mShadow.setBounds(0, 0, v.getWidth(), v.getHeight()); 85f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik a.recycle(); 869f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 879f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 889f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas @Override 899f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas public void onDrawShadow(Canvas canvas) { 90821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucas super.onDrawShadow(canvas); 91821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucas mShadow.draw(canvas); 92f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik getView().draw(canvas); 939f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 949f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 959f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 969f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas public void populateTitles(int category) { 979f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas DirectoryCategory cat = Directory.getCategory(category); 989f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas String[] items = new String[cat.getEntryCount()]; 999f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas for (int i = 0; i < cat.getEntryCount(); i++) 1009f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas items[i] = cat.getEntry(i).getName(); 1019f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas setListAdapter(new ArrayAdapter<String>(getActivity(), 1029f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas R.layout.title_list_item, items)); 1039f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas mCategory = category; 1049f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 1059f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 1069f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas @Override 1079f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas public void onListItemClick(ListView l, View v, int position, long id) { 1089f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas updateImage(position); 1099f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 1109f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 1119f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas private void updateImage(int position) { 112821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucas ContentFragment frag = (ContentFragment) getFragmentManager() 113821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucas .findFragmentById(R.id.frag_content); 114821736e1fb70be2c827c9e6a35a7739762523897Alexander Lucas frag.updateContentAndRecycleBitmap(mCategory, position); 115f4f345d0b75c96d92f15a9aba8d58d5d4bec27c6Roman Nurik mCurPosition = position; 1169f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 1179f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 1189f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas public void selectPosition(int position) { 1199f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas ListView lv = getListView(); 1209f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas lv.setItemChecked(position, true); 1219f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas updateImage(position); 1229f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 1239f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas 1249f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas @Override 1259f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas public void onSaveInstanceState (Bundle outState) { 1269f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas super.onSaveInstanceState(outState); 1279f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas outState.putInt("listPosition", mCurPosition); 1289f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas outState.putInt("category", mCategory); 1299f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas } 1309f935c7da5a0111f8ee0d2f7c59e6c1695916053Alexander Lucas} 131