summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRicardo Cerqueira <cyanogenmod@cerqueira.org>2014-06-03 15:51:06 +0100
committerRicardo Cerqueira <cyanogenmod@cerqueira.org>2014-06-03 15:51:06 +0100
commitac6448f77dcf38b517190df45307349863e998d1 (patch)
tree6d7016d612f0b8c78391f06777fff1e82a891835 /src
parentb9e308e8e8d4ae26b1ea91f428bb03c1ba7dc773 (diff)
parent45ab8271320237aefe1c172908a99007007c98d3 (diff)
downloadandroid_packages_apps_InCallUI-ac6448f77dcf38b517190df45307349863e998d1.tar.gz
android_packages_apps_InCallUI-ac6448f77dcf38b517190df45307349863e998d1.tar.bz2
android_packages_apps_InCallUI-ac6448f77dcf38b517190df45307349863e998d1.zip
Merge tag 'android-4.4.3_r1' into HEAD
Android 4.4.3 release 1 Conflicts: res/values/array.xml res/values/dimens.xml res/values/strings.xml src/com/android/incallui/InCallActivity.java Change-Id: Ib47882d1cbbb803779314ccfa2964e5ae301ea4b
Diffstat (limited to 'src')
-rw-r--r--src/com/android/incallui/AnswerFragment.java2
-rw-r--r--src/com/android/incallui/DialpadFragment.java129
-rw-r--r--src/com/android/incallui/InCallActivity.java17
-rw-r--r--src/com/android/incallui/InCallPresenter.java4
-rw-r--r--src/com/android/incallui/NeededForReflection.java30
5 files changed, 164 insertions, 18 deletions
diff --git a/src/com/android/incallui/AnswerFragment.java b/src/com/android/incallui/AnswerFragment.java
index 4f62472a..1a5e8b6e 100644
--- a/src/com/android/incallui/AnswerFragment.java
+++ b/src/com/android/incallui/AnswerFragment.java
@@ -182,6 +182,7 @@ public class AnswerFragment extends BaseFragment<AnswerPresenter, AnswerPresente
}
});
mCannedResponsePopup = builder.create();
+ mCannedResponsePopup.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
mCannedResponsePopup.show();
}
@@ -294,6 +295,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/src/com/android/incallui/DialpadFragment.java b/src/com/android/incallui/DialpadFragment.java
index 5087561e..236b38c9 100644
--- a/src/com/android/incallui/DialpadFragment.java
+++ b/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/src/com/android/incallui/InCallActivity.java b/src/com/android/incallui/InCallActivity.java
index cfa7fcbe..8e80c9ff 100644
--- a/src/com/android/incallui/InCallActivity.java
+++ b/src/com/android/incallui/InCallActivity.java
@@ -29,6 +29,7 @@ import com.android.services.telephony.common.CallDetails;
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;
@@ -354,6 +355,10 @@ public class InCallActivity extends Activity {
return super.dispatchTouchEvent(event);
}
+ public CallButtonFragment getCallButtonFragment() {
+ return mCallButtonFragment;
+ }
+
private void internalResolveIntent(Intent intent) {
final String action = intent.getAction();
@@ -411,7 +416,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) {
@@ -444,13 +449,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/src/com/android/incallui/InCallPresenter.java b/src/com/android/incallui/InCallPresenter.java
index 249d04ab..ff1b963f 100644
--- a/src/com/android/incallui/InCallPresenter.java
+++ b/src/com/android/incallui/InCallPresenter.java
@@ -547,7 +547,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/src/com/android/incallui/NeededForReflection.java b/src/com/android/incallui/NeededForReflection.java
new file mode 100644
index 00000000..363a0a54
--- /dev/null
+++ b/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 {}