OnScreenHint.java revision b8af1c56debb56bad213e39245c79915c9dfece4
1b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project/*
2b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Copyright (C) 2009 The Android Open Source Project
3b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *
4b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * you may not use this file except in compliance with the License.
6b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * You may obtain a copy of the License at
7b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *
8b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *
10b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * See the License for the specific language governing permissions and
14b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * limitations under the License.
15b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */
16b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
17b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpackage com.android.camera;
18b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
19b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.Context;
20b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.content.res.Resources;
21b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.graphics.PixelFormat;
22b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.Handler;
23b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.os.ServiceManager;
24b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.util.Log;
25b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.Gravity;
26b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.LayoutInflater;
27b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.View;
28b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.view.WindowManager;
29b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectimport android.widget.TextView;
30b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
31b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project/**
32b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * A on-screen hint is a view containing a little message for the user and will
33b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * be shown on the screen continuously.  This class helps you create and show
34b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * those.
35b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project *
36b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * <p>
37b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * When the view is shown to the user, appears as a floating view over the
38b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * application.
39b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * <p>
40b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * The easiest way to use this class is to call one of the static methods that
41b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project * constructs everything you need and returns a new OnScreenHint object.
42b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project */
43b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Projectpublic class OnScreenHint {
44b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    static final String TAG = "OnScreenHint";
45b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang    static final boolean LOCAL_LOGV = false;
46b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
47b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    final Context mContext;
48b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    int mGravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
49b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    int mX, mY;
50b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    float mHorizontalMargin;
51b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    float mVerticalMargin;
52b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    View mView;
53b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    View mNextView;
54b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
55b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang    private final WindowManager.LayoutParams mParams =
56b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang            new WindowManager.LayoutParams();
57b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    private WindowManager mWM;
58b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    private final Handler mHandler = new Handler();
59b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
60b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
61b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * Construct an empty OnScreenHint object.  You must call {@link #setView}
62b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * before you can call {@link #show}.
63b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *
64b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * @param context  The context to use.  Usually your
65b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     *                 {@link android.app.Application} or
66b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     *                 {@link android.app.Activity} object.
67b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
68b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public OnScreenHint(Context context) {
69b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mContext = context;
70b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
71b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        mY = context.getResources().getDimensionPixelSize(
72b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                R.dimen.hint_y_offset);
73b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
74b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
75b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
76b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
77b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
78b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mParams.format = PixelFormat.TRANSLUCENT;
79b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mParams.windowAnimations = R.style.Animation_OnScreenHint;
80b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
81b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mParams.setTitle("OnScreenHint");
82b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
83b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
84b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
85b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Show the view on the screen.
86b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
87b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public void show() {
88b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        if (mNextView == null) {
89b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            throw new RuntimeException("setView must have been called");
90b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
91b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        if (LOCAL_LOGV) Log.v(TAG, "SHOW: " + this);
92b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mHandler.post(mShow);
93b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
94b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
95b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
96b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Close the view if it's showing.
97b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
98b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public void cancel() {
99b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        if (LOCAL_LOGV) Log.v(TAG, "HIDE: " + this);
100b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mHandler.post(mHide);
101b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
102b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
103b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
104b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Set the view to show.
105b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @see #getView
106b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
107b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public void setView(View view) {
108b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mNextView = view;
109b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
110b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
111b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
112b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Return the view.
113b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @see #setView
114b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
115b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public View getView() {
116b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return mNextView;
117b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
118b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
119b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
120b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Set the margins of the view.
121b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *
122b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @param horizontalMargin The horizontal margin, in percentage of the
123b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *        container width, between the container's edges and the
124b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *        notification
125b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @param verticalMargin The vertical margin, in percentage of the
126b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *        container height, between the container's edges and the
127b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *        notification
128b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
129b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public void setMargin(float horizontalMargin, float verticalMargin) {
130b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mHorizontalMargin = horizontalMargin;
131b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mVerticalMargin = verticalMargin;
132b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
133b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
134b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
135b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Return the horizontal margin.
136b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
137b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public float getHorizontalMargin() {
138b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return mHorizontalMargin;
139b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
140b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
141b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
142b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Return the vertical margin.
143b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
144b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public float getVerticalMargin() {
145b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return mVerticalMargin;
146b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
147b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
148b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
149b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Set the location at which the notification should appear on the screen.
150b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @see android.view.Gravity
151b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @see #getGravity
152b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
153b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public void setGravity(int gravity, int xOffset, int yOffset) {
154b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mGravity = gravity;
155b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mX = xOffset;
156b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        mY = yOffset;
157b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
158b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
159b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     /**
160b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Get the location at which the notification should appear on the screen.
161b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @see android.view.Gravity
162b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @see #getGravity
163b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
164b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public int getGravity() {
165b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return mGravity;
166b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
167b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
168b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
169b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Return the X offset in pixels to apply to the gravity's location.
170b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
171b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public int getXOffset() {
172b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return mX;
173b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
174b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
175b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
176b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Return the Y offset in pixels to apply to the gravity's location.
177b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
178b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public int getYOffset() {
179b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return mY;
180b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
181b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
182b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
183b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * Make a standard hint that just contains a text view.
184b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *
185b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * @param context  The context to use.  Usually your
186b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     *                 {@link android.app.Application} or
187b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     *                 {@link android.app.Activity} object.
188b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @param text     The text to show.  Can be formatted text.
189b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *
190b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
191b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public static OnScreenHint makeText(Context context, CharSequence text) {
192b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        OnScreenHint result = new OnScreenHint(context);
193b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
194b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        LayoutInflater inflate =
195b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                (LayoutInflater) context.getSystemService(
196b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                Context.LAYOUT_INFLATER_SERVICE);
197b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        View v = inflate.inflate(R.layout.on_screen_hint, null);
198b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        TextView tv = (TextView) v.findViewById(R.id.message);
199b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        tv.setText(text);
200b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
201b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        result.mNextView = v;
202b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
203b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return result;
204b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
205b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
206b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
207b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * Make a standard hint that just contains a text view with the text from a
208b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * resource.
209b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *
210b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * @param context  The context to use.  Usually your
211b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     *                 {@link android.app.Application} or
212b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     *                 {@link android.app.Activity} object.
213b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * @param resId    The resource id of the string resource to use.  Can be
214b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     *                 formatted text.
215b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     *
216b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @throws Resources.NotFoundException if the resource can't be found.
217b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
218b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public static OnScreenHint makeText(Context context, int resId)
219b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project                                throws Resources.NotFoundException {
220b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        return makeText(context, context.getResources().getText(resId));
221b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
222b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
223b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
224b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * Update the text in a OnScreenHint that was previously created using one
225b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * of the makeText() methods.
226b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @param resId The new text for the OnScreenHint.
227b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
228b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public void setText(int resId) {
229b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        setText(mContext.getText(resId));
230b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
231b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
232b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    /**
233b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * Update the text in a OnScreenHint that was previously created using one
234b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang     * of the makeText() methods.
235b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     * @param s The new text for the OnScreenHint.
236b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project     */
237b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    public void setText(CharSequence s) {
238b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        if (mNextView == null) {
239b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang            throw new RuntimeException("This OnScreenHint was not "
240b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                    + "created with OnScreenHint.makeText()");
241b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
242b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        TextView tv = (TextView) mNextView.findViewById(R.id.message);
243b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        if (tv == null) {
244b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang            throw new RuntimeException("This OnScreenHint was not "
245b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                    + "created with OnScreenHint.makeText()");
246b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
247b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        tv.setText(s);
248b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
249b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
250b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    private synchronized void handleShow() {
251b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        if (LOCAL_LOGV) {
252b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang            Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView
253b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                       + " mNextView=" + mNextView);
254b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        }
255b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        if (mView != mNextView) {
256b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            // remove the old view if necessary
257b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            handleHide();
258b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mView = mNextView;
259b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            final int gravity = mGravity;
260b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mParams.gravity = gravity;
261b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang            if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK)
262b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                    == Gravity.FILL_HORIZONTAL) {
263b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project                mParams.horizontalWeight = 1.0f;
264b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            }
265b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang            if ((gravity & Gravity.VERTICAL_GRAVITY_MASK)
266b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                    == Gravity.FILL_VERTICAL) {
267b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project                mParams.verticalWeight = 1.0f;
268b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            }
269b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mParams.x = mX;
270b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mParams.y = mY;
271b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mParams.verticalMargin = mVerticalMargin;
272b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mParams.horizontalMargin = mHorizontalMargin;
273b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            if (mView.getParent() != null) {
274b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                if (LOCAL_LOGV) {
275b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                    Log.v(TAG, "REMOVE! " + mView + " in " + this);
276b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                }
277b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project                mWM.removeView(mView);
278b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            }
279b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang            if (LOCAL_LOGV) Log.v(TAG, "ADD! " + mView + " in " + this);
280b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mWM.addView(mView, mParams);
281b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
282b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
283b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
284b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    private synchronized void handleHide() {
285b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang        if (LOCAL_LOGV) Log.v(TAG, "HANDLE HIDE: " + this + " mView=" + mView);
286b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        if (mView != null) {
287b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            // note: checking parent() just to make sure the view has
288b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            // been added...  i have seen cases where we get here when
289b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            // the view isn't yet added, so let's try not to crash.
290b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            if (mView.getParent() != null) {
291b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                if (LOCAL_LOGV) {
292b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                    Log.v(TAG, "REMOVE! " + mView + " in " + this);
293b8af1c56debb56bad213e39245c79915c9dfece4Chih-Chung Chang                }
294b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project                mWM.removeView(mView);
295b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            }
296b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            mView = null;
297b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
298b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    }
299b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
300b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    private Runnable mShow = new Runnable() {
301b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        public void run() {
302b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            handleShow();
303b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
304b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    };
305b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
306b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    private Runnable mHide = new Runnable() {
307b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        public void run() {
308b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project            handleHide();
309b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project        }
310b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project    };
311b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project}
312b64d345c9d51cabce43b5191532a0c185d2a70a5The Android Open Source Project
313