Folder.java revision 31dd503c6aa69018e694d91724d46db49ea09327
131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/*
231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * you may not use this file except in compliance with the License.
631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * You may obtain a copy of the License at
731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project *
1031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * See the License for the specific language governing permissions and
1431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * limitations under the License.
1531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
1631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectpackage com.android.launcher;
1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
1931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context;
2031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.util.AttributeSet;
2131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View;
2231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View.OnClickListener;
2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.AdapterView;
2431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.Button;
2531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.LinearLayout;
2631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.AbsListView;
2731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.ListAdapter;
2831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.AdapterView.OnItemClickListener;
2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.widget.AdapterView.OnItemLongClickListener;
3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/**
3231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Represents a set of icons chosen by the user or generated by the system.
3331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */
3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectpublic class Folder extends LinearLayout implements DragSource, OnItemLongClickListener,
3531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        OnItemClickListener, OnClickListener, View.OnLongClickListener {
3631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
3731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected AbsListView mContent;
3831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected DragController mDragger;
3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected Launcher mLauncher;
4131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected Button mCloseButton;
4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected FolderInfo mInfo;
4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
4731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Which item is being dragged
4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected ApplicationInfo mDragItem;
5031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    private boolean mCloneInfo;
5131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
5231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
5331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Used to inflate the Workspace from XML.
5431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
5531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param context The application's context.
5631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param attrs The attribtues set containing the Workspace's customization values.
5731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
5831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public Folder(Context context, AttributeSet attrs) {
5931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super(context, attrs);
6031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        setAlwaysDrawnWithCacheEnabled(false);
6131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
6231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    @Override
6431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    protected void onFinishInflate() {
6531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        super.onFinishInflate();
6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
6731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mContent = (AbsListView) findViewById(R.id.content);
6831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mContent.setOnItemClickListener(this);
6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mContent.setOnItemLongClickListener(this);
7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mCloseButton = (Button) findViewById(R.id.close);
7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mCloseButton.setOnClickListener(this);
7331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mCloseButton.setOnLongClickListener(this);
7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
7631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onItemClick(AdapterView parent, View v, int position, long id) {
7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);
7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mLauncher.startActivitySafely(app.intent);
7931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
8131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onClick(View v) {
8231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mLauncher.closeFolder(this);
8331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
8431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
8531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean onLongClick(View v) {
8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mLauncher.closeFolder(this);
8731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mLauncher.showRenameDialog(mInfo);
8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return true;
8931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
9031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
9131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
9231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (!view.isInTouchMode()) {
9331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            return false;
9431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
9531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
9631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        ApplicationInfo app = (ApplicationInfo) parent.getItemAtPosition(position);
9731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        if (mCloneInfo) {
9831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project            app = new ApplicationInfo(app);
9931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        }
10031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
10131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mDragger.startDrag(view, this, app, DragController.DRAG_ACTION_COPY);
10231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mLauncher.closeFolder(this);
10331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mDragItem = app;
10431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
10531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return true;
10631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
10731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
10831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void setCloneInfo(boolean cloneInfo) {
10931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mCloneInfo = cloneInfo;
11031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
11131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void setDragger(DragController dragger) {
11331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mDragger = dragger;
11431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
11531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    public void onDropCompleted(View target, boolean success) {
11731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
11831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
11931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
12031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * Sets the adapter used to populate the content area. The adapter must only
12131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * contains ApplicationInfo items.
12231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     *
12331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @param adapter The list of applications to display in the folder.
12431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
12531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void setContentAdapter(ListAdapter adapter) {
12631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mContent.setAdapter(adapter);
12731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
12831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
12931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void setLauncher(Launcher launcher) {
13031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mLauncher = launcher;
13131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
13231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
13331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    /**
13431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     * @return the FolderInfo object associated with this folder
13531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project     */
13631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    FolderInfo getInfo() {
13731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        return mInfo;
13831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
13931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
14031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    // When the folder opens, we need to refresh the GridView's selection by
14131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    // forcing a layout
14231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void onOpen() {
14331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mContent.requestLayout();
14431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
14531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
14631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void onClose() {
14731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        final Workspace workspace = mLauncher.getWorkspace();
14831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        workspace.getChildAt(workspace.getCurrentScreen()).requestFocus();
14931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
15031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project
15131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    void bind(FolderInfo info) {
15231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mInfo = info;
15331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project        mCloseButton.setText(info.title);
15431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project    }
15531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project}
156