131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/* 231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * Copyright (C) 2009 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 17a5902524d4403885eb4c50360bf3465c6be796efJoe Onoratopackage com.android.launcher2; 1831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 197376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Projectimport android.appwidget.AppWidgetHostView; 2031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.content.Context; 2131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.LayoutInflater; 2231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.MotionEvent; 2331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Projectimport android.view.View; 2497d85d23b013347bead4e2f5fa430a79ce69431eWinson Chungimport android.view.ViewGroup; 2506dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohenimport android.widget.RemoteViews; 2631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 27edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guyimport com.android.launcher.R; 28edcce099c98a6c40d10109ac092ab50f9d2668f3Romain Guy 2931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project/** 3031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project * {@inheritDoc} 3131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project */ 3208ee77090f1fef565142e9341914369b1aa342d1Michael Jurkapublic class LauncherAppWidgetHostView extends AppWidgetHostView { 3388f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung private CheckLongPressHelper mLongPressHelper; 3431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project private LayoutInflater mInflater; 3506dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen private Context mContext; 3606dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen private int mPreviousOrientation; 3799b6a5b5f7808291e26f98ee8064bd9f288c3febMichael Jurka 387376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project public LauncherAppWidgetHostView(Context context) { 3931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project super(context); 4006dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen mContext = context; 4188f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung mLongPressHelper = new CheckLongPressHelper(this); 4231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 4331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4441d5d6d0768b467f2c7c47ceb027495e4d3f5effAdam Cohen 4531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project @Override 4631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project protected View getErrorView() { 477376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project return mInflater.inflate(R.layout.appwidget_error, this, false); 4831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 4931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project 5006dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen @Override 5106dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen public void updateAppWidget(RemoteViews remoteViews) { 5206dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen // Store the orientation in which the widget was inflated 5306dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen mPreviousOrientation = mContext.getResources().getConfiguration().orientation; 5406dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen super.updateAppWidget(remoteViews); 5506dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen } 5606dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen 5706dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen public boolean orientationChangedSincedInflation() { 5806dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen int orientation = mContext.getResources().getConfiguration().orientation; 5906dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen if (mPreviousOrientation != orientation) { 6006dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen return true; 6106dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen } 6206dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen return false; 6306dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen } 6406dff35763bc46884b6464a9bf4406d32cdcaea4Adam Cohen 6531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project public boolean onInterceptTouchEvent(MotionEvent ev) { 6631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Consume any touch events for ourselves after longpress is triggered 6788f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung if (mLongPressHelper.hasPerformedLongPress()) { 6888f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung mLongPressHelper.cancelLongPress(); 6931dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return true; 7031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 7119072da7441e07d5e90026d9e9e1b38f11245e44Adam Cohen 7231dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Watch for longpress events at this level to make sure 737376faefbbcbe30cc4e3f706ab95c254a4707d98The Android Open Source Project // users can always pick up this widget 7431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project switch (ev.getAction()) { 7531dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case MotionEvent.ACTION_DOWN: { 7688f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung mLongPressHelper.postCheckForLongPress(); 7731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project break; 7831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 7919072da7441e07d5e90026d9e9e1b38f11245e44Adam Cohen 8031dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case MotionEvent.ACTION_UP: 8131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project case MotionEvent.ACTION_CANCEL: 8288f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung mLongPressHelper.cancelLongPress(); 8331dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project break; 8431dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 8519072da7441e07d5e90026d9e9e1b38f11245e44Adam Cohen 8631dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project // Otherwise continue letting touch events fall through to children 8731dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project return false; 8831dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project } 89d4844c3e731b00547a31f23a00f8bd4a271e2b62Adam Cohen 9083f111d129fcb8c50b35da789f0d75604b9c0864Jeff Sharkey @Override 9183f111d129fcb8c50b35da789f0d75604b9c0864Jeff Sharkey public void cancelLongPress() { 9283f111d129fcb8c50b35da789f0d75604b9c0864Jeff Sharkey super.cancelLongPress(); 9383f111d129fcb8c50b35da789f0d75604b9c0864Jeff Sharkey 9488f334571fe41df620ba903ced9b2c69b0170d5cWinson Chung mLongPressHelper.cancelLongPress(); 9583f111d129fcb8c50b35da789f0d75604b9c0864Jeff Sharkey } 9699b6a5b5f7808291e26f98ee8064bd9f288c3febMichael Jurka 9797d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung @Override 9897d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung public int getDescendantFocusability() { 9997d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung return ViewGroup.FOCUS_BLOCK_DESCENDANTS; 10097d85d23b013347bead4e2f5fa430a79ce69431eWinson Chung } 10131dd503c6aa69018e694d91724d46db49ea09327The Android Open Source Project} 102