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