From 37adc9854ae78a0dd358b8e129417c142b83cf1c Mon Sep 17 00:00:00 2001 From: Ta-wei Yen Date: Thu, 12 Nov 2015 14:23:00 -0800 Subject: Use separate AnswerFragment for Talkback + Split AnswerFragment into GlowpadAnswerFragment and AccessibleAnswerFragment, with the refactored AnswerFragment as base class. + InCallActivity will select GlowpadAnswerFragment and AccessibleAnswerFragment base on if any touch exploration accessibility service is active. + Removed AnswerListener from GlowPadWrapper, as it is only implemented in one class and made the code more complex. + Changed answer icon's color into green. Bug:24101341 Change-Id: Ida2b07986d64d6442ff87a2258180846a092942e --- .../ic_lockscreen_answer_activated_layer.xml | 2 +- InCallUI/res/layout/accessible_answer_fragment.xml | 104 +++++++++++ InCallUI/res/values/colors.xml | 5 +- .../android/incallui/AccessibleAnswerFragment.java | 157 +++++++++++++++++ .../src/com/android/incallui/AnswerFragment.java | 194 ++++++--------------- .../android/incallui/GlowPadAnswerFragment.java | 155 ++++++++++++++++ .../src/com/android/incallui/GlowPadWrapper.java | 23 +-- .../src/com/android/incallui/InCallActivity.java | 45 ++++- .../android/incallui/util/AccessibilityUtil.java | 30 ++++ 9 files changed, 544 insertions(+), 171 deletions(-) create mode 100644 InCallUI/res/layout/accessible_answer_fragment.xml create mode 100644 InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java create mode 100644 InCallUI/src/com/android/incallui/GlowPadAnswerFragment.java create mode 100644 InCallUI/src/com/android/incallui/util/AccessibilityUtil.java (limited to 'InCallUI') diff --git a/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml b/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml index c615295ed..f22b87e34 100644 --- a/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml +++ b/InCallUI/res/drawable/ic_lockscreen_answer_activated_layer.xml @@ -14,7 +14,7 @@ limitations under the License. --> - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/InCallUI/res/values/colors.xml b/InCallUI/res/values/colors.xml index 3697e11ba..60a017c21 100644 --- a/InCallUI/res/values/colors.xml +++ b/InCallUI/res/values/colors.xml @@ -73,11 +73,14 @@ #ffffff #ffffff #cccccc - @color/dialtacts_theme_color + #00c853 #ff1744 #a3a3a3 #ffffff + + #B2FFFFFF + #330288d1 diff --git a/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java b/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java new file mode 100644 index 000000000..89c78ec61 --- /dev/null +++ b/InCallUI/src/com/android/incallui/AccessibleAnswerFragment.java @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License + */ + +package com.android.incallui; + +import android.os.Bundle; +import android.telecom.VideoProfile; +import android.view.GestureDetector; +import android.view.GestureDetector.SimpleOnGestureListener; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; + +import com.android.dialer.R; + +/** + * AnswerFragment to use when touch exploration is enabled in accessibility. + */ +public class AccessibleAnswerFragment extends AnswerFragment { + + private static final String TAG = AccessibleAnswerFragment.class.getSimpleName(); + private static final int SWIPE_THRESHOLD = 100; + + private View mAnswer; + private View mDecline; + private View mText; + + private TouchListener mTouchListener; + private GestureDetector mGestureDetector; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + ViewGroup group = (ViewGroup) inflater.inflate(R.layout.accessible_answer_fragment, + container, false); + + mTouchListener = new TouchListener(); + mGestureDetector = new GestureDetector(getContext(), new SimpleOnGestureListener() { + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, + float velocityY) { + return AccessibleAnswerFragment.this.onFling(e1, e2, velocityX, velocityX); + } + }); + + mAnswer = group.findViewById(R.id.accessible_answer_fragment_answer); + mAnswer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(TAG, "Answer Button Clicked"); + onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext()); + } + }); + mDecline = group.findViewById(R.id.accessible_answer_fragment_decline); + mDecline.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(TAG, "Decline Button Clicked"); + onDecline(getContext()); + } + }); + + mText = group.findViewById(R.id.accessible_answer_fragment_text); + mText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Log.d(TAG, "Text Button Clicked"); + onText(); + } + }); + return group; + } + + @Override + public void onResume() { + super.onResume(); + // Intercept all touch events for full screen swiping gesture. + InCallActivity activity = (InCallActivity) getActivity(); + activity.setDispatchTouchEventListener(mTouchListener); + } + + @Override + public void onPause() { + super.onPause(); + InCallActivity activity = (InCallActivity) getActivity(); + activity.setDispatchTouchEventListener(null); + } + + private class TouchListener implements View.OnTouchListener { + @Override + public boolean onTouch(View v, MotionEvent event) { + return mGestureDetector.onTouchEvent(event); + } + } + + private boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, + float velocityY) { + if (hasPendingDialogs()) { + return false; + } + + float diffY = e2.getY() - e1.getY(); + float diffX = e2.getX() - e1.getX(); + if (Math.abs(diffX) > Math.abs(diffY)) { + if (Math.abs(diffX) > SWIPE_THRESHOLD) { + if (diffX > 0) { + onSwipeRight(); + } else { + onSwipeLeft(); + } + } + return true; + } else if (Math.abs(diffY) > SWIPE_THRESHOLD) { + if (diffY > 0) { + onSwipeDown(); + } else { + onSwipeUp(); + } + return true; + } + + return false; + } + + private void onSwipeUp() { + Log.d(TAG, "onSwipeUp"); + onText(); + } + + private void onSwipeDown() { + Log.d(TAG, "onSwipeDown"); + } + + private void onSwipeLeft() { + Log.d(TAG, "onSwipeLeft"); + onDecline(getContext()); + } + + private void onSwipeRight() { + Log.d(TAG, "onSwipeRight"); + onAnswer(VideoProfile.STATE_AUDIO_ONLY, getContext()); + } +} diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java index 7c67719b0..44ddfcd49 100644 --- a/InCallUI/src/com/android/incallui/AnswerFragment.java +++ b/InCallUI/src/com/android/incallui/AnswerFragment.java @@ -21,7 +21,6 @@ import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; -import android.telecom.VideoProfile; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; @@ -34,17 +33,17 @@ import android.widget.Button; import android.widget.EditText; import android.widget.ListView; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; +import com.android.dialer.R; import java.util.ArrayList; import java.util.List; + /** - * + * Provides only common interface and functions. Should be derived to implement the actual UI. */ -public class AnswerFragment extends BaseFragment - implements GlowPadWrapper.AnswerListener, AnswerPresenter.AnswerUi { +public abstract class AnswerFragment extends BaseFragment + implements AnswerPresenter.AnswerUi { public static final int TARGET_SET_FOR_AUDIO_WITHOUT_SMS = 0; public static final int TARGET_SET_FOR_AUDIO_WITH_SMS = 1; @@ -52,6 +51,13 @@ public class AnswerFragment extends BaseFragment mSmsResponses = new ArrayList<>(); - private GlowPadWrapper mGlowpad; - - public AnswerFragment() { - } - @Override public AnswerPresenter createPresenter() { return InCallPresenter.getInstance().getAnswerPresenter(); @@ -85,113 +86,6 @@ public class AnswerFragment extends BaseFragment