SearchDropTargetBar.java revision 315b3ba6f1174f71b321301afa61cd826f7a1e97
14c98d9235d164680186180974719f551cf935d08Winson Chung/*
24c98d9235d164680186180974719f551cf935d08Winson Chung * Copyright (C) 2011 The Android Open Source Project
34c98d9235d164680186180974719f551cf935d08Winson Chung *
44c98d9235d164680186180974719f551cf935d08Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
54c98d9235d164680186180974719f551cf935d08Winson Chung * you may not use this file except in compliance with the License.
64c98d9235d164680186180974719f551cf935d08Winson Chung * You may obtain a copy of the License at
74c98d9235d164680186180974719f551cf935d08Winson Chung *
84c98d9235d164680186180974719f551cf935d08Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
94c98d9235d164680186180974719f551cf935d08Winson Chung *
104c98d9235d164680186180974719f551cf935d08Winson Chung * Unless required by applicable law or agreed to in writing, software
114c98d9235d164680186180974719f551cf935d08Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
124c98d9235d164680186180974719f551cf935d08Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134c98d9235d164680186180974719f551cf935d08Winson Chung * See the License for the specific language governing permissions and
144c98d9235d164680186180974719f551cf935d08Winson Chung * limitations under the License.
154c98d9235d164680186180974719f551cf935d08Winson Chung */
164c98d9235d164680186180974719f551cf935d08Winson Chung
174c98d9235d164680186180974719f551cf935d08Winson Chungpackage com.android.launcher2;
184c98d9235d164680186180974719f551cf935d08Winson Chung
19201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.Animator;
20201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.AnimatorListenerAdapter;
21a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.animation.AnimatorSet;
22201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chungimport android.animation.ObjectAnimator;
234c98d9235d164680186180974719f551cf935d08Winson Chungimport android.content.Context;
24cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwoodimport android.graphics.Rect;
25c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chungimport android.graphics.drawable.Drawable;
264c98d9235d164680186180974719f551cf935d08Winson Chungimport android.util.AttributeSet;
274c98d9235d164680186180974719f551cf935d08Winson Chungimport android.view.View;
28a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.AccelerateInterpolator;
29a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chungimport android.view.animation.DecelerateInterpolator;
304c98d9235d164680186180974719f551cf935d08Winson Chungimport android.widget.FrameLayout;
314c98d9235d164680186180974719f551cf935d08Winson Chung
324c98d9235d164680186180974719f551cf935d08Winson Chungimport com.android.launcher.R;
334c98d9235d164680186180974719f551cf935d08Winson Chung
344c98d9235d164680186180974719f551cf935d08Winson Chung/*
354c98d9235d164680186180974719f551cf935d08Winson Chung * Ths bar will manage the transition between the QSB search bar and the delete drop
364c98d9235d164680186180974719f551cf935d08Winson Chung * targets so that each of the individual IconDropTargets don't have to.
374c98d9235d164680186180974719f551cf935d08Winson Chung */
384c98d9235d164680186180974719f551cf935d08Winson Chungpublic class SearchDropTargetBar extends FrameLayout implements DragController.DragListener {
394c98d9235d164680186180974719f551cf935d08Winson Chung
40a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private static final int sTransitionInDuration = 200;
41a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private static final int sTransitionOutDuration = 175;
424c98d9235d164680186180974719f551cf935d08Winson Chung
43315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung    private ObjectAnimator mDropTargetBarFadeInAnim;
44315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung    private ObjectAnimator mDropTargetBarFadeOutAnim;
45201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    private ObjectAnimator mQSBSearchBarFadeInAnim;
46201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    private ObjectAnimator mQSBSearchBarFadeOutAnim;
47201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
48f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    private boolean mIsSearchBarHidden;
494c98d9235d164680186180974719f551cf935d08Winson Chung    private View mQSBSearchBar;
504c98d9235d164680186180974719f551cf935d08Winson Chung    private View mDropTargetBar;
5161fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung    private ButtonDropTarget mInfoDropTarget;
5261fa4197c4316bb0f9b05fcefb676f86197a2273Winson Chung    private ButtonDropTarget mDeleteDropTarget;
53a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung    private int mBarHeight;
54d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    private boolean mDeferOnDragEnd = false;
554c98d9235d164680186180974719f551cf935d08Winson Chung
56c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    private Drawable mPreviousBackground;
57c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
584c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs) {
594c98d9235d164680186180974719f551cf935d08Winson Chung        this(context, attrs, 0);
604c98d9235d164680186180974719f551cf935d08Winson Chung    }
614c98d9235d164680186180974719f551cf935d08Winson Chung
624c98d9235d164680186180974719f551cf935d08Winson Chung    public SearchDropTargetBar(Context context, AttributeSet attrs, int defStyle) {
634c98d9235d164680186180974719f551cf935d08Winson Chung        super(context, attrs, defStyle);
644c98d9235d164680186180974719f551cf935d08Winson Chung    }
654c98d9235d164680186180974719f551cf935d08Winson Chung
664c98d9235d164680186180974719f551cf935d08Winson Chung    public void setup(Launcher launcher, DragController dragController) {
674c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(this);
684c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mInfoDropTarget);
694c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDragListener(mDeleteDropTarget);
704c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mInfoDropTarget);
714c98d9235d164680186180974719f551cf935d08Winson Chung        dragController.addDropTarget(mDeleteDropTarget);
72043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        dragController.setFlingToDeleteDropTarget(mDeleteDropTarget);
734c98d9235d164680186180974719f551cf935d08Winson Chung        mInfoDropTarget.setLauncher(launcher);
744c98d9235d164680186180974719f551cf935d08Winson Chung        mDeleteDropTarget.setLauncher(launcher);
754c98d9235d164680186180974719f551cf935d08Winson Chung    }
764c98d9235d164680186180974719f551cf935d08Winson Chung
77315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung    private void prepareAnimation(ObjectAnimator in, ObjectAnimator out, final View v) {
78315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        in.setInterpolator(new AccelerateInterpolator());
79315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        in.setDuration(sTransitionInDuration);
80315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        in.addListener(new AnimatorListenerAdapter() {
81315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            @Override
82315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            public void onAnimationStart(Animator animation) {
83315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                v.setVisibility(View.VISIBLE);
84315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            }
85315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        });
86315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        out.setInterpolator(new DecelerateInterpolator());
87315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        out.setDuration(sTransitionOutDuration);
88315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        out.addListener(new AnimatorListenerAdapter() {
89315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            @Override
90315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            public void onAnimationEnd(Animator animation) {
91315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                v.setVisibility(View.INVISIBLE);
92315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                v.setLayerType(View.LAYER_TYPE_NONE, null);
93315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            }
94315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        });
95315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung    }
96315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung
974c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
984c98d9235d164680186180974719f551cf935d08Winson Chung    protected void onFinishInflate() {
994c98d9235d164680186180974719f551cf935d08Winson Chung        super.onFinishInflate();
1004c98d9235d164680186180974719f551cf935d08Winson Chung
1014c98d9235d164680186180974719f551cf935d08Winson Chung        // Get the individual components
1024c98d9235d164680186180974719f551cf935d08Winson Chung        mQSBSearchBar = findViewById(R.id.qsb_search_bar);
1034c98d9235d164680186180974719f551cf935d08Winson Chung        mDropTargetBar = findViewById(R.id.drag_target_bar);
104a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mInfoDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.info_target_text);
105a6427b15c18d5b8f3078f553d78f8432de9f46e9Winson Chung        mDeleteDropTarget = (ButtonDropTarget) mDropTargetBar.findViewById(R.id.delete_target_text);
106a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        mBarHeight = getResources().getDimensionPixelSize(R.dimen.qsb_bar_height);
107a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung
108d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mInfoDropTarget.setSearchDropTargetBar(this);
109d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeleteDropTarget.setSearchDropTargetBar(this);
110d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
111a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        boolean enableDropDownDropTargets =
112a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            getResources().getBoolean(R.bool.config_useDropTargetDownTransition);
113201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
114201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        // Create the various fade animations
115a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        if (enableDropDownDropTargets) {
116a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            mDropTargetBar.setTranslationY(-mBarHeight);
117315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBarFadeInAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY", 0f);
118315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBarFadeOutAnim = ObjectAnimator.ofFloat(mDropTargetBar, "translationY",
119315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                    -mBarHeight);
120315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY", 0);
121315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "translationY",
122315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung                    -mBarHeight);
123315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        } else {
124315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBar.setAlpha(0f);
125315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBarFadeInAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 1f);
126315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mDropTargetBarFadeOutAnim = ObjectAnimator.ofFloat(mDropTargetBar, "alpha", 0f);
127315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mQSBSearchBarFadeInAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 1f);
128315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung            mQSBSearchBarFadeOutAnim = ObjectAnimator.ofFloat(mQSBSearchBar, "alpha", 0f);
129a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        }
130315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        prepareAnimation(mDropTargetBarFadeInAnim, mDropTargetBarFadeOutAnim, mDropTargetBar);
131315b3ba6f1174f71b321301afa61cd826f7a1e97Winson Chung        prepareAnimation(mQSBSearchBarFadeInAnim, mQSBSearchBarFadeOutAnim, mQSBSearchBar);
132201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    }
133201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung
134043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    public void finishAnimations() {
135043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        mDropTargetBarFadeInAnim.end();
136043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        mDropTargetBarFadeOutAnim.end();
137043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        mQSBSearchBarFadeInAnim.end();
138043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung        mQSBSearchBarFadeOutAnim.end();
139043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung    }
140043f2af567178b82b0b41f12d379e7dd12da2936Winson Chung
141201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung    private void cancelAnimations() {
142201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        mDropTargetBarFadeInAnim.cancel();
143201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        mDropTargetBarFadeOutAnim.cancel();
144201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        mQSBSearchBarFadeInAnim.cancel();
145201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        mQSBSearchBarFadeOutAnim.cancel();
1464c98d9235d164680186180974719f551cf935d08Winson Chung    }
1474c98d9235d164680186180974719f551cf935d08Winson Chung
1484c98d9235d164680186180974719f551cf935d08Winson Chung    /*
149f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Shows and hides the search bar.
150f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
151f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void showSearchBar(boolean animated) {
152201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        cancelAnimations();
153f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
154201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung            mQSBSearchBarFadeInAnim.start();
155f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
156201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung            mQSBSearchBar.setVisibility(View.VISIBLE);
157f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            mQSBSearchBar.setAlpha(1f);
158f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
159f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = false;
160f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
161f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public void hideSearchBar(boolean animated) {
162201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        cancelAnimations();
163f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (animated) {
164201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung            mQSBSearchBarFadeOutAnim.start();
165f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        } else {
16681efbad05e0ce69b06d7323749ef2e200b84b98eMichael Jurka            mQSBSearchBar.setVisibility(View.INVISIBLE);
167f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung            mQSBSearchBar.setAlpha(0f);
168f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
169f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        mIsSearchBarHidden = true;
170f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
171f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
172f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
173f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     * Gets various transition durations.
174f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung     */
175f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionInDuration() {
176f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionInDuration;
177f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
178f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    public int getTransitionOutDuration() {
179f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        return sTransitionOutDuration;
180f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    }
181f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung
182f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung    /*
1834c98d9235d164680186180974719f551cf935d08Winson Chung     * DragController.DragListener implementation
1844c98d9235d164680186180974719f551cf935d08Winson Chung     */
1854c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
1864c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragStart(DragSource source, Object info, int dragAction) {
1874c98d9235d164680186180974719f551cf935d08Winson Chung        // Animate out the QSB search bar, and animate in the drop target bar
188a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        mDropTargetBar.setLayerType(View.LAYER_TYPE_HARDWARE, null);
189a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        mDropTargetBar.buildLayer();
190a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung        mDropTargetBarFadeOutAnim.cancel();
191201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung        mDropTargetBarFadeInAnim.start();
192f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        if (!mIsSearchBarHidden) {
193a62e9fd95ae10cff4676f2cc1f4d68334ca27a0bWinson Chung            mQSBSearchBarFadeInAnim.cancel();
194201bc828d5a0078f505e8e37152156a0cb43c10aWinson Chung            mQSBSearchBarFadeOutAnim.start();
195f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
1964c98d9235d164680186180974719f551cf935d08Winson Chung    }
1974c98d9235d164680186180974719f551cf935d08Winson Chung
198d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    public void deferOnDragEnd() {
199d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        mDeferOnDragEnd = true;
200d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen    }
201d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen
2024c98d9235d164680186180974719f551cf935d08Winson Chung    @Override
2034c98d9235d164680186180974719f551cf935d08Winson Chung    public void onDragEnd() {
204d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        if (!mDeferOnDragEnd) {
205d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            // Restore the QSB search bar, and animate out the drop target bar
206d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDropTargetBarFadeInAnim.cancel();
207d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDropTargetBarFadeOutAnim.start();
208d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            if (!mIsSearchBarHidden) {
209d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen                mQSBSearchBarFadeOutAnim.cancel();
210d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen                mQSBSearchBarFadeInAnim.start();
211d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            }
212d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen        } else {
213d4d7aa551ffdc80d810ff970fa72a6509960401eAdam Cohen            mDeferOnDragEnd = false;
214f0ea4d3378be7b962c8e0bce2392df5e82491fb8Winson Chung        }
2154c98d9235d164680186180974719f551cf935d08Winson Chung    }
216c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung
217c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    public void onSearchPackagesChanged(boolean searchVisible, boolean voiceVisible) {
218c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        if (mQSBSearchBar != null) {
219c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            Drawable bg = mQSBSearchBar.getBackground();
220c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            if (bg != null && (!searchVisible && !voiceVisible)) {
221c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Save the background and disable it
222c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mPreviousBackground = bg;
223c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                mQSBSearchBar.setBackgroundResource(0);
224c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            } else if (mPreviousBackground != null && (searchVisible || voiceVisible)) {
225c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung                // Restore the background
2263a9fcedbcd235372cd2ab64f825a0b5b3937f59eMichael Jurka                mQSBSearchBar.setBackground(mPreviousBackground);
227c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung            }
228c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung        }
229c51db6accf2fdcb15d6361a38b176534e3d2cca5Winson Chung    }
230cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
231cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    public Rect getSearchBarBounds() {
232cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        if (mQSBSearchBar != null) {
233cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final float appScale = mQSBSearchBar.getContext().getResources()
234cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood                    .getCompatibilityInfo().applicationScale;
235cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final int[] pos = new int[2];
236cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            mQSBSearchBar.getLocationOnScreen(pos);
237cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood
238cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            final Rect rect = new Rect();
239cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            rect.left = (int) (pos[0] * appScale + 0.5f);
240cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            rect.top = (int) (pos[1] * appScale + 0.5f);
241cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            rect.right = (int) ((pos[0] + mQSBSearchBar.getWidth()) * appScale + 0.5f);
242cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            rect.bottom = (int) ((pos[1] + mQSBSearchBar.getHeight()) * appScale + 0.5f);
243cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return rect;
244cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        } else {
245cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood            return null;
246cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood        }
247cf7f63bb4dcc152ba7977fc7499081d651a4313aMathew Inwood    }
2484c98d9235d164680186180974719f551cf935d08Winson Chung}
249