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