summaryrefslogtreecommitdiffstats
path: root/java/com/android/incallui/contactgrid/ContactGridManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/com/android/incallui/contactgrid/ContactGridManager.java')
-rw-r--r--java/com/android/incallui/contactgrid/ContactGridManager.java315
1 files changed, 315 insertions, 0 deletions
diff --git a/java/com/android/incallui/contactgrid/ContactGridManager.java b/java/com/android/incallui/contactgrid/ContactGridManager.java
new file mode 100644
index 000000000..81c225163
--- /dev/null
+++ b/java/com/android/incallui/contactgrid/ContactGridManager.java
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2016 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.contactgrid;
+
+import android.content.Context;
+import android.os.SystemClock;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+import android.view.View;
+import android.view.accessibility.AccessibilityEvent;
+import android.widget.Chronometer;
+import android.widget.ImageView;
+import android.widget.TextView;
+import android.widget.ViewAnimator;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
+import com.android.contacts.common.lettertiles.LetterTileDrawable;
+import com.android.dialer.common.Assert;
+import com.android.dialer.util.DrawableConverter;
+import com.android.incallui.incall.protocol.ContactPhotoType;
+import com.android.incallui.incall.protocol.PrimaryCallState;
+import com.android.incallui.incall.protocol.PrimaryInfo;
+import java.util.List;
+
+/** Utility to manage the Contact grid */
+public class ContactGridManager {
+
+ private final Context context;
+ private final View contactGridLayout;
+
+ // Row 0: Captain Holt ON HOLD
+ // Row 0: Calling...
+ // Row 0: [Wi-Fi icon] Calling via Starbucks Wi-Fi
+ // Row 0: [Wi-Fi icon] Starbucks Wi-Fi
+ // Row 0: Hey Jake, pick up!
+ private ImageView connectionIconImageView;
+ private TextView statusTextView;
+
+ // Row 1: Jake Peralta [Contact photo]
+ // Row 1: Walgreens
+ // Row 1: +1 (650) 253-0000
+ private TextView contactNameTextView;
+ @Nullable private ImageView avatarImageView;
+
+ // Row 2: Mobile +1 (650) 253-0000
+ // Row 2: [HD icon] 00:15
+ // Row 2: Call ended
+ // Row 2: Hanging up
+ // Row 2: [Alert sign] Suspected spam caller
+ // Row 2: Your emergency callback number: +1 (650) 253-0000
+ private ImageView workIconImageView;
+ private ImageView hdIconImageView;
+ private ImageView forwardIconImageView;
+ private ImageView spamIconImageView;
+ private ViewAnimator bottomTextSwitcher;
+ private TextView bottomTextView;
+ private Chronometer bottomTimerView;
+ private int avatarSize;
+ private boolean hideAvatar;
+ private boolean showAnonymousAvatar;
+ private boolean middleRowVisible = true;
+
+ private PrimaryInfo primaryInfo = PrimaryInfo.createEmptyPrimaryInfo();
+ private PrimaryCallState primaryCallState = PrimaryCallState.createEmptyPrimaryCallState();
+ private final LetterTileDrawable letterTile;
+
+
+ public ContactGridManager(
+ View view, @Nullable ImageView avatarImageView, int avatarSize, boolean showAnonymousAvatar) {
+ context = view.getContext();
+ Assert.isNotNull(context);
+
+ this.avatarImageView = avatarImageView;
+ this.avatarSize = avatarSize;
+ this.showAnonymousAvatar = showAnonymousAvatar;
+ connectionIconImageView = (ImageView) view.findViewById(R.id.contactgrid_connection_icon);
+ statusTextView = (TextView) view.findViewById(R.id.contactgrid_status_text);
+ contactNameTextView = (TextView) view.findViewById(R.id.contactgrid_contact_name);
+ workIconImageView = (ImageView) view.findViewById(R.id.contactgrid_workIcon);
+ hdIconImageView = (ImageView) view.findViewById(R.id.contactgrid_hdIcon);
+ forwardIconImageView = (ImageView) view.findViewById(R.id.contactgrid_forwardIcon);
+ spamIconImageView = (ImageView) view.findViewById(R.id.contactgrid_spamIcon);
+ bottomTextSwitcher = (ViewAnimator) view.findViewById(R.id.contactgrid_bottom_text_switcher);
+ bottomTextView = (TextView) view.findViewById(R.id.contactgrid_bottom_text);
+ bottomTimerView = (Chronometer) view.findViewById(R.id.contactgrid_bottom_timer);
+
+ contactGridLayout = (View) contactNameTextView.getParent();
+ letterTile = new LetterTileDrawable(context.getResources());
+ }
+
+ public void show() {
+ contactGridLayout.setVisibility(View.VISIBLE);
+ }
+
+ public void hide() {
+ contactGridLayout.setVisibility(View.GONE);
+ }
+
+ public void setAvatarHidden(boolean hide) {
+ if (hide != hideAvatar) {
+ hideAvatar = hide;
+ updatePrimaryNameAndPhoto();
+ }
+ }
+
+ public boolean isAvatarHidden() {
+ return hideAvatar;
+ }
+
+ public View getContainerView() {
+ return contactGridLayout;
+ }
+
+ public void setIsMiddleRowVisible(boolean isMiddleRowVisible) {
+ if (middleRowVisible == isMiddleRowVisible) {
+ return;
+ }
+ middleRowVisible = isMiddleRowVisible;
+
+ contactNameTextView.setVisibility(isMiddleRowVisible ? View.VISIBLE : View.GONE);
+ updateAvatarVisibility();
+ }
+
+ public void setPrimary(PrimaryInfo primaryInfo) {
+ this.primaryInfo = primaryInfo;
+ updatePrimaryNameAndPhoto();
+ updateBottomRow();
+ }
+
+ public void setCallState(PrimaryCallState primaryCallState) {
+ this.primaryCallState = primaryCallState;
+ updatePrimaryNameAndPhoto();
+ updateBottomRow();
+ updateTopRow();
+ }
+
+ public void dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
+ dispatchPopulateAccessibilityEvent(event, statusTextView);
+ dispatchPopulateAccessibilityEvent(event, contactNameTextView);
+ BottomRow.Info info = BottomRow.getInfo(context, primaryCallState, primaryInfo);
+ if (info.shouldPopulateAccessibilityEvent) {
+ dispatchPopulateAccessibilityEvent(event, bottomTextView);
+ }
+ }
+
+ public void setAvatarImageView(
+ @Nullable ImageView avatarImageView, int avatarSize, boolean showAnonymousAvatar) {
+ this.avatarImageView = avatarImageView;
+ this.avatarSize = avatarSize;
+ this.showAnonymousAvatar = showAnonymousAvatar;
+ updatePrimaryNameAndPhoto();
+ }
+
+ private void dispatchPopulateAccessibilityEvent(AccessibilityEvent event, View view) {
+ final List<CharSequence> eventText = event.getText();
+ int size = eventText.size();
+ view.dispatchPopulateAccessibilityEvent(event);
+ // If no text added write null to keep relative position.
+ if (size == eventText.size()) {
+ eventText.add(null);
+ }
+ }
+
+ private boolean updateAvatarVisibility() {
+ if (avatarImageView == null) {
+ return false;
+ }
+
+ if (!middleRowVisible) {
+ avatarImageView.setVisibility(View.GONE);
+ return false;
+ }
+
+ boolean hasPhoto =
+ primaryInfo.photo != null && primaryInfo.photoType == ContactPhotoType.CONTACT;
+ if (!hasPhoto && !showAnonymousAvatar) {
+ avatarImageView.setVisibility(View.GONE);
+ return false;
+ }
+
+ avatarImageView.setVisibility(View.VISIBLE);
+ return true;
+ }
+
+ /**
+ * Updates row 0. For example:
+ *
+ * <ul>
+ * <li>Captain Holt ON HOLD
+ * <li>Calling...
+ * <li>[Wi-Fi icon] Calling via Starbucks Wi-Fi
+ * <li>[Wi-Fi icon] Starbucks Wi-Fi
+ * <li>Call from
+ * </ul>
+ */
+ private void updateTopRow() {
+ TopRow.Info info = TopRow.getInfo(context, primaryCallState);
+ if (TextUtils.isEmpty(info.label)) {
+ // Use INVISIBLE here to prevent the rows below this one from moving up and down.
+ statusTextView.setVisibility(View.INVISIBLE);
+ statusTextView.setText(null);
+ } else {
+ statusTextView.setText(info.label);
+ statusTextView.setVisibility(View.VISIBLE);
+ statusTextView.setSingleLine(info.labelIsSingleLine);
+ }
+
+ if (info.icon == null) {
+ connectionIconImageView.setVisibility(View.GONE);
+ } else {
+ connectionIconImageView.setVisibility(View.VISIBLE);
+ connectionIconImageView.setImageDrawable(info.icon);
+ }
+ }
+
+ /**
+ * Updates row 1. For example:
+ *
+ * <ul>
+ * <li>Jake Peralta [Contact photo]
+ * <li>Walgreens
+ * <li>+1 (650) 253-0000
+ * </ul>
+ */
+ private void updatePrimaryNameAndPhoto() {
+ if (TextUtils.isEmpty(primaryInfo.name)) {
+ contactNameTextView.setText(null);
+ } else {
+ contactNameTextView.setText(
+ primaryInfo.nameIsNumber
+ ? PhoneNumberUtilsCompat.createTtsSpannable(primaryInfo.name)
+ : primaryInfo.name);
+
+ // Set direction of the name field
+ int nameDirection = View.TEXT_DIRECTION_INHERIT;
+ if (primaryInfo.nameIsNumber) {
+ nameDirection = View.TEXT_DIRECTION_LTR;
+ }
+ contactNameTextView.setTextDirection(nameDirection);
+ }
+
+ if (avatarImageView != null) {
+ if (hideAvatar) {
+ avatarImageView.setVisibility(View.GONE);
+ } else if (avatarImageView != null && avatarSize > 0 && updateAvatarVisibility()) {
+ boolean hasPhoto =
+ primaryInfo.photo != null && primaryInfo.photoType == ContactPhotoType.CONTACT;
+ // Contact has a photo, don't render a letter tile.
+ if (hasPhoto) {
+ avatarImageView.setBackground(
+ DrawableConverter.getRoundedDrawable(
+ context, primaryInfo.photo, avatarSize, avatarSize));
+ // Contact has a name, that isn't a number.
+ } else {
+ int contactType =
+ primaryCallState.isVoiceMailNumber
+ ? LetterTileDrawable.TYPE_VOICEMAIL
+ : LetterTileDrawable.TYPE_DEFAULT;
+ letterTile.setCanonicalDialerLetterTileDetails(
+ primaryInfo.name,
+ primaryInfo.contactInfoLookupKey,
+ LetterTileDrawable.SHAPE_CIRCLE,
+ contactType);
+ avatarImageView.setBackground(letterTile);
+ }
+ }
+ }
+ }
+
+ /**
+ * Updates row 2. For example:
+ *
+ * <ul>
+ * <li>Mobile +1 (650) 253-0000
+ * <li>[HD icon] 00:15
+ * <li>Call ended
+ * <li>Hanging up
+ * </ul>
+ */
+ private void updateBottomRow() {
+ BottomRow.Info info = BottomRow.getInfo(context, primaryCallState, primaryInfo);
+
+ bottomTextView.setText(info.label);
+ bottomTextView.setAllCaps(info.isSpamIconVisible);
+ workIconImageView.setVisibility(info.isWorkIconVisible ? View.VISIBLE : View.GONE);
+ hdIconImageView.setVisibility(info.isHdIconVisible ? View.VISIBLE : View.GONE);
+ forwardIconImageView.setVisibility(info.isForwardIconVisible ? View.VISIBLE : View.GONE);
+ spamIconImageView.setVisibility(info.isSpamIconVisible ? View.VISIBLE : View.GONE);
+
+ if (info.isTimerVisible) {
+ bottomTextSwitcher.setDisplayedChild(1);
+ bottomTimerView.setBase(
+ primaryCallState.connectTimeMillis
+ - System.currentTimeMillis()
+ + SystemClock.elapsedRealtime());
+ bottomTimerView.start();
+ } else {
+ bottomTextSwitcher.setDisplayedChild(0);
+ bottomTimerView.stop();
+ }
+ }
+}