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