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