ZoomButtonsController.java revision b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 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"); 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 19b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectimport android.app.AlertDialog; 20b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectimport android.app.Dialog; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 22b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectimport android.content.ContentResolver; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 26b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectimport android.content.SharedPreferences; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.PixelFormat; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Rect; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Handler; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Message; 31b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectimport android.os.SystemClock; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.provider.Settings; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.Gravity; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.KeyEvent; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.MotionEvent; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewConfiguration; 39b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectimport android.view.Window; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnClickListener; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.WindowManager.LayoutParams; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// TODO: make sure no px values exist, only dip (scale if necessary from Viewconfiguration) 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: Docs 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you are using this with a custom View, please call 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #setVisible(boolean) setVisible(false)} from the 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link View#onDetachedFromWindow}. 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 55b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectpublic class ZoomButtonsController implements View.OnTouchListener, View.OnKeyListener { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "ZoomButtonsController"; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ZOOM_CONTROLS_TIMEOUT = 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (int) ViewConfiguration.getZoomControlsTimeout(); 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: scaled to density 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int ZOOM_CONTROLS_TOUCH_PADDING = 20; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private WindowManager mWindowManager; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 69b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * The view that is being zoomed by this zoom controller. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mOwnerView; 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The bounds of the owner view in global coordinates. This is recalculated 75b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * each time the zoom controller is shown. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Rect mOwnerViewBounds = new Rect(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The container that is added as a window. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private FrameLayout mContainer; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private LayoutParams mContainerLayoutParams; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mContainerLocation = new int[2]; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ZoomControls mControls; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The view (or null) that should receive touch events. This will get set if 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the touch down hits the container. It will be reset on the touch up. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View mTouchTargetView; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link #mTouchTargetView}'s location in window, set on touch down. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int[] mTouchTargetLocationInWindow = new int[2]; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 98b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * If the zoom controller is dismissed but the user is still in a touch 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * interaction, we set this to true. This will ignore all touch events until 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * up/cancel, and then set the owner's touch listener to null. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mReleaseTouchListenerOnUp; 103b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 104b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project private boolean mIsSecondTapDown; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mIsVisible; 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Rect mTempRect = new Rect(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private OnZoomListener mCallback; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * When showing the zoom, we add the view as a new window. However, there is 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * logic that needs to know the size of the zoom which is determined after 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it's laid out. Therefore, we must post this logic onto the UI thread so 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it will be exceuted AFTER the layout. This is the logic. 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Runnable mPostedVisibleInitializer; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private IntentFilter mConfigurationChangedFilter = 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private BroadcastReceiver mConfigurationChangedReceiver = new BroadcastReceiver() { 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mIsVisible) return; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeMessages(MSG_POST_CONFIGURATION_CHANGED); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendEmptyMessage(MSG_POST_CONFIGURATION_CHANGED); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 133b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /** 134b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * The setting name that tracks whether we've shown the zoom tutorial. 135b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project */ 136b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project private static final String SETTING_NAME_SHOWN_TUTORIAL = "shown_zoom_tutorial"; 137b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project private static Dialog sTutorialDialog; 138b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** When configuration changes, this is called after the UI thread is idle. */ 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MSG_POST_CONFIGURATION_CHANGED = 2; 141b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /** Used to delay the zoom controller dismissal. */ 142b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project private static final int MSG_DISMISS_ZOOM_CONTROLS = 3; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If setVisible(true) is called and the owner view's window token is null, 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * we delay the setVisible(true) call until it is not null. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MSG_POST_SET_VISIBLE = 4; 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Handler mHandler = new Handler() { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (msg.what) { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MSG_POST_CONFIGURATION_CHANGED: 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project onPostConfigurationChanged(); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 157b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project case MSG_DISMISS_ZOOM_CONTROLS: 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setVisible(false); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MSG_POST_SET_VISIBLE: 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOwnerView.getWindowToken() == null) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Doh, it is still null, throw an exception 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException( 165b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project "Cannot make the zoom controller visible if the owner view is " + 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "not attached to a window."); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setVisible(true); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ZoomButtonsController(Context context, View ownerView) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwnerView = ownerView; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainer = createContainer(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 182b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 183b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public void setZoomInEnabled(boolean enabled) { 184b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mControls.setIsZoomInEnabled(enabled); 185b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 186b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 187b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public void setZoomOutEnabled(boolean enabled) { 188b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mControls.setIsZoomOutEnabled(enabled); 189b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 190b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 191b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public void setZoomSpeed(long speed) { 192b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mControls.setZoomSpeed(speed); 193b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 194b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private FrameLayout createContainer() { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.gravity = Gravity.BOTTOM | Gravity.CENTER; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.flags = LayoutParams.FLAG_NOT_TOUCHABLE | 199b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project LayoutParams.FLAG_NOT_FOCUSABLE | 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutParams.FLAG_LAYOUT_NO_LIMITS; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.height = LayoutParams.WRAP_CONTENT; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.width = LayoutParams.FILL_PARENT; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.type = LayoutParams.TYPE_APPLICATION_PANEL; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.format = PixelFormat.TRANSPARENT; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: make a new animation for this 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project lp.windowAnimations = com.android.internal.R.style.Animation_InputMethodFancy; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainerLayoutParams = lp; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FrameLayout container = new FrameLayout(mContext); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project container.setLayoutParams(lp); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project container.setMeasureAllChildren(true); 212b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project container.setOnKeyListener(this); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutInflater inflater = (LayoutInflater) mContext 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project inflater.inflate(com.android.internal.R.layout.zoom_magnify, container); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mControls = (ZoomControls) container.findViewById(com.android.internal.R.id.zoomControls); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mControls.setOnZoomInClickListener(new OnClickListener() { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(View v) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) mCallback.onZoom(true); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mControls.setOnZoomOutClickListener(new OnClickListener() { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(View v) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) mCallback.onZoom(false); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View overview = container.findViewById(com.android.internal.R.id.zoomMagnify); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overview.setVisibility(View.GONE); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project overview.setOnClickListener(new OnClickListener() { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(View v) { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) mCallback.onOverview(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return container; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setCallback(OnZoomListener callback) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallback = callback; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setFocusable(boolean focusable) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (focusable) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainerLayoutParams.flags &= ~LayoutParams.FLAG_NOT_FOCUSABLE; 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainerLayoutParams.flags |= LayoutParams.FLAG_NOT_FOCUSABLE; 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsVisible) { 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowManager.updateViewLayout(mContainer, mContainerLayoutParams); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setOverviewVisible(boolean visible) { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainer.findViewById(com.android.internal.R.id.zoomMagnify) 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .setVisibility(visible ? View.VISIBLE : View.GONE); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isVisible() { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mIsVisible; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setVisible(boolean visible) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!useThisZoom(mContext)) return; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOwnerView.getWindowToken() == null) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We need a window token to show ourselves, maybe the owner's 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * window hasn't been created yet but it will have been by the 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * time the looper is idle, so post the setVisible(true) call. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mHandler.hasMessages(MSG_POST_SET_VISIBLE)) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.sendEmptyMessage(MSG_POST_SET_VISIBLE); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mIsVisible == visible) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIsVisible = visible; 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContainerLayoutParams.token == null) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainerLayoutParams.token = mOwnerView.getWindowToken(); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowManager.addView(mContainer, mContainerLayoutParams); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPostedVisibleInitializer == null) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPostedVisibleInitializer = new Runnable() { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void run() { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshPositioningVariables(); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallback.onVisibilityChanged(true); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.post(mPostedVisibleInitializer); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Handle configuration changes when visible 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.registerReceiver(mConfigurationChangedReceiver, mConfigurationChangedFilter); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Steal touches events from the owner 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwnerView.setOnTouchListener(this); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReleaseTouchListenerOnUp = false; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't want to steal any more touches 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTouchTargetView != null) { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We are still stealing the touch events for this touch 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sequence, so release the touch listener later 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReleaseTouchListenerOnUp = true; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwnerView.setOnTouchListener(null); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No longer care about configuration changes 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.unregisterReceiver(mConfigurationChangedReceiver); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowManager.removeView(mContainer); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandler.removeCallbacks(mPostedVisibleInitializer); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallback.onVisibilityChanged(false); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * TODO: docs 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Notes: 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - Please ensure you set your View to INVISIBLE not GONE when hiding it. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return TODO 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public FrameLayout getContainer() { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mContainer; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 357b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public int getZoomControlsId() { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mControls.getId(); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void dismissControlsDelayed(int delay) { 362b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mHandler.removeMessages(MSG_DISMISS_ZOOM_CONTROLS); 363b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mHandler.sendEmptyMessageDelayed(MSG_DISMISS_ZOOM_CONTROLS, delay); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Should be called by the client for each event belonging to the second tap 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (the down, move, up, and cancel events). 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param event The event belonging to the second tap. 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the event was consumed. 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean handleDoubleTapEvent(MotionEvent event) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!useThisZoom(mContext)) return false; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int action = event.getAction(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (action == MotionEvent.ACTION_DOWN) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = (int) event.getX(); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = (int) event.getY(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 382b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /* 383b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * This class will consume all events in the second tap (down, 384b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * move(s), up). But, the owner already got the second tap's down, 385b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * so cancel that. Do this before setVisible, since that call 386b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * will set us as a touch listener. 387b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project */ 388b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project MotionEvent cancelEvent = MotionEvent.obtain(event.getDownTime(), 389b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SystemClock.elapsedRealtime(), 390b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project MotionEvent.ACTION_CANCEL, 0, 0, 0); 391b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mOwnerView.dispatchTouchEvent(cancelEvent); 392b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project cancelEvent.recycle(); 393b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setVisible(true); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project centerPoint(x, y); 396b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mIsSecondTapDown = true; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void refreshPositioningVariables() { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Calculate the owner view's bounds 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwnerView.getGlobalVisibleRect(mOwnerViewBounds); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContainer.getLocationOnScreen(mContainerLocation); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Centers the point (in owner view's coordinates). 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void centerPoint(int x, int y) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) { 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallback.onCenter(x, y); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 417b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public boolean onKey(View v, int keyCode, KeyEvent event) { 418b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT); 419b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return false; 420b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 421b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onTouch(View v, MotionEvent event) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int action = event.getAction(); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 425b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project // Consume all events during the second-tap interaction (down, move, up/cancel) 426b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project boolean consumeEvent = mIsSecondTapDown; 427b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if ((action == MotionEvent.ACTION_UP) || (action == MotionEvent.ACTION_CANCEL)) { 428b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project // The second tap can no longer be down 429b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project mIsSecondTapDown = false; 430b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 431b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mReleaseTouchListenerOnUp) { 433b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project // The controls were dismissed but we need to throw away all events until the up 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwnerView.setOnTouchListener(null); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTouchTargetView(null); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReleaseTouchListenerOnUp = false; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Eat this event 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: optimize this (it ends up removing message and queuing another) 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View targetView = mTouchTargetView; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (action) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MotionEvent.ACTION_DOWN: 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetView = getViewForTouch((int) event.getRawX(), (int) event.getRawY()); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTouchTargetView(targetView); 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MotionEvent.ACTION_UP: 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MotionEvent.ACTION_CANCEL: 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setTouchTargetView(null); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetView != null) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The upperleft corner of the target view in raw coordinates 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int targetViewRawX = mContainerLocation[0] + mTouchTargetLocationInWindow[0]; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int targetViewRawY = mContainerLocation[1] + mTouchTargetLocationInWindow[1]; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MotionEvent containerEvent = MotionEvent.obtain(event); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert the motion event into the target view's coordinates (from 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // owner view's coordinates) 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project containerEvent.offsetLocation(mOwnerViewBounds.left - targetViewRawX, 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOwnerViewBounds.top - targetViewRawY); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean retValue = targetView.dispatchTouchEvent(containerEvent); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project containerEvent.recycle(); 473b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return retValue || consumeEvent; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 476b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return consumeEvent; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void setTouchTargetView(View view) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTouchTargetView = view; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (view != null) { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view.getLocationInWindow(mTouchTargetLocationInWindow); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the View that should receive a touch at the given coordinates. 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawX The raw X. 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param rawY The raw Y. 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The view that should receive the touches, or null if there is not one. 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private View getViewForTouch(int rawX, int rawY) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Reverse order so the child drawn on top gets first dibs. 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int containerCoordsX = rawX - mContainerLocation[0]; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int containerCoordsY = rawY - mContainerLocation[1]; 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Rect frame = mTempRect; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mContainer.getChildCount() - 1; i >= 0; i--) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View child = mContainer.getChildAt(i); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (child.getVisibility() != View.VISIBLE) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project child.getHitRect(frame); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Expand the touch region 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project frame.top -= ZOOM_CONTROLS_TOUCH_PADDING; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (frame.contains(containerCoordsX, containerCoordsY)) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return child; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void onPostConfigurationChanged() { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dismissControlsDelayed(ZOOM_CONTROLS_TIMEOUT); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshPositioningVariables(); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 521b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /* 522b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * This is static so Activities can call this instead of the Views 523b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * (Activities usually do not have a reference to the ZoomButtonsController 524b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * instance.) 525b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project */ 526b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /** 527b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * Shows a "tutorial" (some text) to the user teaching her the new zoom 528b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * invocation method. Must call from the main thread. 529b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * <p> 530b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * It checks the global system setting to ensure this has not been seen 531b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * before. Furthermore, if the application does not have privilege to write 532b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * to the system settings, it will store this bit locally in a shared 533b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * preference. 534b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * 535b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * @hide This should only be used by our main apps--browser, maps, and 536b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * gallery 537b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project */ 538b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public static void showZoomTutorialOnce(Context context) { 539b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project ContentResolver cr = context.getContentResolver(); 540b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (Settings.System.getInt(cr, SETTING_NAME_SHOWN_TUTORIAL, 0) == 1) { 541b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return; 542b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 543b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 544b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SharedPreferences sp = context.getSharedPreferences("_zoom", Context.MODE_PRIVATE); 545b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (sp.getInt(SETTING_NAME_SHOWN_TUTORIAL, 0) == 1) { 546b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return; 547b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 548b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 549b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (sTutorialDialog != null && sTutorialDialog.isShowing()) { 550b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sTutorialDialog.dismiss(); 551b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 552b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 553b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project LayoutInflater layoutInflater = 554b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 555b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project TextView textView = (TextView) layoutInflater.inflate( 556b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project com.android.internal.R.layout.alert_dialog_simple_text, null) 557b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project .findViewById(android.R.id.text1); 558b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project textView.setText(com.android.internal.R.string.tutorial_double_tap_to_zoom_message_short); 559b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 560b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sTutorialDialog = new AlertDialog.Builder(context) 561b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project .setView(textView) 562b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project .setIcon(0) 563b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project .create(); 564b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 565b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project Window window = sTutorialDialog.getWindow(); 566b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project window.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM); 567b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND | 568b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project WindowManager.LayoutParams.FLAG_BLUR_BEHIND); 569b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | 570b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE); 571b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 572b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sTutorialDialog.show(); 573b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 574b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 575b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /** @hide Should only be used by Android platform apps */ 576b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public static void finishZoomTutorial(Context context, boolean userNotified) { 577b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (sTutorialDialog == null) return; 578b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 579b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sTutorialDialog.dismiss(); 580b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sTutorialDialog = null; 581b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 582b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project // Record that they have seen the tutorial 583b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (userNotified) { 584b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project try { 585b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project Settings.System.putInt(context.getContentResolver(), SETTING_NAME_SHOWN_TUTORIAL, 586b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 1); 587b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } catch (SecurityException e) { 588b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /* 589b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * The app does not have permission to clear this global flag, make 590b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * sure the user does not see the message when he comes back to this 591b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * same app at least. 592b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project */ 593b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SharedPreferences sp = context.getSharedPreferences("_zoom", Context.MODE_PRIVATE); 594b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project sp.edit().putInt(SETTING_NAME_SHOWN_TUTORIAL, 1).commit(); 595b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 596b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 597b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 598b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 599b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /** @hide Should only be used by Android platform apps */ 600b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public void finishZoomTutorial() { 601b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project finishZoomTutorial(mContext, true); 602b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 603b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 604b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project // Temporary methods for different zoom types 605b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project static int getZoomType(Context context) { 606b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return Settings.System.getInt(context.getContentResolver(), "zoom", 1); 607b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 608b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 609b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public static boolean useOldZoom(Context context) { 610b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return getZoomType(context) == 0; 611b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 612b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static boolean useThisZoom(Context context) { 614b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return getZoomType(context) == 2; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 616b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface OnZoomListener { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onCenter(int x, int y); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onVisibilityChanged(boolean visible); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onZoom(boolean zoomIn); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void onOverview(); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 624