blob: 670c8b6660c6025c067ebe896e7a51ebff5f3ce4 [file] [log] [blame]
The Android Open Source Project31dd5032009-03-03 19:32:27 -08001/*
2 * Copyright (C) 2009 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
The Android Open Source Project7376fae2009-03-11 12:11:58 -070019import android.appwidget.AppWidgetHostView;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080020import android.content.Context;
Adam Cohen41d5d6d2011-05-31 15:52:28 -070021import android.content.res.Resources;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080022import android.view.LayoutInflater;
23import android.view.MotionEvent;
24import android.view.View;
25import android.view.ViewConfiguration;
Winson Chung97d85d22011-04-13 11:27:36 -070026import android.view.ViewGroup;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080027
Romain Guyedcce092010-03-04 13:03:17 -080028import com.android.launcher.R;
29
The Android Open Source Project31dd5032009-03-03 19:32:27 -080030/**
31 * {@inheritDoc}
32 */
Michael Jurka99b6a5b2011-01-07 15:37:17 -080033public class LauncherAppWidgetHostView extends AppWidgetHostView
34 implements VisibilityChangedBroadcaster {
The Android Open Source Project31dd5032009-03-03 19:32:27 -080035 private boolean mHasPerformedLongPress;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080036 private CheckForLongPress mPendingCheckForLongPress;
The Android Open Source Project31dd5032009-03-03 19:32:27 -080037 private LayoutInflater mInflater;
Michael Jurka99b6a5b2011-01-07 15:37:17 -080038 private VisibilityChangedListener mOnVisibilityChangedListener;
39
The Android Open Source Project7376fae2009-03-11 12:11:58 -070040 public LauncherAppWidgetHostView(Context context) {
The Android Open Source Project31dd5032009-03-03 19:32:27 -080041 super(context);
42 mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
Adam Cohen41d5d6d2011-05-31 15:52:28 -070043
44 Resources r = context.getResources();
45 // We add necessary padding to the AppWidgetHostView
46 setPadding(r.getDimensionPixelSize(R.dimen.app_widget_padding_left),
47 r.getDimensionPixelSize(R.dimen.app_widget_padding_top),
48 r.getDimensionPixelSize(R.dimen.app_widget_padding_right),
49 r.getDimensionPixelSize(R.dimen.app_widget_padding_bottom));
The Android Open Source Project31dd5032009-03-03 19:32:27 -080050 }
Adam Cohen41d5d6d2011-05-31 15:52:28 -070051
The Android Open Source Project31dd5032009-03-03 19:32:27 -080052 @Override
53 protected View getErrorView() {
The Android Open Source Project7376fae2009-03-11 12:11:58 -070054 return mInflater.inflate(R.layout.appwidget_error, this, false);
The Android Open Source Project31dd5032009-03-03 19:32:27 -080055 }
56
57 public boolean onInterceptTouchEvent(MotionEvent ev) {
58 // Consume any touch events for ourselves after longpress is triggered
59 if (mHasPerformedLongPress) {
60 mHasPerformedLongPress = false;
61 return true;
62 }
Adam Cohen19072da2011-05-31 14:30:45 -070063
The Android Open Source Project31dd5032009-03-03 19:32:27 -080064 // Watch for longpress events at this level to make sure
The Android Open Source Project7376fae2009-03-11 12:11:58 -070065 // users can always pick up this widget
The Android Open Source Project31dd5032009-03-03 19:32:27 -080066 switch (ev.getAction()) {
67 case MotionEvent.ACTION_DOWN: {
68 postCheckForLongClick();
69 break;
70 }
Adam Cohen19072da2011-05-31 14:30:45 -070071
The Android Open Source Project31dd5032009-03-03 19:32:27 -080072 case MotionEvent.ACTION_UP:
73 case MotionEvent.ACTION_CANCEL:
74 mHasPerformedLongPress = false;
75 if (mPendingCheckForLongPress != null) {
76 removeCallbacks(mPendingCheckForLongPress);
77 }
78 break;
79 }
Adam Cohen19072da2011-05-31 14:30:45 -070080
The Android Open Source Project31dd5032009-03-03 19:32:27 -080081 // Otherwise continue letting touch events fall through to children
82 return false;
83 }
Adam Cohend4844c32011-02-18 19:25:06 -080084
The Android Open Source Project31dd5032009-03-03 19:32:27 -080085 class CheckForLongPress implements Runnable {
86 private int mOriginalWindowAttachCount;
87
88 public void run() {
89 if ((mParent != null) && hasWindowFocus()
90 && mOriginalWindowAttachCount == getWindowAttachCount()
91 && !mHasPerformedLongPress) {
92 if (performLongClick()) {
93 mHasPerformedLongPress = true;
94 }
95 }
96 }
97
98 public void rememberWindowAttachCount() {
99 mOriginalWindowAttachCount = getWindowAttachCount();
100 }
101 }
102
103 private void postCheckForLongClick() {
104 mHasPerformedLongPress = false;
105
106 if (mPendingCheckForLongPress == null) {
107 mPendingCheckForLongPress = new CheckForLongPress();
108 }
109 mPendingCheckForLongPress.rememberWindowAttachCount();
110 postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());
111 }
Jeff Sharkey83f111d2009-04-20 21:03:13 -0700112
113 @Override
114 public void cancelLongPress() {
115 super.cancelLongPress();
116
117 mHasPerformedLongPress = false;
118 if (mPendingCheckForLongPress != null) {
119 removeCallbacks(mPendingCheckForLongPress);
120 }
121 }
Michael Jurka99b6a5b2011-01-07 15:37:17 -0800122
123 public void setVisibilityChangedListener(VisibilityChangedListener listener) {
124 mOnVisibilityChangedListener = listener;
125 }
126
127 @Override
128 protected void onVisibilityChanged(View changedView, int visibility) {
129 if (mOnVisibilityChangedListener != null) {
130 mOnVisibilityChangedListener.receiveVisibilityChangedMessage(this);
131 }
132 super.onVisibilityChanged(changedView, visibility);
133 }
Winson Chung97d85d22011-04-13 11:27:36 -0700134
135 @Override
136 public int getDescendantFocusability() {
137 return ViewGroup.FOCUS_BLOCK_DESCENDANTS;
138 }
The Android Open Source Project31dd5032009-03-03 19:32:27 -0800139}