1b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller/* 2b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * Copyright (C) 2012 The Android Open Source Project 3b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * 4b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * Licensed under the Apache License, Version 2.0 (the "License"); 5b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * you may not use this file except in compliance with the License. 6b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * You may obtain a copy of the License at 7b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * 8b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * http://www.apache.org/licenses/LICENSE-2.0 9b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * 10b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * Unless required by applicable law or agreed to in writing, software 11b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * distributed under the License is distributed on an "AS IS" BASIS, 12b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * See the License for the specific language governing permissions and 14b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller * limitations under the License. 15b5f3b707a7010e8d867da9342ea87cf0a1679692Jim Miller */ 165ecd81154fa039961f65bb4e36d18ac555b0d1d6Jim Millerpackage com.android.keyguard; 17d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 186fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenimport android.os.Handler; 196fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenimport android.os.Looper; 20c162dd049084681711526b219ea997aa23f5ad98Jim Millerimport android.util.Log; 21d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Millerimport android.view.View; 22d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 2348275d2de99ff2556031929c48f295d3f93447b6Winson Chungpublic class KeyguardViewStateManager implements 2448275d2de99ff2556031929c48f295d3f93447b6Winson Chung SlidingChallengeLayout.OnChallengeScrolledListener, 2548275d2de99ff2556031929c48f295d3f93447b6Winson Chung ChallengeLayout.OnBouncerStateChangedListener { 26d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 27c162dd049084681711526b219ea997aa23f5ad98Jim Miller private static final String TAG = "KeyguardViewStateManager"; 287f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen private KeyguardWidgetPager mKeyguardWidgetPager; 2919a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller private ChallengeLayout mChallengeLayout; 30d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen private KeyguardHostView mKeyguardHostView; 31d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller private int[] mTmpPoint = new int[2]; 328a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen private int[] mTmpLoc = new int[2]; 338a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen 348a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen private KeyguardSecurityView mKeyguardSecurityContainer; 356fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen private static final int SCREEN_ON_HINT_DURATION = 1000; 3647c6cfaa3799951f999a4d2000cb628080708551Adam Cohen private static final int SCREEN_ON_RING_HINT_DELAY = 300; 37caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller private static final boolean SHOW_INITIAL_PAGE_HINTS = false; 386fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen Handler mMainQueue = new Handler(Looper.myLooper()); 39d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 40e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen int mLastScrollState = SlidingChallengeLayout.SCROLL_STATE_IDLE; 41e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen 42e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen // Paged view state 43e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen private int mPageListeningToSlider = -1; 44e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen private int mCurrentPage = -1; 458caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen private int mPageIndexOnPageBeginMoving = -1; 46e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen 47d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller int mChallengeTop = 0; 48d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 49d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen public KeyguardViewStateManager(KeyguardHostView hostView) { 50d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen mKeyguardHostView = hostView; 51d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 52d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 53d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller public void setPagedView(KeyguardWidgetPager pagedView) { 547f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen mKeyguardWidgetPager = pagedView; 557f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen updateEdgeSwiping(); 56d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 57d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 5819a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller public void setChallengeLayout(ChallengeLayout layout) { 5919a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller mChallengeLayout = layout; 607f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen updateEdgeSwiping(); 617f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen } 627f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen 637f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen private void updateEdgeSwiping() { 647f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen if (mChallengeLayout != null && mKeyguardWidgetPager != null) { 657f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen if (mChallengeLayout.isChallengeOverlapping()) { 667f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(true); 677f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen } else { 687f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(false); 697f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen } 707f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen } 71d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 72d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 739dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung public boolean isChallengeShowing() { 749dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung if (mChallengeLayout != null) { 759dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung return mChallengeLayout.isChallengeShowing(); 769dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung } 779dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung return false; 789dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung } 799dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung 8070aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung public boolean isChallengeOverlapping() { 8170aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung if (mChallengeLayout != null) { 8270aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung return mChallengeLayout.isChallengeOverlapping(); 8370aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung } 8470aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung return false; 8570aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung } 8670aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung 876fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void setSecurityViewContainer(KeyguardSecurityView container) { 886fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mKeyguardSecurityContainer = container; 896fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 906fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen 918caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen public void showBouncer(boolean show) { 92138f25d75665bd07d34294364c5b6f530b33503fJim Miller CharSequence what = mKeyguardHostView.getContext().getResources().getText( 93138f25d75665bd07d34294364c5b6f530b33503fJim Miller show ? R.string.keyguard_accessibility_show_bouncer 94138f25d75665bd07d34294364c5b6f530b33503fJim Miller : R.string.keyguard_accessibility_hide_bouncer); 95138f25d75665bd07d34294364c5b6f530b33503fJim Miller mKeyguardHostView.announceForAccessibility(what); 96138f25d75665bd07d34294364c5b6f530b33503fJim Miller mKeyguardHostView.announceCurrentSecurityMethod(); 978caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen mChallengeLayout.showBouncer(); 988caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen } 998caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen 100c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren public boolean isBouncing() { 101c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren return mChallengeLayout.isBouncing(); 102c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren } 103c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren 1048caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen public void fadeOutSecurity(int duration) { 105c162dd049084681711526b219ea997aa23f5ad98Jim Miller ((View) mKeyguardSecurityContainer).animate().alpha(0f).setDuration(duration).start(); 1068caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen } 1078caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen 1088caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen public void fadeInSecurity(int duration) { 109c162dd049084681711526b219ea997aa23f5ad98Jim Miller ((View) mKeyguardSecurityContainer).animate().alpha(1f).setDuration(duration).start(); 1108caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen } 1118caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen 112d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller public void onPageBeginMoving() { 1138caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen if (mChallengeLayout.isChallengeOverlapping() && 114db1c5d596e91713132131601536aaad32e693325Adam Cohen mChallengeLayout instanceof SlidingChallengeLayout) { 115db1c5d596e91713132131601536aaad32e693325Adam Cohen SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout; 116c162dd049084681711526b219ea997aa23f5ad98Jim Miller if (!mKeyguardWidgetPager.isWarping()) { 117c162dd049084681711526b219ea997aa23f5ad98Jim Miller scl.fadeOutChallenge(); 118c162dd049084681711526b219ea997aa23f5ad98Jim Miller } 1198caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen mPageIndexOnPageBeginMoving = mKeyguardWidgetPager.getCurrentPage(); 120d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 1211413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka // We use mAppWidgetToShow to show a particular widget after you add it-- 1221413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka // once the user swipes a page we clear that behavior 1231413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka if (mKeyguardHostView != null) { 1241413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka mKeyguardHostView.clearAppWidgetToShow(); 1254eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller mKeyguardHostView.setOnDismissAction(null); 1261413889565bc1b9d5d5fb73302460a4f25f4a8c0Michael Jurka } 1276fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen if (mHideHintsRunnable != null) { 1286fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mMainQueue.removeCallbacks(mHideHintsRunnable); 1296fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen mHideHintsRunnable = null; 1306fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 131d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 132d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 133d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller public void onPageEndMoving() { 1348caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen mPageIndexOnPageBeginMoving = -1; 13570009e426a39cc2940d264c4fb87a4402c60b0ffAdam Cohen } 13670009e426a39cc2940d264c4fb87a4402c60b0ffAdam Cohen 137bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock public void onPageSwitching(View newPage, int newPageIndex) { 1387f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen if (mKeyguardWidgetPager != null && mChallengeLayout instanceof SlidingChallengeLayout) { 139bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock boolean isCameraPage = newPage instanceof CameraWidgetFrame; 140c162dd049084681711526b219ea997aa23f5ad98Jim Miller SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout; 141c162dd049084681711526b219ea997aa23f5ad98Jim Miller scl.setChallengeInteractive(!isCameraPage); 142fadccf1d0e13194254e0c87851698ca4fcc98c81Jim Miller if (isCameraPage) { 143fadccf1d0e13194254e0c87851698ca4fcc98c81Jim Miller scl.fadeOutChallenge(); 144fadccf1d0e13194254e0c87851698ca4fcc98c81Jim Miller } 145fadccf1d0e13194254e0c87851698ca4fcc98c81Jim Miller final int currentFlags = mKeyguardWidgetPager.getSystemUiVisibility(); 146fadccf1d0e13194254e0c87851698ca4fcc98c81Jim Miller final int newFlags = isCameraPage ? (currentFlags | View.STATUS_BAR_DISABLE_SEARCH) 147fadccf1d0e13194254e0c87851698ca4fcc98c81Jim Miller : (currentFlags & ~View.STATUS_BAR_DISABLE_SEARCH); 148fadccf1d0e13194254e0c87851698ca4fcc98c81Jim Miller mKeyguardWidgetPager.setSystemUiVisibility(newFlags); 149bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock } 1508caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen 1518caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen // If the page we're settling to is the same as we started on, and the action of 1528caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen // moving the page hid the security, we restore it immediately. 1538caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen if (mPageIndexOnPageBeginMoving == mKeyguardWidgetPager.getNextPage() && 1548caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen mChallengeLayout instanceof SlidingChallengeLayout) { 1558caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout; 1568caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen scl.fadeInChallenge(); 1578caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(-1); 1588caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen } 1598caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen mPageIndexOnPageBeginMoving = -1; 160bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock } 161bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock 162bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock public void onPageSwitched(View newPage, int newPageIndex) { 163e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen // Reset the previous page size and ensure the current page is sized appropriately. 164e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen // We only modify the page state if it is not currently under control by the slider. 165e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen // This prevents conflicts. 1664ddcd573dd06a96c32285e34469cae6e7f03109bAdam Cohen 1674ddcd573dd06a96c32285e34469cae6e7f03109bAdam Cohen // If the page hasn't switched, don't bother with any of this 16825228801ba76e3419d598d9820007f4af761b3cdAdam Cohen if (mCurrentPage == newPageIndex) return; 1694ddcd573dd06a96c32285e34469cae6e7f03109bAdam Cohen 1707f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen if (mKeyguardWidgetPager != null && mChallengeLayout != null) { 1717f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen KeyguardWidgetFrame prevPage = mKeyguardWidgetPager.getWidgetPageAt(mCurrentPage); 1728caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen if (prevPage != null && mCurrentPage != mPageListeningToSlider && mCurrentPage 1738caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen != mKeyguardWidgetPager.getWidgetToResetOnPageFadeOut()) { 174e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen prevPage.resetSize(); 175d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 176d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 1777f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen KeyguardWidgetFrame newCurPage = mKeyguardWidgetPager.getWidgetPageAt(newPageIndex); 178e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping(); 179e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen if (challengeOverlapping && !newCurPage.isSmall() 180e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen && mPageListeningToSlider != newPageIndex) { 1818a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen newCurPage.shrinkWidget(); 182d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 183d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 1848caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen 185e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen mCurrentPage = newPageIndex; 186d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 187d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 188caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller public void onPageBeginWarp() { 189c162dd049084681711526b219ea997aa23f5ad98Jim Miller fadeOutSecurity(SlidingChallengeLayout.CHALLENGE_FADE_OUT_DURATION); 190c162dd049084681711526b219ea997aa23f5ad98Jim Miller View frame = mKeyguardWidgetPager.getPageAt(mKeyguardWidgetPager.getPageWarpIndex()); 191c162dd049084681711526b219ea997aa23f5ad98Jim Miller ((KeyguardWidgetFrame)frame).showFrame(this); 192caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller } 193caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller 194caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller public void onPageEndWarp() { 195c162dd049084681711526b219ea997aa23f5ad98Jim Miller fadeInSecurity(SlidingChallengeLayout.CHALLENGE_FADE_IN_DURATION); 196c162dd049084681711526b219ea997aa23f5ad98Jim Miller View frame = mKeyguardWidgetPager.getPageAt(mKeyguardWidgetPager.getPageWarpIndex()); 197c162dd049084681711526b219ea997aa23f5ad98Jim Miller ((KeyguardWidgetFrame)frame).hideFrame(this); 198caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller } 199caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller 200e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen private int getChallengeTopRelativeToFrame(KeyguardWidgetFrame frame, int top) { 201d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller mTmpPoint[0] = 0; 202e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen mTmpPoint[1] = top; 20319a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller mapPoint((View) mChallengeLayout, frame, mTmpPoint); 204e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen return mTmpPoint[1]; 205e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen } 206e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen 207d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller /** 208d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller * Simple method to map a point from one view's coordinates to another's. Note: this method 209d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller * doesn't account for transforms, so if the views will be transformed, this should not be used. 210d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller * 211d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller * @param fromView The view to which the point is relative 212d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller * @param toView The view into which the point should be mapped 213d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller * @param pt The point 214d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller */ 2158a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen private void mapPoint(View fromView, View toView, int pt[]) { 2168a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen fromView.getLocationInWindow(mTmpLoc); 2178a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen 2188a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen int x = mTmpLoc[0]; 2198a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen int y = mTmpLoc[1]; 220d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 2218a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen toView.getLocationInWindow(mTmpLoc); 2228a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen int vX = mTmpLoc[0]; 2238a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen int vY = mTmpLoc[1]; 224d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 225d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller pt[0] += x - vX; 226d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller pt[1] += y - vY; 227d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 228d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 22908c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen private void userActivity() { 23008c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen if (mKeyguardHostView != null) { 23108c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen mKeyguardHostView.onUserActivityTimeoutChanged(); 23208c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen mKeyguardHostView.userActivity(); 23308c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 23408c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen } 23508c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen 236d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller @Override 237d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller public void onScrollStateChanged(int scrollState) { 2387f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen if (mKeyguardWidgetPager == null || mChallengeLayout == null) return; 23948275d2de99ff2556031929c48f295d3f93447b6Winson Chung 240e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping(); 241e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen 242d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller if (scrollState == SlidingChallengeLayout.SCROLL_STATE_IDLE) { 2437f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider); 244e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen if (frame == null) return; 245d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 246e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen if (!challengeOverlapping) { 2477f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen if (!mKeyguardWidgetPager.isPageMoving()) { 248db1c5d596e91713132131601536aaad32e693325Adam Cohen frame.resetSize(); 24908c83ef48880b98ec45dd83867a29852160a96ebAdam Cohen userActivity(); 250db1c5d596e91713132131601536aaad32e693325Adam Cohen } else { 2518caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(mPageListeningToSlider); 252db1c5d596e91713132131601536aaad32e693325Adam Cohen } 253d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 25444dc1413768b5798168fb29ea277affb9a739033Adam Cohen if (frame.isSmall()) { 25544dc1413768b5798168fb29ea277affb9a739033Adam Cohen // This is to make sure that if the scroller animation gets cut off midway 25644dc1413768b5798168fb29ea277affb9a739033Adam Cohen // that the frame doesn't stay in a partial down position. 25744dc1413768b5798168fb29ea277affb9a739033Adam Cohen frame.setFrameHeight(frame.getSmallFrameHeight()); 25844dc1413768b5798168fb29ea277affb9a739033Adam Cohen } 259d51700b3cc6d4c66a33d18348f7c1eb66cd50ac2Adam Cohen if (scrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) { 260d51700b3cc6d4c66a33d18348f7c1eb66cd50ac2Adam Cohen frame.hideFrame(this); 261d51700b3cc6d4c66a33d18348f7c1eb66cd50ac2Adam Cohen } 2627f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen updateEdgeSwiping(); 263d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 264bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller if (mChallengeLayout.isChallengeShowing()) { 265a042ac90640c0c3fd3c5349083b86bbfd6319b64Chris Wren mKeyguardSecurityContainer.onResume(KeyguardSecurityView.VIEW_REVEALED); 266bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } else { 267bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller mKeyguardSecurityContainer.onPause(); 268bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller } 269e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen mPageListeningToSlider = -1; 270e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen } else if (mLastScrollState == SlidingChallengeLayout.SCROLL_STATE_IDLE) { 271e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen // Whether dragging or settling, if the last state was idle, we use this signal 272e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen // to update the current page who will receive events from the sliding challenge. 273e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen // We resize the frame as appropriate. 2747f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen mPageListeningToSlider = mKeyguardWidgetPager.getNextPage(); 2757f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider); 276e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen if (frame == null) return; 277e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen 27848275d2de99ff2556031929c48f295d3f93447b6Winson Chung // Skip showing the frame and shrinking the widget if we are 27948275d2de99ff2556031929c48f295d3f93447b6Winson Chung if (!mChallengeLayout.isBouncing()) { 280d51700b3cc6d4c66a33d18348f7c1eb66cd50ac2Adam Cohen if (scrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) { 281d51700b3cc6d4c66a33d18348f7c1eb66cd50ac2Adam Cohen frame.showFrame(this); 282d51700b3cc6d4c66a33d18348f7c1eb66cd50ac2Adam Cohen } 283e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen 28448275d2de99ff2556031929c48f295d3f93447b6Winson Chung // As soon as the security begins sliding, the widget becomes small (if it wasn't 28548275d2de99ff2556031929c48f295d3f93447b6Winson Chung // small to begin with). 28648275d2de99ff2556031929c48f295d3f93447b6Winson Chung if (!frame.isSmall()) { 28748275d2de99ff2556031929c48f295d3f93447b6Winson Chung // We need to fetch the final page, in case the pages are in motion. 28848275d2de99ff2556031929c48f295d3f93447b6Winson Chung mPageListeningToSlider = mKeyguardWidgetPager.getNextPage(); 28944dc1413768b5798168fb29ea277affb9a739033Adam Cohen frame.shrinkWidget(false); 29048275d2de99ff2556031929c48f295d3f93447b6Winson Chung } 29148275d2de99ff2556031929c48f295d3f93447b6Winson Chung } else { 29248275d2de99ff2556031929c48f295d3f93447b6Winson Chung if (!frame.isSmall()) { 29348275d2de99ff2556031929c48f295d3f93447b6Winson Chung // We need to fetch the final page, in case the pages are in motion. 29448275d2de99ff2556031929c48f295d3f93447b6Winson Chung mPageListeningToSlider = mKeyguardWidgetPager.getNextPage(); 29548275d2de99ff2556031929c48f295d3f93447b6Winson Chung } 296e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen } 29748275d2de99ff2556031929c48f295d3f93447b6Winson Chung 298bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller // View is on the move. Pause the security view until it completes. 299bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller mKeyguardSecurityContainer.onPause(); 300d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 301e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen mLastScrollState = scrollState; 302e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen } 303e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen 304e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen @Override 305e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen public void onScrollPositionChanged(float scrollPosition, int challengeTop) { 306e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen mChallengeTop = challengeTop; 3077f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider); 30844dc1413768b5798168fb29ea277affb9a739033Adam Cohen if (frame != null && mLastScrollState != SlidingChallengeLayout.SCROLL_STATE_FADING) { 309e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen frame.adjustFrame(getChallengeTopRelativeToFrame(frame, mChallengeTop)); 310e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen } 311d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller } 312d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller 313196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen private Runnable mHideHintsRunnable = new Runnable() { 314196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen @Override 315196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen public void run() { 3167f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen if (mKeyguardWidgetPager != null) { 3177f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen mKeyguardWidgetPager.hideOutlinesAndSidePages(); 318196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen } 319196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen } 320196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen }; 321196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen 3226fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen public void showUsabilityHints() { 32347c6cfaa3799951f999a4d2000cb628080708551Adam Cohen mMainQueue.postDelayed( new Runnable() { 32447c6cfaa3799951f999a4d2000cb628080708551Adam Cohen @Override 32547c6cfaa3799951f999a4d2000cb628080708551Adam Cohen public void run() { 32647c6cfaa3799951f999a4d2000cb628080708551Adam Cohen mKeyguardSecurityContainer.showUsabilityHint(); 32747c6cfaa3799951f999a4d2000cb628080708551Adam Cohen } 32847c6cfaa3799951f999a4d2000cb628080708551Adam Cohen } , SCREEN_ON_RING_HINT_DELAY); 329caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller if (SHOW_INITIAL_PAGE_HINTS) { 330caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller mKeyguardWidgetPager.showInitialPageHints(); 331caf24fc2c4bb9747eb80138bf3ce0be067851749Jim Miller } 332196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen if (mHideHintsRunnable != null) { 333196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen mMainQueue.postDelayed(mHideHintsRunnable, SCREEN_ON_HINT_DURATION); 334196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen } 3356fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen } 336e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller 33748275d2de99ff2556031929c48f295d3f93447b6Winson Chung // ChallengeLayout.OnBouncerStateChangedListener 33848275d2de99ff2556031929c48f295d3f93447b6Winson Chung @Override 33948275d2de99ff2556031929c48f295d3f93447b6Winson Chung public void onBouncerStateChanged(boolean bouncerActive) { 34048275d2de99ff2556031929c48f295d3f93447b6Winson Chung if (bouncerActive) { 34148275d2de99ff2556031929c48f295d3f93447b6Winson Chung mKeyguardWidgetPager.zoomOutToBouncer(); 34248275d2de99ff2556031929c48f295d3f93447b6Winson Chung } else { 34348275d2de99ff2556031929c48f295d3f93447b6Winson Chung mKeyguardWidgetPager.zoomInFromBouncer(); 3444eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller if (mKeyguardHostView != null) { 3454eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller mKeyguardHostView.setOnDismissAction(null); 3464eeb4f664ac6b5901a8e874dcf70c0382295f792Jim Miller } 34748275d2de99ff2556031929c48f295d3f93447b6Winson Chung } 34848275d2de99ff2556031929c48f295d3f93447b6Winson Chung } 349d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller} 350