KeyguardViewStateManager.java revision d6f8960b68c14e7946ff8f8286c484c28296ae39
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 */
16d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Millerpackage com.android.internal.policy.impl.keyguard;
17d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
186fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenimport android.os.Handler;
196fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohenimport android.os.Looper;
20d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Millerimport android.view.View;
21d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
22d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Millerpublic class KeyguardViewStateManager implements SlidingChallengeLayout.OnChallengeScrolledListener {
23d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
247f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen    private KeyguardWidgetPager mKeyguardWidgetPager;
2519a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller    private ChallengeLayout mChallengeLayout;
26d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen    private KeyguardHostView mKeyguardHostView;
27d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    private int[] mTmpPoint = new int[2];
288a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen    private int[] mTmpLoc = new int[2];
298a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen
308a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen    private KeyguardSecurityView mKeyguardSecurityContainer;
316fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    private static final int SCREEN_ON_HINT_DURATION = 1000;
3247c6cfaa3799951f999a4d2000cb628080708551Adam Cohen    private static final int SCREEN_ON_RING_HINT_DELAY = 300;
336fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    Handler mMainQueue = new Handler(Looper.myLooper());
34d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
35e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    // transport control states
36e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    static final int TRANSPORT_GONE = 0;
37e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    static final int TRANSPORT_INVISIBLE = 1;
38e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    static final int TRANSPORT_VISIBLE = 2;
39e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller
40e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    private int mTransportState = TRANSPORT_GONE;
41e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller
42e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    int mLastScrollState = SlidingChallengeLayout.SCROLL_STATE_IDLE;
43e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen
44e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    // Paged view state
45e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    private int mPageListeningToSlider = -1;
46e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    private int mCurrentPage = -1;
478caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen    private int mPageIndexOnPageBeginMoving = -1;
48e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen
49d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    int mChallengeTop = 0;
50d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
51d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen    public KeyguardViewStateManager(KeyguardHostView hostView) {
52d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen        mKeyguardHostView = hostView;
53d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    }
54d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
55d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    public void setPagedView(KeyguardWidgetPager pagedView) {
567f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        mKeyguardWidgetPager = pagedView;
577f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        updateEdgeSwiping();
58d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    }
59d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
6019a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller    public void setChallengeLayout(ChallengeLayout layout) {
6119a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller        mChallengeLayout = layout;
627f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        updateEdgeSwiping();
637f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen    }
647f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen
657f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen    private void updateEdgeSwiping() {
667f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        if (mChallengeLayout != null && mKeyguardWidgetPager != null) {
677f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            if (mChallengeLayout.isChallengeOverlapping()) {
687f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen                mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(true);
697f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            } else {
707f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen                mKeyguardWidgetPager.setOnlyAllowEdgeSwipes(false);
717f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            }
727f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        }
73d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    }
74d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
759dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung    public boolean isChallengeShowing() {
769dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung        if (mChallengeLayout != null) {
779dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung            return mChallengeLayout.isChallengeShowing();
789dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung        }
799dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung        return false;
809dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung    }
819dc9923085c4407268e8b6aa32c06fe30e3a7f7fWinson Chung
8270aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung    public boolean isChallengeOverlapping() {
8370aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung        if (mChallengeLayout != null) {
8470aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung            return mChallengeLayout.isChallengeOverlapping();
8570aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung        }
8670aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung        return false;
8770aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung    }
8870aa528b73fc54fe7896ac1ae349569d83caba59Winson Chung
896fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void setSecurityViewContainer(KeyguardSecurityView container) {
906fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        mKeyguardSecurityContainer = container;
916fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
926fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen
938caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen    public void showBouncer(boolean show) {
948caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        mChallengeLayout.showBouncer();
958caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen    }
968caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen
97c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    public boolean isBouncing() {
98c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren        return mChallengeLayout.isBouncing();
99c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren    }
100c0ae9e67ebe6f1298800feaed1b43e867139a904Chris Wren
1018caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen    public void fadeOutSecurity(int duration) {
1028caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        ((View) mKeyguardSecurityContainer).animate().alpha(0).setDuration(duration);
1038caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen    }
1048caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen
1058caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen    public void fadeInSecurity(int duration) {
1068caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        ((View) mKeyguardSecurityContainer).animate().alpha(1f).setDuration(duration);
1078caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen    }
1088caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen
109d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    public void onPageBeginMoving() {
1108caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        if (mChallengeLayout.isChallengeOverlapping() &&
111db1c5d596e91713132131601536aaad32e693325Adam Cohen                mChallengeLayout instanceof SlidingChallengeLayout) {
112db1c5d596e91713132131601536aaad32e693325Adam Cohen            SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout;
1138caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen            scl.fadeOutChallenge();
1148caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen            mPageIndexOnPageBeginMoving = mKeyguardWidgetPager.getCurrentPage();
115d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        }
1166fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        if (mHideHintsRunnable != null) {
1176fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen            mMainQueue.removeCallbacks(mHideHintsRunnable);
1186fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen            mHideHintsRunnable = null;
1196fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen        }
120d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    }
121d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
122d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    public void onPageEndMoving() {
1238caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        mPageIndexOnPageBeginMoving = -1;
12470009e426a39cc2940d264c4fb87a4402c60b0ffAdam Cohen    }
12570009e426a39cc2940d264c4fb87a4402c60b0ffAdam Cohen
126bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock    public void onPageSwitching(View newPage, int newPageIndex) {
1277f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        if (mKeyguardWidgetPager != null && mChallengeLayout instanceof SlidingChallengeLayout) {
128bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock            boolean isCameraPage = newPage instanceof CameraWidgetFrame;
129bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock            ((SlidingChallengeLayout) mChallengeLayout).setChallengeInteractive(!isCameraPage);
130bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock        }
1318caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen
1328caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        // If the page we're settling to is the same as we started on, and the action of
1338caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        // moving the page hid the security, we restore it immediately.
1348caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        if (mPageIndexOnPageBeginMoving == mKeyguardWidgetPager.getNextPage() &&
1358caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen                mChallengeLayout instanceof SlidingChallengeLayout) {
1368caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen            SlidingChallengeLayout scl = (SlidingChallengeLayout) mChallengeLayout;
1378caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen            scl.fadeInChallenge();
1388caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen            mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(-1);
1398caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        }
1408caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen        mPageIndexOnPageBeginMoving = -1;
141bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock    }
142bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock
143bb5c941149b66c0192736468bb60f47984dd5e1fJohn Spurlock    public void onPageSwitched(View newPage, int newPageIndex) {
144e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        // Reset the previous page size and ensure the current page is sized appropriately.
145e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        // We only modify the page state if it is not currently under control by the slider.
146e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        // This prevents conflicts.
1474ddcd573dd06a96c32285e34469cae6e7f03109bAdam Cohen
148d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen        if (mKeyguardHostView != null) {
149d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen            mKeyguardHostView.updateStickyWidget(newPageIndex);
150d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen        }
151d6f8960b68c14e7946ff8f8286c484c28296ae39Adam Cohen
1524ddcd573dd06a96c32285e34469cae6e7f03109bAdam Cohen        // If the page hasn't switched, don't bother with any of this
15325228801ba76e3419d598d9820007f4af761b3cdAdam Cohen        if (mCurrentPage == newPageIndex) return;
1544ddcd573dd06a96c32285e34469cae6e7f03109bAdam Cohen
1557f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        if (mKeyguardWidgetPager != null && mChallengeLayout != null) {
1567f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            KeyguardWidgetFrame prevPage = mKeyguardWidgetPager.getWidgetPageAt(mCurrentPage);
1578caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen            if (prevPage != null && mCurrentPage != mPageListeningToSlider && mCurrentPage
1588caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen                    != mKeyguardWidgetPager.getWidgetToResetOnPageFadeOut()) {
159e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen                prevPage.resetSize();
160d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller            }
161d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
1627f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            KeyguardWidgetFrame newCurPage = mKeyguardWidgetPager.getWidgetPageAt(newPageIndex);
163e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping();
164e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            if (challengeOverlapping && !newCurPage.isSmall()
165e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen                    && mPageListeningToSlider != newPageIndex) {
1668a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen                newCurPage.shrinkWidget();
167d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller            }
168d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        }
1698caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen
170e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        mCurrentPage = newPageIndex;
171d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    }
172d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
173e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    private int getChallengeTopRelativeToFrame(KeyguardWidgetFrame frame, int top) {
174d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        mTmpPoint[0] = 0;
175e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        mTmpPoint[1] = top;
17619a5267003e7dc70100a4bd4f1f449523b2ff38bJim Miller        mapPoint((View) mChallengeLayout, frame, mTmpPoint);
177e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        return mTmpPoint[1];
178e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    }
179e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen
180d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    /**
181d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller     * Simple method to map a point from one view's coordinates to another's. Note: this method
182d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller     * doesn't account for transforms, so if the views will be transformed, this should not be used.
183d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller     *
184d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller     * @param fromView The view to which the point is relative
185d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller     * @param toView The view into which the point should be mapped
186d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller     * @param pt The point
187d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller     */
1888a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen    private void mapPoint(View fromView, View toView, int pt[]) {
1898a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen        fromView.getLocationInWindow(mTmpLoc);
1908a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen
1918a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen        int x = mTmpLoc[0];
1928a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen        int y = mTmpLoc[1];
193d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
1948a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen        toView.getLocationInWindow(mTmpLoc);
1958a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen        int vX = mTmpLoc[0];
1968a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen        int vY = mTmpLoc[1];
197d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
198d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        pt[0] += x - vX;
199d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        pt[1] += y - vY;
200d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    }
201d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
202d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    @Override
203d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    public void onScrollStateChanged(int scrollState) {
2047f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        if (mKeyguardWidgetPager == null || mChallengeLayout == null) return;
205e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        boolean challengeOverlapping = mChallengeLayout.isChallengeOverlapping();
206e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen
207d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        if (scrollState == SlidingChallengeLayout.SCROLL_STATE_IDLE) {
2087f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider);
209e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            if (frame == null) return;
210d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
211e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            if (!challengeOverlapping) {
2127f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen                if (!mKeyguardWidgetPager.isPageMoving()) {
213db1c5d596e91713132131601536aaad32e693325Adam Cohen                    frame.resetSize();
214db1c5d596e91713132131601536aaad32e693325Adam Cohen                } else {
2158caabadd02c7bef701c44dc1718a9a493cbd1261Adam Cohen                    mKeyguardWidgetPager.setWidgetToResetOnPageFadeOut(mPageListeningToSlider);
216db1c5d596e91713132131601536aaad32e693325Adam Cohen                }
217d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller            }
218e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            frame.hideFrame(this);
2197f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            updateEdgeSwiping();
220d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
221bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller            if (mChallengeLayout.isChallengeShowing()) {
222bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller                mKeyguardSecurityContainer.onResume();
223bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller            } else {
224bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller                mKeyguardSecurityContainer.onPause();
225bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller            }
226e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            mPageListeningToSlider = -1;
227e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        } else if (mLastScrollState == SlidingChallengeLayout.SCROLL_STATE_IDLE) {
228e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            // Whether dragging or settling, if the last state was idle, we use this signal
229e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            // to update the current page who will receive events from the sliding challenge.
230e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            // We resize the frame as appropriate.
2317f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            mPageListeningToSlider = mKeyguardWidgetPager.getNextPage();
2327f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider);
233e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            if (frame == null) return;
234e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen
235e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            frame.showFrame(this);
236e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen
237e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            // As soon as the security begins sliding, the widget becomes small (if it wasn't
238e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            // small to begin with).
239e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            if (!frame.isSmall()) {
240e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen                // We need to fetch the final page, in case the pages are in motion.
2417f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen                mPageListeningToSlider = mKeyguardWidgetPager.getNextPage();
2428a7785c7aa2df74203276299e10b0d9056cd0560Adam Cohen                frame.shrinkWidget();
243e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            }
244bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller            // View is on the move.  Pause the security view until it completes.
245bbba68a14ab578ab00400d4cf2ed5d1dcf60dbdfJim Miller            mKeyguardSecurityContainer.onPause();
246d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller        }
247e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        mLastScrollState = scrollState;
248e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    }
249e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen
250e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    @Override
251e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen    public void onScrollPositionChanged(float scrollPosition, int challengeTop) {
252e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        mChallengeTop = challengeTop;
2537f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        KeyguardWidgetFrame frame = mKeyguardWidgetPager.getWidgetPageAt(mPageListeningToSlider);
2547f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        if (frame != null && !mKeyguardWidgetPager.isPageMoving()) {
255e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen            frame.adjustFrame(getChallengeTopRelativeToFrame(frame, mChallengeTop));
256e3643138c89d49a01ba6a622ffaf71c9a95d5cdcAdam Cohen        }
257d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller    }
258d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller
259196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen    private Runnable mHideHintsRunnable = new Runnable() {
260196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen        @Override
261196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen        public void run() {
2627f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen            if (mKeyguardWidgetPager != null) {
2637f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen                mKeyguardWidgetPager.hideOutlinesAndSidePages();
264196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen            }
265196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen        }
266196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen    };
267196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen
2686fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    public void showUsabilityHints() {
26947c6cfaa3799951f999a4d2000cb628080708551Adam Cohen        mMainQueue.postDelayed( new Runnable() {
27047c6cfaa3799951f999a4d2000cb628080708551Adam Cohen            @Override
27147c6cfaa3799951f999a4d2000cb628080708551Adam Cohen            public void run() {
27247c6cfaa3799951f999a4d2000cb628080708551Adam Cohen                mKeyguardSecurityContainer.showUsabilityHint();
27347c6cfaa3799951f999a4d2000cb628080708551Adam Cohen            }
27447c6cfaa3799951f999a4d2000cb628080708551Adam Cohen        } , SCREEN_ON_RING_HINT_DELAY);
2757f6bb6e460ad7f76742348144b8b1d0dfb3074b3Adam Cohen        mKeyguardWidgetPager.showInitialPageHints();
276196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen        if (mHideHintsRunnable != null) {
277196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen            mMainQueue.postDelayed(mHideHintsRunnable, SCREEN_ON_HINT_DURATION);
278196cde973fd1635f0ac3150caab40287aacb9846Adam Cohen        }
2796fb841fa219eaae3e87f2fdc05e105d7a1813c42Adam Cohen    }
280e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller
281e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    public void setTransportState(int state) {
282e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller        mTransportState = state;
283e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    }
284e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller
285e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    public int getTransportState() {
286e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller        return mTransportState;
287e0566da2dab8c3b9ddca43131f21ef58b79049c8Jim Miller    }
288d6523da1ad7bae805a3dbea8d7b398d86cd3c181Jim Miller}
289