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