1217149efdc4a559c38442da179f548e125c0afc5Steve Howard/*
2217149efdc4a559c38442da179f548e125c0afc5Steve Howard * Copyright (C) 2010 The Android Open Source Project
3217149efdc4a559c38442da179f548e125c0afc5Steve Howard *
4217149efdc4a559c38442da179f548e125c0afc5Steve Howard * Licensed under the Apache License, Version 2.0 (the "License");
5217149efdc4a559c38442da179f548e125c0afc5Steve Howard * you may not use this file except in compliance with the License.
6217149efdc4a559c38442da179f548e125c0afc5Steve Howard * You may obtain a copy of the License at
7217149efdc4a559c38442da179f548e125c0afc5Steve Howard *
8217149efdc4a559c38442da179f548e125c0afc5Steve Howard *      http://www.apache.org/licenses/LICENSE-2.0
9217149efdc4a559c38442da179f548e125c0afc5Steve Howard *
10217149efdc4a559c38442da179f548e125c0afc5Steve Howard * Unless required by applicable law or agreed to in writing, software
11217149efdc4a559c38442da179f548e125c0afc5Steve Howard * distributed under the License is distributed on an "AS IS" BASIS,
12217149efdc4a559c38442da179f548e125c0afc5Steve Howard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13217149efdc4a559c38442da179f548e125c0afc5Steve Howard * See the License for the specific language governing permissions and
14217149efdc4a559c38442da179f548e125c0afc5Steve Howard * limitations under the License.
15217149efdc4a559c38442da179f548e125c0afc5Steve Howard */
16217149efdc4a559c38442da179f548e125c0afc5Steve Howard
17217149efdc4a559c38442da179f548e125c0afc5Steve Howardpackage com.android.providers.downloads.ui;
18217149efdc4a559c38442da179f548e125c0afc5Steve Howard
19217149efdc4a559c38442da179f548e125c0afc5Steve Howardimport android.content.Context;
20217149efdc4a559c38442da179f548e125c0afc5Steve Howardimport android.util.AttributeSet;
21217149efdc4a559c38442da179f548e125c0afc5Steve Howardimport android.view.MotionEvent;
22a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkeyimport android.view.accessibility.AccessibilityEvent;
23217149efdc4a559c38442da179f548e125c0afc5Steve Howardimport android.widget.CheckBox;
24daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Noriimport android.widget.Checkable;
253843960b466dbcd1733648095e750ccb3fa6d184Jeff Sharkeyimport android.widget.GridLayout;
26217149efdc4a559c38442da179f548e125c0afc5Steve Howard
27217149efdc4a559c38442da179f548e125c0afc5Steve Howard/**
28217149efdc4a559c38442da179f548e125c0afc5Steve Howard * This class customizes RelativeLayout to directly handle clicks on the left part of the view and
29217149efdc4a559c38442da179f548e125c0afc5Steve Howard * treat them at clicks on the checkbox. This makes rapid selection of many items easier. This class
30217149efdc4a559c38442da179f548e125c0afc5Steve Howard * also keeps an ID associated with the currently displayed download and notifies a listener upon
31217149efdc4a559c38442da179f548e125c0afc5Steve Howard * selection changes with that ID.
32217149efdc4a559c38442da179f548e125c0afc5Steve Howard */
333843960b466dbcd1733648095e750ccb3fa6d184Jeff Sharkeypublic class DownloadItem extends GridLayout implements Checkable {
34217149efdc4a559c38442da179f548e125c0afc5Steve Howard    private static float CHECKMARK_AREA = -1;
35217149efdc4a559c38442da179f548e125c0afc5Steve Howard
36217149efdc4a559c38442da179f548e125c0afc5Steve Howard    private boolean mIsInDownEvent = false;
37217149efdc4a559c38442da179f548e125c0afc5Steve Howard    private CheckBox mCheckBox;
38217149efdc4a559c38442da179f548e125c0afc5Steve Howard    private long mDownloadId;
39d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    private String mFileName;
40d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    private String mMimeType;
41daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    private DownloadList mDownloadList;
42daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    private int mPosition;
43217149efdc4a559c38442da179f548e125c0afc5Steve Howard
44217149efdc4a559c38442da179f548e125c0afc5Steve Howard    public DownloadItem(Context context, AttributeSet attrs, int defStyle) {
45217149efdc4a559c38442da179f548e125c0afc5Steve Howard        super(context, attrs, defStyle);
46217149efdc4a559c38442da179f548e125c0afc5Steve Howard        initialize();
47217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
48217149efdc4a559c38442da179f548e125c0afc5Steve Howard
49217149efdc4a559c38442da179f548e125c0afc5Steve Howard    public DownloadItem(Context context, AttributeSet attrs) {
50217149efdc4a559c38442da179f548e125c0afc5Steve Howard        super(context, attrs);
51217149efdc4a559c38442da179f548e125c0afc5Steve Howard        initialize();
52217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
53217149efdc4a559c38442da179f548e125c0afc5Steve Howard
54217149efdc4a559c38442da179f548e125c0afc5Steve Howard    public DownloadItem(Context context) {
55217149efdc4a559c38442da179f548e125c0afc5Steve Howard        super(context);
56217149efdc4a559c38442da179f548e125c0afc5Steve Howard        initialize();
57217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
58217149efdc4a559c38442da179f548e125c0afc5Steve Howard
59217149efdc4a559c38442da179f548e125c0afc5Steve Howard    private void initialize() {
60217149efdc4a559c38442da179f548e125c0afc5Steve Howard        if (CHECKMARK_AREA == -1) {
61217149efdc4a559c38442da179f548e125c0afc5Steve Howard            CHECKMARK_AREA = getResources().getDimensionPixelSize(R.dimen.checkmark_area);
62217149efdc4a559c38442da179f548e125c0afc5Steve Howard        }
63217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
64217149efdc4a559c38442da179f548e125c0afc5Steve Howard
65217149efdc4a559c38442da179f548e125c0afc5Steve Howard    @Override
66217149efdc4a559c38442da179f548e125c0afc5Steve Howard    protected void onFinishInflate() {
67217149efdc4a559c38442da179f548e125c0afc5Steve Howard        super.onFinishInflate();
68217149efdc4a559c38442da179f548e125c0afc5Steve Howard        mCheckBox = (CheckBox) findViewById(R.id.download_checkbox);
69217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
70217149efdc4a559c38442da179f548e125c0afc5Steve Howard
71d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    public void setData(long downloadId, int position, String fileName, String mimeType) {
72217149efdc4a559c38442da179f548e125c0afc5Steve Howard        mDownloadId = downloadId;
73daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori        mPosition = position;
74d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori        mFileName = fileName;
75d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori        mMimeType = mimeType;
762622e40de0fa300a00d815f084ea6098f70f93e9Vasu Nori        if (mDownloadList.isDownloadSelected(downloadId)) {
772622e40de0fa300a00d815f084ea6098f70f93e9Vasu Nori            setChecked(true);
782622e40de0fa300a00d815f084ea6098f70f93e9Vasu Nori        }
79217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
80217149efdc4a559c38442da179f548e125c0afc5Steve Howard
81daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    public void setDownloadListObj(DownloadList downloadList) {
82daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori        mDownloadList = downloadList;
83217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
84217149efdc4a559c38442da179f548e125c0afc5Steve Howard
85a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey    private boolean inCheckArea(MotionEvent event) {
86a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey        if (isLayoutRtl()) {
87a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey            return event.getX() > getWidth() - CHECKMARK_AREA;
88a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey        } else {
89a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey            return event.getX() < CHECKMARK_AREA;
90a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey        }
91a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey    }
92a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey
93217149efdc4a559c38442da179f548e125c0afc5Steve Howard    @Override
94217149efdc4a559c38442da179f548e125c0afc5Steve Howard    public boolean onTouchEvent(MotionEvent event) {
95217149efdc4a559c38442da179f548e125c0afc5Steve Howard        boolean handled = false;
96217149efdc4a559c38442da179f548e125c0afc5Steve Howard        switch(event.getAction()) {
97217149efdc4a559c38442da179f548e125c0afc5Steve Howard            case MotionEvent.ACTION_DOWN:
98a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey                if (inCheckArea(event)) {
99217149efdc4a559c38442da179f548e125c0afc5Steve Howard                    mIsInDownEvent = true;
100217149efdc4a559c38442da179f548e125c0afc5Steve Howard                    handled = true;
101217149efdc4a559c38442da179f548e125c0afc5Steve Howard                }
102217149efdc4a559c38442da179f548e125c0afc5Steve Howard                break;
103217149efdc4a559c38442da179f548e125c0afc5Steve Howard
104217149efdc4a559c38442da179f548e125c0afc5Steve Howard            case MotionEvent.ACTION_CANCEL:
105217149efdc4a559c38442da179f548e125c0afc5Steve Howard                mIsInDownEvent = false;
106217149efdc4a559c38442da179f548e125c0afc5Steve Howard                break;
107217149efdc4a559c38442da179f548e125c0afc5Steve Howard
108217149efdc4a559c38442da179f548e125c0afc5Steve Howard            case MotionEvent.ACTION_UP:
109a9c9eea93af0aebbdace4ce39acde8085186403eJeff Sharkey                if (mIsInDownEvent && inCheckArea(event)) {
110daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori                    toggle();
11114991c65911034a97268840d36cf9549e06fd56eRomain Guy                    sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
112217149efdc4a559c38442da179f548e125c0afc5Steve Howard                    handled = true;
113217149efdc4a559c38442da179f548e125c0afc5Steve Howard                }
114217149efdc4a559c38442da179f548e125c0afc5Steve Howard                mIsInDownEvent = false;
115217149efdc4a559c38442da179f548e125c0afc5Steve Howard                break;
116217149efdc4a559c38442da179f548e125c0afc5Steve Howard        }
117217149efdc4a559c38442da179f548e125c0afc5Steve Howard
118217149efdc4a559c38442da179f548e125c0afc5Steve Howard        if (handled) {
119217149efdc4a559c38442da179f548e125c0afc5Steve Howard            postInvalidate();
120217149efdc4a559c38442da179f548e125c0afc5Steve Howard        } else {
121217149efdc4a559c38442da179f548e125c0afc5Steve Howard            handled = super.onTouchEvent(event);
122217149efdc4a559c38442da179f548e125c0afc5Steve Howard        }
123217149efdc4a559c38442da179f548e125c0afc5Steve Howard
124217149efdc4a559c38442da179f548e125c0afc5Steve Howard        return handled;
125217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
126217149efdc4a559c38442da179f548e125c0afc5Steve Howard
127daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    @Override
128daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    public boolean isChecked() {
129daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori        return mCheckBox.isChecked();
130daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    }
131daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori
132daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    @Override
133daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    public void setChecked(boolean checked) {
134daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori        mCheckBox.setChecked(checked);
135d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori        mDownloadList.onDownloadSelectionChanged(mDownloadId, mCheckBox.isChecked(),
136d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori                mFileName, mMimeType);
137daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori        mDownloadList.getCurrentView().setItemChecked(mPosition, mCheckBox.isChecked());
138daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    }
139daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori
140daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    @Override
141daed066d4dcc8873d3463ae65e16fa2e7fbcafe5Vasu Nori    public void toggle() {
14214991c65911034a97268840d36cf9549e06fd56eRomain Guy        setChecked(!isChecked());
143217149efdc4a559c38442da179f548e125c0afc5Steve Howard    }
144d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori
145d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    public CheckBox getCheckBox() {
146d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori        return this.mCheckBox;
147d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    }
148d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori
149d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    public String getFileName() {
150d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori        return mFileName;
151d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    }
152d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori
153d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    public String getMimeType() {
154d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori        return mMimeType;
155d58f7c299ec6e1164e3b5e9e2e3fe5e0e57e63b9Vasu Nori    }
156217149efdc4a559c38442da179f548e125c0afc5Steve Howard}
157