blob: ab48bc3f48ed8e3202f2a2c42ef0b5ea85b91f6e [file] [log] [blame]
/*
* 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.text.TextUtils;
import androidx.annotation.Nullable;
import com.android.incallui.call.state.DialerCallState;
import com.android.incallui.incall.protocol.PrimaryCallState;
import com.android.incallui.incall.protocol.PrimaryInfo;
/**
* Gets the content of the bottom row. For example:
*
* <ul>
* <li>Mobile +1 (650) 253-0000
* <li>[HD attempting icon]/[HD icon] 00:15
* <li>Call ended
* <li>Hanging up
* </ul>
*/
public class BottomRow {
/** Content of the bottom row. */
public static class Info {
@Nullable
public final CharSequence label;
public final boolean isTimerVisible;
public final boolean isWorkIconVisible;
public final boolean isHdAttemptingIconVisible;
public final boolean isHdIconVisible;
public final boolean isForwardIconVisible;
public final boolean isSpamIconVisible;
public final boolean shouldPopulateAccessibilityEvent;
public Info(
@Nullable CharSequence label,
boolean isTimerVisible,
boolean isWorkIconVisible,
boolean isHdAttemptingIconVisible,
boolean isHdIconVisible,
boolean isForwardIconVisible,
boolean isSpamIconVisible,
boolean shouldPopulateAccessibilityEvent) {
this.label = label;
this.isTimerVisible = isTimerVisible;
this.isWorkIconVisible = isWorkIconVisible;
this.isHdAttemptingIconVisible = isHdAttemptingIconVisible;
this.isHdIconVisible = isHdIconVisible;
this.isForwardIconVisible = isForwardIconVisible;
this.isSpamIconVisible = isSpamIconVisible;
this.shouldPopulateAccessibilityEvent = shouldPopulateAccessibilityEvent;
}
}
private BottomRow() {}
public static Info getInfo(Context context, PrimaryCallState state, PrimaryInfo primaryInfo) {
CharSequence label;
boolean isTimerVisible = state.state() == DialerCallState.ACTIVE;
boolean isForwardIconVisible = state.isForwardedNumber();
boolean isWorkIconVisible = state.isWorkCall();
boolean isHdIconVisible = state.isHdAudioCall() && !isForwardIconVisible;
boolean isHdAttemptingIconVisible = state.isHdAttempting();
boolean isSpamIconVisible = false;
boolean shouldPopulateAccessibilityEvent = true;
if (isIncoming(state) && primaryInfo.isSpam()) {
label = context.getString(R.string.contact_grid_incoming_suspected_spam);
isSpamIconVisible = true;
isHdIconVisible = false;
} else if (state.state() == DialerCallState.DISCONNECTING) {
// While in the DISCONNECTING state we display a "Hanging up" message in order to make the UI
// feel more responsive. (In GSM it's normal to see a delay of a couple of seconds while
// negotiating the disconnect with the network, so the "Hanging up" state at least lets the
// user know that we're doing something. This state is currently not used with CDMA.)
label = context.getString(R.string.incall_hanging_up);
} else if (state.state() == DialerCallState.DISCONNECTED) {
label = state.disconnectCause().getLabel();
if (TextUtils.isEmpty(label)) {
label = context.getString(R.string.incall_call_ended);
}
} else {
label = getLabelForPhoneNumber(primaryInfo);
shouldPopulateAccessibilityEvent = primaryInfo.nameIsNumber();
}
return new Info(
label,
isTimerVisible,
isWorkIconVisible,
isHdAttemptingIconVisible,
isHdIconVisible,
isForwardIconVisible,
isSpamIconVisible,
shouldPopulateAccessibilityEvent);
}
private static CharSequence getLabelForPhoneNumber(PrimaryInfo primaryInfo) {
if (primaryInfo.location() != null) {
return primaryInfo.location();
}
if (!primaryInfo.nameIsNumber() && !TextUtils.isEmpty(primaryInfo.number())) {
if (primaryInfo.label() == null) {
return primaryInfo.number();
} else {
return TextUtils.concat(primaryInfo.label(), " ", primaryInfo.number());
}
}
return null;
}
private static boolean isIncoming(PrimaryCallState state) {
return state.state() == DialerCallState.INCOMING
|| state.state() == DialerCallState.CALL_WAITING;
}
}