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