12fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi/*
22fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * Copyright (C) 2015 The Android Open Source Project
32fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi *
42fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
52fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * you may not use this file except in compliance with the License.
62fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * You may obtain a copy of the License at
72fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi *
82fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
92fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi *
102fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
112fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
122fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * See the License for the specific language governing permissions and
142fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi * limitations under the License
152fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi */
162fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
172fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggipackage com.android.systemui.assist;
182fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
192fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.annotation.Nullable;
202fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.content.Context;
212fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.util.AttributeSet;
222fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.view.View;
232fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport android.widget.FrameLayout;
242fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
25c0d7058b14c24cd07912f5629c26b39b7b4673d5Winsonimport com.android.systemui.Interpolators;
262fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggiimport com.android.systemui.R;
272fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
282fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggipublic class AssistOrbContainer extends FrameLayout {
292fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
302fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private static final long EXIT_START_DELAY = 150;
312fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
322fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private View mScrim;
332fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private View mNavbarScrim;
342fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private AssistOrbView mOrb;
352fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
362fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private boolean mAnimatingOut;
372fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
382fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    public AssistOrbContainer(Context context) {
392fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        this(context, null);
402fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
412fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
422fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    public AssistOrbContainer(Context context, @Nullable AttributeSet attrs) {
432fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        this(context, attrs, 0);
442fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
452fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
462fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    public AssistOrbContainer(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
472fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        super(context, attrs, defStyleAttr);
482fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
492fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
502fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    @Override
512fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    protected void onFinishInflate() {
522fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        super.onFinishInflate();
532fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mScrim = findViewById(R.id.assist_orb_scrim);
542fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mNavbarScrim = findViewById(R.id.assist_orb_navbar_scrim);
552fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mOrb = (AssistOrbView) findViewById(R.id.assist_orb);
562fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
572fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
582fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    public void show(final boolean show, boolean animate) {
592fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        if (show) {
602fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            if (getVisibility() != View.VISIBLE) {
612fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                setVisibility(View.VISIBLE);
622fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                if (animate) {
632fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                    startEnterAnimation();
642fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                } else {
652fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                    reset();
662fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                }
672fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            }
682fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        } else {
692fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            if (animate) {
702fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                startExitAnimation(new Runnable() {
712fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                    @Override
722fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                    public void run() {
732fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        mAnimatingOut = false;
742fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        setVisibility(View.GONE);
752fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                    }
762fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                });
772fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            } else {
782fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                setVisibility(View.GONE);
792fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            }
802fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        }
812fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
822fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
832fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private void reset() {
842fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mAnimatingOut = false;
852fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mOrb.reset();
862fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mScrim.setAlpha(1f);
872fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mNavbarScrim.setAlpha(1f);
882fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
892fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
902fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private void startEnterAnimation() {
912fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        if (mAnimatingOut) {
922fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            return;
932fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        }
942fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mOrb.startEnterAnimation();
952fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mScrim.setAlpha(0f);
962fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mNavbarScrim.setAlpha(0f);
972fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        post(new Runnable() {
982fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            @Override
992fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            public void run() {
1002fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                mScrim.animate()
1012fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        .alpha(1f)
1022fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        .setDuration(300)
1032fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        .setStartDelay(0)
104c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                        .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
1052fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                mNavbarScrim.animate()
1062fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        .alpha(1f)
1072fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        .setDuration(300)
1082fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                        .setStartDelay(0)
109c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                        .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
1102fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            }
1112fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        });
1122fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
1132fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
1142fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    private void startExitAnimation(final Runnable endRunnable) {
1152fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        if (mAnimatingOut) {
1162fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            if (endRunnable != null) {
1172fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                endRunnable.run();
1182fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            }
1192fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi            return;
1202fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        }
1212fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mAnimatingOut = true;
1222fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mOrb.startExitAnimation(EXIT_START_DELAY);
1232fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mScrim.animate()
1242fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                .alpha(0f)
1252fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                .setDuration(250)
1262fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                .setStartDelay(EXIT_START_DELAY)
127c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
1282fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        mNavbarScrim.animate()
1292fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                .alpha(0f)
1302fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                .setDuration(250)
1312fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                .setStartDelay(EXIT_START_DELAY)
132c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
1332fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi                .withEndAction(endRunnable);
1342fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
1352fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
1362fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    /**
1372fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi     * Whether the panel is showing, or, if it's animating, whether it will be
1382fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi     * when the animation is done.
1392fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi     */
1402fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    public boolean isShowing() {
1412fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        return getVisibility() == View.VISIBLE && !mAnimatingOut;
1422fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
1432fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi
1442fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    public AssistOrbView getOrb() {
1452fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi        return mOrb;
1462fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi    }
1472fdeeabe78b0f54f3163b1b3741ac813828b3511Jorim Jaggi}
148