129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/* 229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Copyright (C) 2010 The Android Open Source Project 329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * 429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Licensed under the Apache License, Version 2.0 (the "License"); 529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * you may not use this file except in compliance with the License. 629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * You may obtain a copy of the License at 729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * 829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * http://www.apache.org/licenses/LICENSE-2.0 929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * 1029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * Unless required by applicable law or agreed to in writing, software 1129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * distributed under the License is distributed on an "AS IS" BASIS, 1229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * See the License for the specific language governing permissions and 1429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * limitations under the License. 1529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */ 1629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungpackage com.android.launcher2; 1829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.appwidget.AppWidgetProviderInfo; 2029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.Context; 2129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.pm.PackageManager; 2229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.content.pm.ResolveInfo; 2359e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chungimport android.content.res.Resources; 24c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chungimport android.graphics.Rect; 2529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.util.AttributeSet; 2629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.view.MotionEvent; 27ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohenimport android.view.View; 2829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.ImageView; 2929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.LinearLayout; 3029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport android.widget.TextView; 3129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 3229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chungimport com.android.launcher.R; 3329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 3429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung/** 3529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung * The linear layout used strictly for the widget/wallpaper tab of the customization tray 3629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung */ 3782369a16126a1030c1c9203dc62b33c2598add89Michael Jurkapublic class PagedViewWidget extends LinearLayout { 3829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung static final String TAG = "PagedViewWidgetLayout"; 3929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 40141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka private static boolean sDeletePreviewsWhenDetachedFromWindow = true; 41ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka private static boolean sRecyclePreviewsWhenDetachedFromWindow = true; 42e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung 4363257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung private String mDimensionsFormatString; 44ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen CheckForShortPress mPendingCheckForShortPress = null; 45ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen ShortPressListener mShortPressListener = null; 46ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen boolean mShortPressTriggered = false; 470e56cc9fd6814af5813e73ba7a71bf1d51d4208aAdam Cohen static PagedViewWidget sShortpressTarget = null; 48dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka boolean mIsAppWidget; 49c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung private final Rect mOriginalImagePadding = new Rect(); 5005713af127d765cc28a8b2fd548a90347c90d6cbMichael Jurka private Object mInfo; 513f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka private WidgetPreviewLoader mWidgetPreviewLoader; 520499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 5329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context) { 5429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, null); 5529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 5629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 5729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context, AttributeSet attrs) { 5829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung this(context, attrs, 0); 5929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 6029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 6129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public PagedViewWidget(Context context, AttributeSet attrs, int defStyle) { 6229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung super(context, attrs, defStyle); 6329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 6459e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung final Resources r = context.getResources(); 6563257c110a4ee54d5e8872c471cce254cf613c7aWinson Chung mDimensionsFormatString = r.getString(R.string.widget_dims_format); 6659e1f9a07eef87b1d287956d21b8d9c5b27faf9cWinson Chung 6729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setWillNotDraw(false); 6829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung setClipToPadding(false); 6929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 7029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 71c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung @Override 72c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung protected void onFinishInflate() { 73c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung super.onFinishInflate(); 74c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung 75c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung final ImageView image = (ImageView) findViewById(R.id.widget_preview); 76c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mOriginalImagePadding.left = image.getPaddingLeft(); 77c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mOriginalImagePadding.top = image.getPaddingTop(); 78c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mOriginalImagePadding.right = image.getPaddingRight(); 79c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mOriginalImagePadding.bottom = image.getPaddingBottom(); 80c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung } 81c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung 82141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka public static void setDeletePreviewsWhenDetachedFromWindow(boolean value) { 83141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka sDeletePreviewsWhenDetachedFromWindow = value; 84141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka } 85141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka 86ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka public static void setRecyclePreviewsWhenDetachedFromWindow(boolean value) { 87ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka sRecyclePreviewsWhenDetachedFromWindow = value; 88ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka } 89ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka 90099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung @Override 91099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung protected void onDetachedFromWindow() { 92099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung super.onDetachedFromWindow(); 93099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung 94141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka if (sDeletePreviewsWhenDetachedFromWindow) { 95141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka final ImageView image = (ImageView) findViewById(R.id.widget_preview); 96141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka if (image != null) { 97141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka FastBitmapDrawable preview = (FastBitmapDrawable) image.getDrawable(); 98ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka if (sRecyclePreviewsWhenDetachedFromWindow && 99ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka mInfo != null && preview != null && preview.getBitmap() != null) { 100ee8e99fe3bde78885904b4d9ea789b4d2a6f2b16Michael Jurka mWidgetPreviewLoader.recycleBitmap(mInfo, preview.getBitmap()); 101141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka } 102141dbd0e02f9fd9f3a096722d8d812990b5931e1Michael Jurka image.setImageDrawable(null); 103c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung } 104099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung } 105099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung } 106099459377a737d885bbd8ac4d52e6884a103b1c7Winson Chung 10729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public void applyFromAppWidgetProviderInfo(AppWidgetProviderInfo info, 1083f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka int maxWidth, int[] cellSpan, WidgetPreviewLoader loader) { 109dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka mIsAppWidget = true; 11005713af127d765cc28a8b2fd548a90347c90d6cbMichael Jurka mInfo = info; 11129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final ImageView image = (ImageView) findViewById(R.id.widget_preview); 1124b576be59e58072cc03b5a8d36afb6a322513575Winson Chung if (maxWidth > -1) { 1134b576be59e58072cc03b5a8d36afb6a322513575Winson Chung image.setMaxWidth(maxWidth); 1144b576be59e58072cc03b5a8d36afb6a322513575Winson Chung } 11529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final TextView name = (TextView) findViewById(R.id.widget_name); 11629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung name.setText(info.label); 11729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung final TextView dims = (TextView) findViewById(R.id.widget_dims); 11835d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung if (dims != null) { 119e3e03bcd313ba8060f2832b6a16dea6fd6d532eaWinson Chung int hSpan = Math.min(cellSpan[0], LauncherModel.getCellCountX()); 120e3e03bcd313ba8060f2832b6a16dea6fd6d532eaWinson Chung int vSpan = Math.min(cellSpan[1], LauncherModel.getCellCountY()); 121e3e03bcd313ba8060f2832b6a16dea6fd6d532eaWinson Chung dims.setText(String.format(mDimensionsFormatString, hSpan, vSpan)); 12235d4a257cff6ff69232f10c8dc405df8044eab1fWinson Chung } 1233f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka mWidgetPreviewLoader = loader; 12429d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 12529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung 1263f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka public void applyFromResolveInfo( 1273f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka PackageManager pm, ResolveInfo info, WidgetPreviewLoader loader) { 128dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka mIsAppWidget = false; 12905713af127d765cc28a8b2fd548a90347c90d6cbMichael Jurka mInfo = info; 1306a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung CharSequence label = info.loadLabel(pm); 1311ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView name = (TextView) findViewById(R.id.widget_name); 1326a0f57dfafced837a2a282d8feec28d5418be3b9Winson Chung name.setText(label); 1331ed747a4c07101793322c13a36dd547df4a3aa50Winson Chung final TextView dims = (TextView) findViewById(R.id.widget_dims); 13446af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung if (dims != null) { 13546af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung dims.setText(String.format(mDimensionsFormatString, 1, 1)); 13646af2e89164b391b7a0049c6ce9048a2b7a7f644Winson Chung } 1373f4e070aa58d51dd136885b4d3e2e6c5d9f93ea0Michael Jurka mWidgetPreviewLoader = loader; 138b44b52439d155f570db7d6d0b80fdd3350e35685Winson Chung } 1390499834db3f9dc6fb0f5f57b5876b8503bce5189Winson Chung 140038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka public int[] getPreviewSize() { 141038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka final ImageView i = (ImageView) findViewById(R.id.widget_preview); 142038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka int[] maxSize = new int[2]; 143c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung maxSize[0] = i.getWidth() - mOriginalImagePadding.left - mOriginalImagePadding.right; 144c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung maxSize[1] = i.getHeight() - mOriginalImagePadding.top; 145038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka return maxSize; 146038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka } 147038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka 148038f9d8bfb53288e7cf5812f62ec3d5b25fec965Michael Jurka void applyPreview(FastBitmapDrawable preview, int index) { 14981efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka final PagedViewWidgetImageView image = 150dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka (PagedViewWidgetImageView) findViewById(R.id.widget_preview); 151e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung if (preview != null) { 15281efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka image.mAllowRequestLayout = false; 153e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung image.setImageDrawable(preview); 154dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka if (mIsAppWidget) { 155dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka // center horizontally 156dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka int[] imageSize = getPreviewSize(); 157dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka int centerAmount = (imageSize[0] - preview.getIntrinsicWidth()) / 2; 158c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung image.setPadding(mOriginalImagePadding.left + centerAmount, 159c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mOriginalImagePadding.top, 160c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mOriginalImagePadding.right, 161c93e5ae12018bb214099ff88a48cc21580aec4c3Winson Chung mOriginalImagePadding.bottom); 162dac8591072959f69eaa8c6319311fd111ae75db6Michael Jurka } 16368e4c64a67f4a40afac4cab44def461783f096a4Winson Chung image.setAlpha(1f); 16481efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka image.mAllowRequestLayout = true; 165e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung } 166e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung } 167e4a647f8793ce7823394db43d6af57f9eab8a340Winson Chung 168ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen void setShortPressListener(ShortPressListener listener) { 169ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mShortPressListener = listener; 170ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 171ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 172ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen interface ShortPressListener { 173ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen void onShortPress(View v); 174ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen void cleanUpShortPress(View v); 175ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 176ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 177ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen class CheckForShortPress implements Runnable { 178ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen public void run() { 179c93ea442024bb74691048b4cc342322385ac8cf7Adam Cohen if (sShortpressTarget != null) return; 180ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (mShortPressListener != null) { 181ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mShortPressListener.onShortPress(PagedViewWidget.this); 182263301a391c5eaa7a1f651d79c79c863c60e496aAdam Cohen sShortpressTarget = PagedViewWidget.this; 183ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 184ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mShortPressTriggered = true; 185ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 186ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 187ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 188ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen private void checkForShortPress() { 1890e56cc9fd6814af5813e73ba7a71bf1d51d4208aAdam Cohen if (sShortpressTarget != null) return; 190ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (mPendingCheckForShortPress == null) { 191ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mPendingCheckForShortPress = new CheckForShortPress(); 192ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 193ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen postDelayed(mPendingCheckForShortPress, 120); 194ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 195ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 196ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen /** 197ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen * Remove the longpress detection timer. 198ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen */ 199ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen private void removeShortPressCallback() { 200ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (mPendingCheckForShortPress != null) { 201ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen removeCallbacks(mPendingCheckForShortPress); 202ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 203ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 204ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 205ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen private void cleanUpShortPress() { 206ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen removeShortPressCallback(); 207ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (mShortPressTriggered) { 208ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen if (mShortPressListener != null) { 209ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mShortPressListener.cleanUpShortPress(PagedViewWidget.this); 210ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 211ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen mShortPressTriggered = false; 212ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 213ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 214ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 2150e56cc9fd6814af5813e73ba7a71bf1d51d4208aAdam Cohen static void resetShortPressTarget() { 2160e56cc9fd6814af5813e73ba7a71bf1d51d4208aAdam Cohen sShortpressTarget = null; 2170e56cc9fd6814af5813e73ba7a71bf1d51d4208aAdam Cohen } 2180e56cc9fd6814af5813e73ba7a71bf1d51d4208aAdam Cohen 21929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung @Override 22029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung public boolean onTouchEvent(MotionEvent event) { 221ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen super.onTouchEvent(event); 222ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen 223ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen switch (event.getAction()) { 224ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen case MotionEvent.ACTION_UP: 225ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen cleanUpShortPress(); 226ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen break; 227ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen case MotionEvent.ACTION_DOWN: 228ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen checkForShortPress(); 229ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen break; 230ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen case MotionEvent.ACTION_CANCEL: 231ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen cleanUpShortPress(); 232ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen break; 233ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen case MotionEvent.ACTION_MOVE: 234ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen break; 235ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen } 2360e56cc9fd6814af5813e73ba7a71bf1d51d4208aAdam Cohen 23729d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // We eat up the touch events here, since the PagedView (which uses the same swiping 23829d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // touch code as Workspace previously) uses onInterceptTouchEvent() to determine when 23929d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // the user is scrolling between pages. This means that if the pages themselves don't 24029d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // handle touch events, it gets forwarded up to PagedView itself, and it's own 24129d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // onTouchEvent() handling will prevent further intercept touch events from being called 24229d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // (it's the same view in that case). This is not ideal, but to prevent more changes, 24329d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung // we just always mark the touch event as handled. 244ed66b2bac7447febe2e405b4ce725cae4f6b5988Adam Cohen return true; 24529d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung } 24629d6fea296ebecb607525c8245a54696ad7c5db7Winson Chung} 247