blob: b6929538dd618e229e117984f6a759e241ac73be [file] [log] [blame]
The Android Open Source Project31dd5032009-03-03 19:32:27 -08001/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
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
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
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.
15 */
16
Joe Onoratoa5902522009-07-30 13:37:37 -070017package com.android.launcher2;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080018
19import android.content.Context;
20import android.content.Intent;
21import android.util.AttributeSet;
22import android.view.LayoutInflater;
23import android.view.View;
24import android.widget.AdapterView;
Michael Jurka66d72172011-04-12 16:29:25 -070025import android.widget.BaseAdapter;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080026import android.net.Uri;
27import android.provider.LiveFolders;
28import android.os.AsyncTask;
29import android.database.Cursor;
Michael Jurka66d72172011-04-12 16:29:25 -070030import android.widget.GridView;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080031
32import java.lang.ref.WeakReference;
33
Romain Guyedcce092010-03-04 13:03:17 -080034import com.android.launcher.R;
35
The Android Open Source Project31dd5032009-03-03 19:32:27 -080036public class LiveFolder extends Folder {
37 private AsyncTask<LiveFolderInfo,Void,Cursor> mLoadingTask;
Michael Jurka66d72172011-04-12 16:29:25 -070038 protected GridView mContent;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080039
40 public LiveFolder(Context context, AttributeSet attrs) {
41 super(context, attrs);
42 }
43
44 static LiveFolder fromXml(Context context, FolderInfo folderInfo) {
45 final int layout = isDisplayModeList(folderInfo) ?
46 R.layout.live_folder_list : R.layout.live_folder_grid;
47 return (LiveFolder) LayoutInflater.from(context).inflate(layout, null);
48 }
49
Michael Jurka66d72172011-04-12 16:29:25 -070050 @Override
51 protected void onFinishInflate() {
52 super.onFinishInflate();
53
54 mContent = (GridView) findViewById(R.id.folder_content);
55 mContent.setOnItemClickListener(this);
56 mContent.setOnItemLongClickListener(this);
57 }
58
The Android Open Source Project31dd5032009-03-03 19:32:27 -080059 private static boolean isDisplayModeList(FolderInfo folderInfo) {
60 return ((LiveFolderInfo) folderInfo).displayMode ==
61 LiveFolders.DISPLAY_MODE_LIST;
62 }
63
64 @Override
65 public void onItemClick(AdapterView parent, View v, int position, long id) {
66 LiveFolderAdapter.ViewHolder holder = (LiveFolderAdapter.ViewHolder) v.getTag();
67
68 if (holder.useBaseIntent) {
69 final Intent baseIntent = ((LiveFolderInfo) mInfo).baseIntent;
70 if (baseIntent != null) {
71 final Intent intent = new Intent(baseIntent);
72 Uri uri = baseIntent.getData();
73 uri = uri.buildUpon().appendPath(Long.toString(holder.id)).build();
74 intent.setData(uri);
Joe Onoratof984e852010-03-25 09:47:45 -070075 mLauncher.startActivitySafely(intent, "(position=" + position + ", id=" + id + ")");
The Android Open Source Project31dd5032009-03-03 19:32:27 -080076 }
77 } else if (holder.intent != null) {
Joe Onoratof984e852010-03-25 09:47:45 -070078 mLauncher.startActivitySafely(holder.intent,
79 "(position=" + position + ", id=" + id + ")");
The Android Open Source Project31dd5032009-03-03 19:32:27 -080080 }
81 }
82
Michael Jurka66d72172011-04-12 16:29:25 -070083 /**
84 * Sets the adapter used to populate the content area. The adapter must only
85 * contains ShortcutInfo items.
86 *
87 * @param adapter The list of applications to display in the folder.
88 */
89 void setContentAdapter(BaseAdapter adapter) {
90 mContent.setAdapter(adapter);
91 }
92
93 @Override
94 void notifyDataSetChanged() {
95 ((BaseAdapter) mContent.getAdapter()).notifyDataSetChanged();
96 }
97
The Android Open Source Project31dd5032009-03-03 19:32:27 -080098 @Override
99 public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
100 return false;
101 }
102
103 void bind(FolderInfo info) {
104 super.bind(info);
105 if (mLoadingTask != null && mLoadingTask.getStatus() == AsyncTask.Status.RUNNING) {
106 mLoadingTask.cancel(true);
107 }
108 mLoadingTask = new FolderLoadingTask(this).execute((LiveFolderInfo) info);
109 }
110
111 @Override
112 void onOpen() {
113 super.onOpen();
Michael Jurka66d72172011-04-12 16:29:25 -0700114 // When the folder opens, we need to refresh the GridView's selection by
115 // forcing a layout
116 mContent.requestLayout();
The Android Open Source Project31dd5032009-03-03 19:32:27 -0800117 requestFocus();
118 }
119
120 @Override
121 void onClose() {
122 super.onClose();
123 if (mLoadingTask != null && mLoadingTask.getStatus() == AsyncTask.Status.RUNNING) {
124 mLoadingTask.cancel(true);
125 }
Romain Guy2f8e96e2009-03-24 20:44:11 -0700126
127 // The adapter can be null if onClose() is called before FolderLoadingTask
128 // is done querying the provider
129 final LiveFolderAdapter adapter = (LiveFolderAdapter) mContent.getAdapter();
130 if (adapter != null) {
131 adapter.cleanup();
132 }
The Android Open Source Project31dd5032009-03-03 19:32:27 -0800133 }
134
135 static class FolderLoadingTask extends AsyncTask<LiveFolderInfo, Void, Cursor> {
136 private final WeakReference<LiveFolder> mFolder;
137 private LiveFolderInfo mInfo;
138
139 FolderLoadingTask(LiveFolder folder) {
140 mFolder = new WeakReference<LiveFolder>(folder);
141 }
142
143 protected Cursor doInBackground(LiveFolderInfo... params) {
144 final LiveFolder folder = mFolder.get();
145 if (folder != null) {
146 mInfo = params[0];
147 return LiveFolderAdapter.query(folder.mLauncher, mInfo);
148 }
149 return null;
150 }
151
152 @Override
153 protected void onPostExecute(Cursor cursor) {
154 if (!isCancelled()) {
155 if (cursor != null) {
156 final LiveFolder folder = mFolder.get();
157 if (folder != null) {
158 final Launcher launcher = folder.mLauncher;
159 folder.setContentAdapter(new LiveFolderAdapter(launcher, mInfo, cursor));
160 }
161 }
162 } else if (cursor != null) {
163 cursor.close();
164 }
165 }
166 }
167}