blob: cc8f3dc660213c653d7ecdf52a953c8effed0b10 [file] [log] [blame]
/*
* Copyright (C) 2018 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.dialer.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.QuickContactBadge;
import androidx.annotation.Nullable;
import com.android.dialer.R;
import com.android.dialer.common.Assert;
import com.android.dialer.glidephotomanager.GlidePhotoManager;
import com.android.dialer.glidephotomanager.GlidePhotoManagerComponent;
import com.android.dialer.glidephotomanager.PhotoInfo;
/**
* A {@link FrameLayout} for displaying a contact photo and its optional badge (such as one for a
* video call).
*/
public final class ContactPhotoView extends FrameLayout {
private final QuickContactBadge contactPhoto;
private final FrameLayout contactBadgeContainer;
private final ImageView videoCallBadge;
private final ImageView rttCallBadge;
private final GlidePhotoManager glidePhotoManager;
public ContactPhotoView(Context context) {
this(context, /* attrs = */ null);
}
public ContactPhotoView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, /* defStyleAttr = */ 0);
}
public ContactPhotoView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, /* defStyleRes = */ 0);
}
public ContactPhotoView(
Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
inflateLayout();
contactPhoto = findViewById(R.id.quick_contact_photo);
contactBadgeContainer = findViewById(R.id.contact_badge_container);
videoCallBadge = findViewById(R.id.video_call_badge);
rttCallBadge = findViewById(R.id.rtt_call_badge);
glidePhotoManager = GlidePhotoManagerComponent.get(context).glidePhotoManager();
hideBadge(); // Hide badges by default.
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// We require both the height and the width to be WRAP_CONTENT to prevent users of
// this widget from clipping the view (by setting a size that is too small) or altering the
// relative position of the contact photo and its badge (by setting a size that is too large).
ViewGroup.LayoutParams layoutParams = Assert.isNotNull(getLayoutParams());
Assert.checkState(
layoutParams.height == LayoutParams.WRAP_CONTENT,
"The layout height must be WRAP_CONTENT!");
Assert.checkState(
layoutParams.width == LayoutParams.WRAP_CONTENT, "The layout width must be WRAP_CONTENT!");
}
private void inflateLayout() {
LayoutInflater inflater = Assert.isNotNull(getContext().getSystemService(LayoutInflater.class));
inflater.inflate(R.layout.contact_photo_view, /* root = */ this);
}
private void hideBadge() {
contactBadgeContainer.setVisibility(View.GONE);
videoCallBadge.setVisibility(View.GONE);
rttCallBadge.setVisibility(View.GONE);
}
/** Sets the contact photo and its badge to be displayed. */
public void setPhoto(PhotoInfo photoInfo) {
glidePhotoManager.loadQuickContactBadge(contactPhoto, photoInfo);
setBadge(photoInfo);
}
private void setBadge(PhotoInfo photoInfo) {
// No badge for spam numbers.
if (photoInfo.getIsSpam()) {
hideBadge();
return;
}
if (photoInfo.getIsVideo()) {
contactBadgeContainer.setVisibility(View.VISIBLE);
videoCallBadge.setVisibility(View.VISIBLE);
// Normally a video call can't be RTT call and vice versa.
// (a bug): In theory a video call could be downgraded to voice and upgraded to RTT call
// again, this might end up a call with video and RTT features both set. Update logic here if
// that could happen. Also update {@link Coalescer#meetsCallFeatureCriteria}.
rttCallBadge.setVisibility(View.GONE);
} else if (photoInfo.getIsRtt()) {
contactBadgeContainer.setVisibility(View.VISIBLE);
videoCallBadge.setVisibility(View.GONE);
rttCallBadge.setVisibility(View.VISIBLE);
} else {
hideBadge();
}
}
}