2 * Copyright (C) 2013 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.photos;
19 import android.app.Fragment;
20 import android.app.LoaderManager.LoaderCallbacks;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.content.Loader;
24 import android.database.Cursor;
25 import android.net.Uri;
26 import android.os.Bundle;
27 import android.util.SparseBooleanArray;
28 import android.view.LayoutInflater;
29 import android.view.View;
30 import android.view.ViewGroup;
31 import android.widget.AdapterView;
32 import android.widget.AdapterView.OnItemClickListener;
33 import android.widget.GridView;
35 import com.android.gallery3d.R;
36 import com.android.gallery3d.app.Gallery;
37 import com.android.photos.adapters.PhotoThumbnailAdapter;
38 import com.android.photos.data.PhotoSetLoader;
39 import com.android.photos.shims.LoaderCompatShim;
40 import com.android.photos.shims.MediaItemsLoader;
42 import java.util.ArrayList;
44 public class PhotoSetFragment extends Fragment implements OnItemClickListener,
45 LoaderCallbacks<Cursor>, MultiChoiceManager.Delegate, SelectionManager.Client {
47 private static final int LOADER_PHOTOSET = 1;
49 private GridView mPhotoSetView;
50 private View mEmptyView;
52 private boolean mInitialLoadComplete = false;
53 private LoaderCompatShim<Cursor> mLoaderCompatShim;
54 private PhotoThumbnailAdapter mAdapter;
55 private MultiChoiceManager mMultiChoiceManager;
56 private SelectionManager mSelectionManager;
59 public void onCreate(Bundle savedInstanceState) {
60 super.onCreate(savedInstanceState);
61 Context context = getActivity();
62 mAdapter = new PhotoThumbnailAdapter(context);
63 mMultiChoiceManager = new MultiChoiceManager(context, this);
64 mMultiChoiceManager.setSelectionManager(mSelectionManager);
68 public void setSelectionManager(SelectionManager manager) {
69 mSelectionManager = manager;
70 if (mMultiChoiceManager != null) {
71 mMultiChoiceManager.setSelectionManager(manager);
76 public View onCreateView(LayoutInflater inflater, ViewGroup container,
77 Bundle savedInstanceState) {
78 View root = inflater.inflate(R.layout.photo_set, container, false);
79 mPhotoSetView = (GridView) root.findViewById(android.R.id.list);
80 // TODO: Remove once UI stabilizes
81 mPhotoSetView.setColumnWidth(MediaItemsLoader.getThumbnailSize());
82 mPhotoSetView.setOnItemClickListener(this);
83 mEmptyView = root.findViewById(android.R.id.empty);
84 mEmptyView.setVisibility(View.GONE);
85 mPhotoSetView.setAdapter(mAdapter);
86 mPhotoSetView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
87 mPhotoSetView.setMultiChoiceModeListener(mMultiChoiceManager);
88 getLoaderManager().initLoader(LOADER_PHOTOSET, null, this);
93 private void updateEmptyStatus() {
94 boolean empty = (mAdapter == null || mAdapter.getCount() == 0);
95 mPhotoSetView.setVisibility(empty ? View.GONE : View.VISIBLE);
96 mEmptyView.setVisibility(empty && mInitialLoadComplete
97 ? View.VISIBLE : View.GONE);
101 public void onItemClick(AdapterView<?> parent, View view, int position,
103 if (mLoaderCompatShim == null) {
104 // Not fully initialized yet, discard
107 Cursor item = mAdapter.getItem(position);
108 Uri uri = mLoaderCompatShim.uriForItem(item);
109 Intent intent = new Intent(Intent.ACTION_VIEW, uri);
110 intent.setClass(getActivity(), Gallery.class);
111 startActivity(intent);
115 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
116 // TODO: Switch to PhotoSetLoader
117 MediaItemsLoader loader = new MediaItemsLoader(getActivity());
118 mInitialLoadComplete = false;
119 mLoaderCompatShim = loader;
120 mAdapter.setDrawableFactory(mLoaderCompatShim);
125 public void onLoadFinished(Loader<Cursor> loader,
127 mAdapter.swapCursor(data);
128 mInitialLoadComplete = true;
133 public void onLoaderReset(Loader<Cursor> loader) {
137 public int getItemMediaType(Object item) {
138 return ((Cursor) item).getInt(PhotoSetLoader.INDEX_MEDIA_TYPE);
142 public int getItemSupportedOperations(Object item) {
143 return ((Cursor) item).getInt(PhotoSetLoader.INDEX_SUPPORTED_OPERATIONS);
147 public Object getItemAtPosition(int position) {
148 return mAdapter.getItem(position);
151 private ArrayList<Uri> mSubItemUriTemp = new ArrayList<Uri>(1);
153 public ArrayList<Uri> getSubItemUrisForItem(Object item) {
154 mSubItemUriTemp.clear();
155 mSubItemUriTemp.add(mLoaderCompatShim.uriForItem((Cursor) item));
156 return mSubItemUriTemp;
161 public Object getPathForItemAtPosition(int position) {
162 return mLoaderCompatShim.getPathForItem(mAdapter.getItem(position));
166 public void deleteItemWithPath(Object itemPath) {
167 mLoaderCompatShim.deleteItemWithPath(itemPath);
171 public SparseBooleanArray getSelectedItemPositions() {
172 return mPhotoSetView.getCheckedItemPositions();
176 public int getSelectedItemCount() {
177 return mPhotoSetView.getCheckedItemCount();