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