19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.widget;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.INotificationManager;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.ITransientNotification;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
22025f9602ee99ba5883512a97f2a46f8132ece5d6Fabrice Di Meglioimport android.content.res.Configuration;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler;
2675986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganovimport android.os.RemoteException;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View;
32dcf4f2146097eeae6991e6131e5ae96b33fbeda9John Spurlockimport android.view.View.OnClickListener;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager;
34cd2613ab7b0f4f967c1d0388e1267ad01db787a8Svetoslav Ganovimport android.view.accessibility.AccessibilityEvent;
35cd2613ab7b0f4f967c1d0388e1267ad01db787a8Svetoslav Ganovimport android.view.accessibility.AccessibilityManager;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A toast is a view containing a quick little message for the user.  The toast class
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * helps you create and show those.
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@more}
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When the view is shown to the user, appears as a floating view over the
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application.  It will never receive focus.  The user will probably be in the
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * middle of typing something else.  The idea is to be as unobtrusive as
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible, while still showing the user the information you want them to see.
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Two examples are the volume control, and the brief message saying that your
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * settings have been saved.
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The easiest way to use this class is to call one of the static methods that constructs
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * everything you need and returns a new Toast object.
52558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez *
53558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <div class="special reference">
54558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <h3>Developer Guides</h3>
55558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <p>For information about creating Toast notifications, read the
56558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * <a href="{@docRoot}guide/topics/ui/notifiers/toasts.html">Toast Notifications</a> developer
57558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * guide.</p>
58558459fe85f56f29a6ed6a4d0adb4a0bd6665884Joe Fernandez * </div>
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Toast {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final String TAG = "Toast";
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final boolean localLOGV = false;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show the view or text notification for a short period of time.  This time
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * could be user-definable.  This is the default.
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDuration
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int LENGTH_SHORT = 0;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show the view or text notification for a long period of time.  This time
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * could be user-definable.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDuration
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final int LENGTH_LONG = 1;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final Context mContext;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final TN mTN;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mDuration;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    View mNextView;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Construct an empty Toast object.  You must call {@link #setView} before you
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * can call {@link #show}.
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context  The context to use.  Usually your {@link android.app.Application}
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 or {@link android.app.Activity} object.
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Toast(Context context) {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
92cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        mTN = new TN();
93cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        mTN.mY = context.getResources().getDimensionPixelSize(
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                com.android.internal.R.dimen.toast_y_offset);
9508bef371fa2bd7839da8a65d8c2e788c647132aeJose Lima        mTN.mGravity = context.getResources().getInteger(
9608bef371fa2bd7839da8a65d8c2e788c647132aeJose Lima                com.android.internal.R.integer.config_toastDefaultGravity);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Show the view for the specified duration.
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void show() {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mNextView == null) {
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("setView must have been called");
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        INotificationManager service = getService();
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkg = mContext.getPackageName();
109cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        TN tn = mTN;
110cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        tn.mNextView = mNextView;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
113cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            service.enqueueToast(pkg, tn, mDuration);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Empty
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Close the view if it's showing, or don't show it if it isn't showing yet.
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * You do not normally have to call this.  Normally view will disappear on its own
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * after the appropriate duration.
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void cancel() {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTN.hide();
12651f2430217a377bc2913862d98a97d0087914540Jeff Brown
12751f2430217a377bc2913862d98a97d0087914540Jeff Brown        try {
12851f2430217a377bc2913862d98a97d0087914540Jeff Brown            getService().cancelToast(mContext.getPackageName(), mTN);
12951f2430217a377bc2913862d98a97d0087914540Jeff Brown        } catch (RemoteException e) {
13051f2430217a377bc2913862d98a97d0087914540Jeff Brown            // Empty
13151f2430217a377bc2913862d98a97d0087914540Jeff Brown        }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the view to show.
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getView
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setView(View view) {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextView = view;
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the view.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setView
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public View getView() {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mNextView;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set how long to show the view for.
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #LENGTH_SHORT
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #LENGTH_LONG
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setDuration(int duration) {
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDuration = duration;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the duration.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #setDuration
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getDuration() {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mDuration;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the margins of the view.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param horizontalMargin The horizontal margin, in percentage of the
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        container width, between the container's edges and the
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        notification
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalMargin The vertical margin, in percentage of the
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        container height, between the container's edges and the
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        notification
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setMargin(float horizontalMargin, float verticalMargin) {
178cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        mTN.mHorizontalMargin = horizontalMargin;
179cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        mTN.mVerticalMargin = verticalMargin;
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the horizontal margin.
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getHorizontalMargin() {
186cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        return mTN.mHorizontalMargin;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the vertical margin.
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public float getVerticalMargin() {
193cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        return mTN.mVerticalMargin;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Set the location at which the notification should appear on the screen.
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Gravity
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getGravity
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setGravity(int gravity, int xOffset, int yOffset) {
202cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        mTN.mGravity = gravity;
203cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        mTN.mX = xOffset;
204cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        mTN.mY = yOffset;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     /**
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Get the location at which the notification should appear on the screen.
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see android.view.Gravity
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @see #getGravity
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getGravity() {
213cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        return mTN.mGravity;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the X offset in pixels to apply to the gravity's location.
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getXOffset() {
220cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        return mTN.mX;
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Return the Y offset in pixels to apply to the gravity's location.
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getYOffset() {
227cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        return mTN.mY;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make a standard toast that just contains a text view.
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context  The context to use.  Usually your {@link android.app.Application}
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 or {@link android.app.Activity} object.
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param text     The text to show.  Can be formatted text.
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 {@link #LENGTH_LONG}
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Toast makeText(Context context, CharSequence text, int duration) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Toast result = new Toast(context);
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2430420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        LayoutInflater inflate = (LayoutInflater)
2440420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tv.setText(text);
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.mNextView = v;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result.mDuration = duration;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return result;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Make a standard toast that just contains a text view with the text from a resource.
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param context  The context to use.  Usually your {@link android.app.Application}
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 or {@link android.app.Activity} object.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resId    The resource id of the string resource to use.  Can be formatted text.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param duration How long to display the message.  Either {@link #LENGTH_SHORT} or
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *                 {@link #LENGTH_LONG}
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @throws Resources.NotFoundException if the resource can't be found.
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static Toast makeText(Context context, int resId, int duration)
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                throws Resources.NotFoundException {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return makeText(context, context.getResources().getText(resId), duration);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Update the text in a Toast that was previously created using one of the makeText() methods.
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param resId The new text for the Toast.
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setText(int resId) {
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        setText(mContext.getText(resId));
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Update the text in a Toast that was previously created using one of the makeText() methods.
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param s The new text for the Toast.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void setText(CharSequence s) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mNextView == null) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("This Toast was not created with Toast.makeText()");
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message);
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (tv == null) {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new RuntimeException("This Toast was not created with Toast.makeText()");
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tv.setText(s);
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29375986cf9bc57ef11ad70f36fb77fbbf5d63af6ecsvetoslavganov
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // =======================================================================================
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // All the gunk below is the interaction with the Notification Service, which handles
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // the proper ordering of these system-wide.
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // =======================================================================================
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static INotificationManager sService;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3010420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy    static private INotificationManager getService() {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = INotificationManager.Stub.asInterface(ServiceManager.getService("notification"));
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309c4d09f2b69b82201ce48dbe29c4d8bd85bdda92aRomain Guy    private static class TN extends ITransientNotification.Stub {
3100420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        final Runnable mShow = new Runnable() {
311b6ee2a24292120f95bb5da4539a0672280544be3Craig Mautner            @Override
3120420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            public void run() {
3130420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy                handleShow();
3140420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            }
3150420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        };
3160420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy
3170420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        final Runnable mHide = new Runnable() {
318b6ee2a24292120f95bb5da4539a0672280544be3Craig Mautner            @Override
3190420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            public void run() {
3200420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy                handleHide();
3212152ca58c256f4e7d8a5d895eb96cdc2d2580a05Romain Guy                // Don't do this in handleHide() because it is also invoked by handleShow()
3222152ca58c256f4e7d8a5d895eb96cdc2d2580a05Romain Guy                mNextView = null;
3230420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            }
3240420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        };
3250420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy
3260420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
327cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        final Handler mHandler = new Handler();
328cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy
32908bef371fa2bd7839da8a65d8c2e788c647132aeJose Lima        int mGravity;
330cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        int mX, mY;
331cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        float mHorizontalMargin;
332cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        float mVerticalMargin;
333cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy
33408bef371fa2bd7839da8a65d8c2e788c647132aeJose Lima
335cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        View mView;
336cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        View mNextView;
337b6ee2a24292120f95bb5da4539a0672280544be3Craig Mautner
33898365d7663cbd82979a5700faf0050220b01084dJeff Brown        WindowManager mWM;
3390420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy
340cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        TN() {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // XXX This should be changed to use a Dialog, with a Theme.Toast
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // defined that sets up the layout params appropriately.
3430420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            final WindowManager.LayoutParams params = mParams;
3440420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            params.height = WindowManager.LayoutParams.WRAP_CONTENT;
3450420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            params.width = WindowManager.LayoutParams.WRAP_CONTENT;
3460420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            params.format = PixelFormat.TRANSLUCENT;
3470420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            params.windowAnimations = com.android.internal.R.style.Animation_Toast;
3480420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            params.type = WindowManager.LayoutParams.TYPE_TOAST;
3490420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy            params.setTitle("Toast");
350f1a36648ca099d7ffa8a19e403673820d4b8417aJohn Spurlock            params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
351dcf4f2146097eeae6991e6131e5ae96b33fbeda9John Spurlock                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
352f1a36648ca099d7ffa8a19e403673820d4b8417aJohn Spurlock                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * schedule handleShow into the right thread
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
358b6ee2a24292120f95bb5da4539a0672280544be3Craig Mautner        @Override
3590420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        public void show() {
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (localLOGV) Log.v(TAG, "SHOW: " + this);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.post(mShow);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * schedule handleHide into the right thread
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
367b6ee2a24292120f95bb5da4539a0672280544be3Craig Mautner        @Override
3680420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        public void hide() {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (localLOGV) Log.v(TAG, "HIDE: " + this);
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mHandler.post(mHide);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3730420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        public void handleShow() {
374cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView
375cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    + " mNextView=" + mNextView);
376cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            if (mView != mNextView) {
377cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                // remove the old view if necessary
378cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                handleHide();
379cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mView = mNextView;
38054ae2f389cd0d9b9a558b5f61e096aec6215966bCraig Mautner                Context context = mView.getContext().getApplicationContext();
38154ae2f389cd0d9b9a558b5f61e096aec6215966bCraig Mautner                if (context == null) {
38254ae2f389cd0d9b9a558b5f61e096aec6215966bCraig Mautner                    context = mView.getContext();
38354ae2f389cd0d9b9a558b5f61e096aec6215966bCraig Mautner                }
38454ae2f389cd0d9b9a558b5f61e096aec6215966bCraig Mautner                mWM = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
385b4946343e8027925a92f1353af5ad154a84e425fFabrice Di Meglio                // We can resolve the Gravity here by using the Locale for getting
386b4946343e8027925a92f1353af5ad154a84e425fFabrice Di Meglio                // the layout direction
387025f9602ee99ba5883512a97f2a46f8132ece5d6Fabrice Di Meglio                final Configuration config = mView.getContext().getResources().getConfiguration();
3885f7979993979466c79ab4f38d83c6f2aca361662Fabrice Di Meglio                final int gravity = Gravity.getAbsoluteGravity(mGravity, config.getLayoutDirection());
389cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mParams.gravity = gravity;
390cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {
391cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    mParams.horizontalWeight = 1.0f;
392cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                }
393cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
394cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    mParams.verticalWeight = 1.0f;
395cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                }
396cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mParams.x = mX;
397cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mParams.y = mY;
398cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mParams.verticalMargin = mVerticalMargin;
399cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mParams.horizontalMargin = mHorizontalMargin;
400cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                if (mView.getParent() != null) {
401cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this);
402cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    mWM.removeView(mView);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
404cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this);
405cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mWM.addView(mView, mParams);
406cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                trySendAccessibilityEvent();
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
410cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        private void trySendAccessibilityEvent() {
411cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            AccessibilityManager accessibilityManager =
412cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    AccessibilityManager.getInstance(mView.getContext());
413cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            if (!accessibilityManager.isEnabled()) {
414cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                return;
415cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            }
416cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            // treat toasts as notifications since they are used to
417cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            // announce a transient piece of information to the user
418cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            AccessibilityEvent event = AccessibilityEvent.obtain(
419cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);
420cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            event.setClassName(getClass().getName());
421cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            event.setPackageName(mView.getContext().getPackageName());
422cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            mView.dispatchPopulateAccessibilityEvent(event);
423cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            accessibilityManager.sendAccessibilityEvent(event);
424cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy        }
425cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy
4260420cc7fed645cfa30f8142d7cd1a53f6b0b33d3Romain Guy        public void handleHide() {
427cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            if (localLOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + mView);
428cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy            if (mView != null) {
429cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                // note: checking parent() just to make sure the view has
430cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                // been added...  i have seen cases where we get here when
431cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                // the view isn't yet added, so let's try not to crash.
432cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                if (mView.getParent() != null) {
433cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    if (localLOGV) Log.v(TAG, "REMOVE! " + mView + " in " + this);
434cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                    mWM.removeView(mView);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
436cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy
437cf3dd6bc6903282077c0044d1fdacba8f45e0886Romain Guy                mView = null;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
442