diff options
Diffstat (limited to 'InCallUI/src/com/android/incallui')
7 files changed, 166 insertions, 19 deletions
diff --git a/InCallUI/src/com/android/incallui/AnswerFragment.java b/InCallUI/src/com/android/incallui/AnswerFragment.java index 0b81ffee1..c76c5071b 100644 --- a/InCallUI/src/com/android/incallui/AnswerFragment.java +++ b/InCallUI/src/com/android/incallui/AnswerFragment.java @@ -156,6 +156,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente } }); mCannedResponsePopup = builder.create(); + mCannedResponsePopup.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); mCannedResponsePopup.show(); } @@ -261,6 +262,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente // Keyboard up, show the dialog mCustomMessagePopup.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + mCustomMessagePopup.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); mCustomMessagePopup.show(); // Send button starts out disabled diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java index 4c43db7bb..c16105803 100644 --- a/InCallUI/src/com/android/incallui/CallList.java +++ b/InCallUI/src/com/android/incallui/CallList.java @@ -311,7 +311,9 @@ public class CallList { if (state != Call.State.IDLE && state != Call.State.INVALID && state != Call.State.DISCONNECTED) { + call.setState(Call.State.DISCONNECTED); + call.setDisconnectCause(DisconnectCause.NOT_VALID); updateCallInMap(call); } } diff --git a/InCallUI/src/com/android/incallui/DialpadFragment.java b/InCallUI/src/com/android/incallui/DialpadFragment.java index 5087561e6..236b38c9c 100644 --- a/InCallUI/src/com/android/incallui/DialpadFragment.java +++ b/InCallUI/src/com/android/incallui/DialpadFragment.java @@ -17,16 +17,22 @@ package com.android.incallui; import android.content.Context; +import android.content.res.Resources; import android.os.Bundle; import android.text.Editable; import android.text.method.DialerKeyListener; +import android.util.AttributeSet; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityManager; import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.TableRow; +import android.widget.TextView; import java.util.HashMap; @@ -37,6 +43,61 @@ public class DialpadFragment extends BaseFragment<DialpadPresenter, DialpadPrese implements DialpadPresenter.DialpadUi, View.OnTouchListener, View.OnKeyListener, View.OnHoverListener, View.OnClickListener { + private static final float DIALPAD_SLIDE_FRACTION = 1.0f; + + /** + * LinearLayout with getter and setter methods for the translationY property using floats, + * for animation purposes. + */ + public static class DialpadSlidingLinearLayout extends LinearLayout { + + public DialpadSlidingLinearLayout(Context context) { + super(context); + } + + public DialpadSlidingLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DialpadSlidingLinearLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + public float getYFraction() { + final int height = getHeight(); + if (height == 0) return 0; + return getTranslationY() / height; + } + + public void setYFraction(float yFraction) { + setTranslationY(yFraction * getHeight()); + } + } + + /** + * LinearLayout that always returns true for onHoverEvent callbacks, to fix + * problems with accessibility due to the dialpad overlaying other fragments. + */ + public static class HoverIgnoringLinearLayout extends LinearLayout { + + public HoverIgnoringLinearLayout(Context context) { + super(context); + } + + public HoverIgnoringLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public HoverIgnoringLinearLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public boolean onHoverEvent(MotionEvent event) { + return true; + } + } + private EditText mDtmfDialerField; /** Hash Map to map a view id to a character*/ @@ -254,9 +315,8 @@ public class DialpadFragment extends BaseFragment<DialpadPresenter, DialpadPrese @Override public void onClick(View v) { - Log.d(this, "onClick"); final AccessibilityManager accessibilityManager = (AccessibilityManager) - getActivity().getSystemService(Context.ACCESSIBILITY_SERVICE); + v.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); // When accessibility is on, simulate press and release to preserve the // semantic meaning of performClick(). Required for Braille support. if (accessibilityManager.isEnabled()) { @@ -273,7 +333,7 @@ public class DialpadFragment extends BaseFragment<DialpadPresenter, DialpadPrese // When touch exploration is turned on, lifting a finger while inside // the button's hover target bounds should perform a click action. final AccessibilityManager accessibilityManager = (AccessibilityManager) - getActivity().getSystemService(Context.ACCESSIBILITY_SERVICE); + v.getContext().getSystemService(Context.ACCESSIBILITY_SERVICE); if (accessibilityManager.isEnabled() && accessibilityManager.isTouchExplorationEnabled()) { @@ -382,6 +442,29 @@ public class DialpadFragment extends BaseFragment<DialpadPresenter, DialpadPrese setupKeypad(parent); } + + final ViewTreeObserver vto = parent.getViewTreeObserver(); + // Adjust the translation of the DialpadFragment in a preDrawListener instead of in + // DialtactsActivity, because at the point in time when the DialpadFragment is added, + // its views have not been laid out yet. + final ViewTreeObserver.OnPreDrawListener + preDrawListener = new ViewTreeObserver.OnPreDrawListener() { + @Override + public boolean onPreDraw() { + if (isHidden()) return true; + if (parent.getTranslationY() == 0) { + ((DialpadSlidingLinearLayout) parent) + .setYFraction(DIALPAD_SLIDE_FRACTION); + } + final ViewTreeObserver vto = parent.getViewTreeObserver(); + vto.removeOnPreDrawListener(this); + return true; + } + + }; + + vto.addOnPreDrawListener(preDrawListener); + return parent; } @@ -440,21 +523,43 @@ public class DialpadFragment extends BaseFragment<DialpadPresenter, DialpadPrese } } - /** - * setup the keys on the dialer activity, using the keymaps. - */ - private void setupKeypad(View parent) { - // for each view id listed in the displaymap + private void setupKeypad(View fragmentView) { + final int[] buttonIds = new int[] {R.id.zero, R.id.one, R.id.two, R.id.three, R.id.four, + R.id.five, R.id.six, R.id.seven, R.id.eight, R.id.nine, R.id.star, R.id.pound}; + + final int[] numberIds = new int[] {R.string.dialpad_0_number, R.string.dialpad_1_number, + R.string.dialpad_2_number, R.string.dialpad_3_number, R.string.dialpad_4_number, + R.string.dialpad_5_number, R.string.dialpad_6_number, R.string.dialpad_7_number, + R.string.dialpad_8_number, R.string.dialpad_9_number, R.string.dialpad_star_number, + R.string.dialpad_pound_number}; + + final int[] letterIds = new int[] {R.string.dialpad_0_letters, R.string.dialpad_1_letters, + R.string.dialpad_2_letters, R.string.dialpad_3_letters, R.string.dialpad_4_letters, + R.string.dialpad_5_letters, R.string.dialpad_6_letters, R.string.dialpad_7_letters, + R.string.dialpad_8_letters, R.string.dialpad_9_letters, + R.string.dialpad_star_letters, R.string.dialpad_pound_letters}; + + final Resources resources = getResources(); + View button; - for (int viewId : mDisplayMap.keySet()) { - // locate the view - button = parent.findViewById(viewId); - // Setup the listeners for the buttons + TextView numberView; + TextView lettersView; + + for (int i = 0; i < buttonIds.length; i++) { + button = fragmentView.findViewById(buttonIds[i]); button.setOnTouchListener(this); button.setClickable(true); button.setOnKeyListener(this); button.setOnHoverListener(this); button.setOnClickListener(this); + numberView = (TextView) button.findViewById(R.id.dialpad_key_number); + lettersView = (TextView) button.findViewById(R.id.dialpad_key_letters); + final String numberString = resources.getString(numberIds[i]); + numberView.setText(numberString); + button.setContentDescription(numberString); + if (lettersView != null) { + lettersView.setText(resources.getString(letterIds[i])); + } } } } diff --git a/InCallUI/src/com/android/incallui/InCallActivity.java b/InCallUI/src/com/android/incallui/InCallActivity.java index aa4a715ad..d41cc99ae 100644 --- a/InCallUI/src/com/android/incallui/InCallActivity.java +++ b/InCallUI/src/com/android/incallui/InCallActivity.java @@ -21,6 +21,7 @@ import com.android.services.telephony.common.Call.State; import android.app.Activity; import android.app.AlertDialog; +import android.app.FragmentTransaction; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnCancelListener; @@ -309,6 +310,10 @@ public class InCallActivity extends Activity { InCallPresenter.getInstance().getProximitySensor().onConfigurationChanged(config); } + public CallButtonFragment getCallButtonFragment() { + return mCallButtonFragment; + } + private void internalResolveIntent(Intent intent) { final String action = intent.getAction(); @@ -366,7 +371,7 @@ public class InCallActivity extends Activity { if (mDialpadFragment == null) { mDialpadFragment = (DialpadFragment) getFragmentManager() .findFragmentById(R.id.dialpadFragment); - mDialpadFragment.getView().setVisibility(View.INVISIBLE); + getFragmentManager().beginTransaction().hide(mDialpadFragment).commit(); } if (mConferenceManagerFragment == null) { @@ -399,13 +404,15 @@ public class InCallActivity extends Activity { } public void displayDialpad(boolean showDialpad) { + final FragmentTransaction ft = getFragmentManager().beginTransaction(); if (showDialpad) { - mDialpadFragment.setVisible(true); - mCallCardFragment.setVisible(false); + ft.setCustomAnimations(R.anim.incall_dialpad_slide_in, 0); + ft.show(mDialpadFragment); } else { - mDialpadFragment.setVisible(false); - mCallCardFragment.setVisible(true); + ft.setCustomAnimations(0, R.anim.incall_dialpad_slide_out); + ft.hide(mDialpadFragment); } + ft.commitAllowingStateLoss(); InCallPresenter.getInstance().getProximitySensor().onDialpadVisible(showDialpad); } diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java index 8bec492d9..140262127 100644 --- a/InCallUI/src/com/android/incallui/InCallPresenter.java +++ b/InCallUI/src/com/android/incallui/InCallPresenter.java @@ -425,7 +425,9 @@ public class InCallPresenter implements CallList.Listener { } public void onPostDialCharWait(int callId, String chars) { - mInCallActivity.showPostCharWaitDialog(callId, chars); + if (isActivityStarted()) { + mInCallActivity.showPostCharWaitDialog(callId, chars); + } } /** diff --git a/InCallUI/src/com/android/incallui/NeededForReflection.java b/InCallUI/src/com/android/incallui/NeededForReflection.java new file mode 100644 index 000000000..363a0a548 --- /dev/null +++ b/InCallUI/src/com/android/incallui/NeededForReflection.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2014 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 java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Denotes that the class, constructor, method or field is used for reflection and therefore cannot + * be removed by tools like ProGuard. + */ +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.TYPE, ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.FIELD}) +public @interface NeededForReflection {} diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java index 6d9fd600c..2de1b2d0a 100644 --- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java +++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java @@ -236,7 +236,6 @@ public class StatusBarNotifier implements InCallPresenter.InCallStateListener { mNotificationTimer.getState() == NotificationTimer.State.FIRED); if (showNotificationNow) { - Log.e(this, "showNotificationNow == true case", new Exception()); showNotification(call, allowFullScreenIntent); } else { cancelInCall(); |