16e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi/*
26e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * Copyright (C) 2015 The Android Open Source Project
36e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi *
46e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
56e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * you may not use this file except in compliance with the License.
66e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * You may obtain a copy of the License at
76e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi *
86e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
96e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi *
106e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
116e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
126e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * See the License for the specific language governing permissions and
146e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * limitations under the License
156e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi */
166e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
176e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggipackage com.android.test.assist;
186e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
196e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.animation.Animator;
206e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.animation.ValueAnimator;
216e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.app.VoiceInteractor;
226e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.content.Context;
236e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.graphics.Color;
246e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.os.Bundle;
256e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.os.Handler;
266e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.service.voice.VoiceInteractionSession;
2719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggiimport android.util.Log;
286e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.view.View;
296e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.view.ViewAnimationUtils;
306e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.view.ViewTreeObserver;
316e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.view.animation.AnimationUtils;
326e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggiimport android.view.animation.Interpolator;
336e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
346e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi/**
356e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi * Sample session to show test assist transition.
366e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi */
376e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggipublic class AssistInteractionSession extends VoiceInteractionSession {
386e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
396e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    private View mScrim;
406e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    private View mBackground;
416e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    private View mNavbarScrim;
426e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    private View mCard1;
436e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    private View mCard2;
446e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
456e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    private float mDensity;
466e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
476e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    public AssistInteractionSession(Context context) {
486e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        super(context);
496e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
506e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
516e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    public AssistInteractionSession(Context context, Handler handler) {
526e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        super(context, handler);
536e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
546e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
556e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    @Override
56593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    public void onRequestConfirmation(ConfirmationRequest request) {
576e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
586e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
596e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    @Override
60593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    public void onRequestPickOption(PickOptionRequest request) {
616e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
626e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
636e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    @Override
64593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    public void onRequestCommand(CommandRequest request) {
656e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
666e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
676e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    @Override
68593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    public void onCancelRequest(Request request) {
69593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    }
706e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
71593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    @Override
72593334ab70a8341c7d24d71a377ab5617e3f4ab7Dianne Hackborn    public void onCreate() {
7319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        super.onCreate();
746e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        // Simulate slowness of Assist app
756e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        try {
766e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi            Thread.sleep(1000);
776e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        } catch (InterruptedException e) {
786e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi            e.printStackTrace();
796e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        }
8090859bc4ce633e2716a4708234278321d74df461Jorim Jaggi
8190859bc4ce633e2716a4708234278321d74df461Jorim Jaggi        getWindow().getWindow().getDecorView().setSystemUiVisibility(
8290859bc4ce633e2716a4708234278321d74df461Jorim Jaggi                View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
836e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
846e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
856e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    @Override
866e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    public View onCreateContentView() {
876e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        View v = getLayoutInflater().inflate(R.layout.assist, null);
886e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mScrim = v.findViewById(R.id.scrim);
896e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mBackground = v.findViewById(R.id.background);
906e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mDensity = mScrim.getResources().getDisplayMetrics().density;
916e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mCard1 = v.findViewById(R.id.card1);
926e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mCard2 = v.findViewById(R.id.card2);
936e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mNavbarScrim = v.findViewById(R.id.navbar_scrim);
946e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        return v;
956e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
966e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
976e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    @Override
986e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    public void onShow(Bundle args, int showFlags) {
996e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        super.onShow(args, showFlags);
1002ee5c368f844bc0f6ce55ff6d5cf3d5604cad5d8Dianne Hackborn        if ((showFlags & SHOW_SOURCE_ASSIST_GESTURE) != 0) {
1016e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi            mBackground.getViewTreeObserver().addOnPreDrawListener(
1026e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                    new ViewTreeObserver.OnPreDrawListener() {
1036e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                        @Override
1046e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                        public boolean onPreDraw() {
1056e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                            mBackground.getViewTreeObserver().removeOnPreDrawListener(this);
1066e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                            playAssistAnimation();
1076e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                            return true;
1086e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                        }
1096e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                    });
1106e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        }
1116e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
1126e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
11319695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    @Override
11419695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    public void onLockscreenShown() {
11519695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        super.onLockscreenShown();
11619695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi        Log.i("Assistant", "Lockscreen was shown");
11719695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi    }
11819695d97118d74aa7f54ba09b178e65378825cc0Jorim Jaggi
1196e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    private void playAssistAnimation() {
1206e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        Interpolator linearOutSlowIn = AnimationUtils.loadInterpolator(mBackground.getContext(),
1216e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                android.R.interpolator.linear_out_slow_in);
1226e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        Interpolator fastOutSlowIn = AnimationUtils.loadInterpolator(mBackground.getContext(),
1236e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                android.R.interpolator.fast_out_slow_in);
1246e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mScrim.setAlpha(0f);
1256e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mScrim.animate()
1266e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .alpha(1f)
1276e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setStartDelay(100)
1286e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setDuration(500);
1296e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mBackground.setTranslationY(50 * mDensity);
1306e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mBackground.animate()
1316e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .translationY(0)
1326e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setDuration(300)
1336e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setInterpolator(linearOutSlowIn);
1346e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        int centerX = mBackground.getWidth()/2;
1356e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        int centerY = (int) (mBackground.getHeight()/5*3.8f);
1366e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        int radius = (int) Math.sqrt(centerX*centerX + centerY*centerY) + 1;
1376e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        Animator animator = ViewAnimationUtils.createCircularReveal(mBackground, centerX, centerY,
1386e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                0, radius);
1396e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        animator.setDuration(300);
1406e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        animator.setInterpolator(fastOutSlowIn);
1416e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        animator.start();
1426e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
1436e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        ValueAnimator colorAnim = ValueAnimator.ofArgb(Color.WHITE, 0xffe0e0e0);
1446e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        colorAnim.setDuration(300);
1456e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        colorAnim.setInterpolator(fastOutSlowIn);
1466e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        colorAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
1476e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi            @Override
1486e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi            public void onAnimationUpdate(ValueAnimator animation) {
1496e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                mBackground.setBackgroundColor((Integer) animation.getAnimatedValue());
1506e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi            }
1516e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        });
1526e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        colorAnim.start();
1536e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
1546e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
1556e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mCard1.setY(mBackground.getHeight());
1566e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mCard2.setTranslationY(mCard1.getTranslationY());
1576e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mCard1.animate()
1586e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .translationY(0)
1596e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setDuration(500)
1606e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setInterpolator(linearOutSlowIn)
1616e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setStartDelay(100);
1626e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mCard2.animate()
1636e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .translationY(0)
1646e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setInterpolator(linearOutSlowIn)
1656e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setStartDelay(150)
1666e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setDuration(500);
1676e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
1686e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mNavbarScrim.setAlpha(0f);
1696e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        mNavbarScrim.animate()
1706e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .alpha(1f)
1716e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setDuration(500)
1726e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi                .setStartDelay(100);
1736e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
1746e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi
1756e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    @Override
1766e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    public void onHide() {
1776e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi        super.onHide();
1786e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi    }
1796e9fa1a4b74dc4e35470739cfd64881cb9bcc7b1Jorim Jaggi}
180