19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007-2008 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"); you may not 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 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, WITHOUT 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * License for the specific language governing permissions and limitations under 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.inputmethodservice; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Dialog; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 2483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackbornimport android.view.KeyEvent; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A SoftInputWindow is a Dialog that is intended to be used for a top-level input 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * method window. It will be displayed along the edge of the screen, moving 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the application user interface away from it so that the focused item is 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * always visible. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass SoftInputWindow extends Dialog { 3483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn final KeyEvent.DispatcherState mDispatcherState; 3583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setToken(IBinder token) { 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp = getWindow().getAttributes(); 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.token = token; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getWindow().setAttributes(lp); 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Create a DockWindow that uses a custom style. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context The Context in which the DockWindow should run. In 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * particular, it uses the window manager and theme from this context 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to present its UI. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param theme A style resource describing the theme to use for the window. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See <a href="{@docRoot}reference/available-resources.html#stylesandthemes">Style 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and Theme Resources</a> for more information about defining and 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using styles. This theme is applied on top of the current theme in 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>context</var>. If 0, the default dialog theme will be used. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn public SoftInputWindow(Context context, int theme, 5583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn KeyEvent.DispatcherState dispatcherState) { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(context, theme); 5783fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn mDispatcherState = dispatcherState; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initDockWindow(); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6183fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn @Override 6283fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn public void onWindowFocusChanged(boolean hasFocus) { 6383fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn super.onWindowFocusChanged(hasFocus); 6483fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn mDispatcherState.reset(); 6583fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn } 6683fe3f559249451706957b1a5f660b2b8272f114Dianne Hackborn 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the size of the DockWindow. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return If the DockWindow sticks to the top or bottom of the screen, the 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return value is the height of the DockWindow, and its width is 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * equal to the width of the screen; If the DockWindow sticks to the 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * left or right of the screen, the return value is the width of the 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * DockWindow, and its height is equal to the height of the screen. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getSize() { 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp = getWindow().getAttributes(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lp.gravity == Gravity.TOP || lp.gravity == Gravity.BOTTOM) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lp.height; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return lp.width; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the size of the DockWindow. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size If the DockWindow sticks to the top or bottom of the screen, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <var>size</var> is the height of the DockWindow, and its width is 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * equal to the width of the screen; If the DockWindow sticks to the 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * left or right of the screen, <var>size</var> is the width of the 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * DockWindow, and its height is equal to the height of the screen. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSize(int size) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp = getWindow().getAttributes(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lp.gravity == Gravity.TOP || lp.gravity == Gravity.BOTTOM) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.width = -1; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.height = size; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.width = size; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.height = -1; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getWindow().setAttributes(lp); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set which boundary of the screen the DockWindow sticks to. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param gravity The boundary of the screen to stick. See {#link 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.view.Gravity.LEFT}, {#link android.view.Gravity.TOP}, 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {#link android.view.Gravity.BOTTOM}, {#link 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android.view.Gravity.RIGHT}. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setGravity(int gravity) { 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp = getWindow().getAttributes(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean oldIsVertical = (lp.gravity == Gravity.TOP || lp.gravity == Gravity.BOTTOM); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.gravity = gravity; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean newIsVertical = (lp.gravity == Gravity.TOP || lp.gravity == Gravity.BOTTOM); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (oldIsVertical != newIsVertical) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int tmp = lp.width; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.width = lp.height; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.height = tmp; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getWindow().setAttributes(lp); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initDockWindow() { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams lp = getWindow().getAttributes(); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.type = WindowManager.LayoutParams.TYPE_INPUT_METHOD; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.setTitle("InputMethod"); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.gravity = Gravity.BOTTOM; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.width = -1; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Let the input method window's orientation follow sensor based rotation 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Turn this off for now, it is very problematic. 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_USER; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getWindow().setAttributes(lp); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getWindow().setFlags( 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WindowManager.LayoutParams.FLAG_DIM_BEHIND); 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 154