blob: 166e5a1c444df11f42281f307a207f8e956f9460 [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.car.dialer.ui;
import android.os.Bundle;
import android.os.Handler;
import android.telecom.Call;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.car.dialer.CallListener;
import com.android.car.dialer.DialerFragment;
import com.android.car.dialer.R;
import com.android.car.dialer.telecom.TelecomUtils;
import com.android.car.dialer.telecom.UiCall;
import com.android.car.dialer.telecom.UiCallManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
/**
* A fragment that displays information about an on-going call with options to hang up.
*/
public class InCallFragment extends Fragment implements
OnGoingCallControllerBarFragment.OnGoingCallControllerBarCallback, CallListener {
private Fragment mDialerFragment;
private View mUserProfileContainerView;
private View mDialerFragmentContainer;
private TextView mUserProfileBodyText;
private Handler mHandler = new Handler();
private CharSequence mCallInfoLabel;
public static InCallFragment newInstance() {
return new InCallFragment();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.in_call_fragment, container, false);
mUserProfileContainerView = fragmentView.findViewById(R.id.user_profile_container);
mDialerFragmentContainer = fragmentView.findViewById(R.id.dialer_container);
mUserProfileBodyText = mUserProfileContainerView.findViewById(R.id.body);
mDialerFragment = new DialerFragment();
updateControllerBarFragment(UiCallManager.get().getPrimaryCall().getState());
bindUserProfileView(fragmentView.findViewById(R.id.user_profile_container));
return fragmentView;
}
@Override
public void onPause() {
super.onPause();
mHandler.removeCallbacks(mUpdateDurationRunnable);
}
@Override
public void onOpenDialpad() {
mDialerFragment = new DialerFragment();
getChildFragmentManager().beginTransaction()
.replace(R.id.dialer_container, mDialerFragment)
.commit();
mDialerFragmentContainer.setVisibility(View.VISIBLE);
mUserProfileContainerView.setVisibility(View.GONE);
}
@Override
public void onCloseDialpad() {
getFragmentManager().beginTransaction()
.remove(mDialerFragment)
.commit();
mDialerFragmentContainer.setVisibility(View.GONE);
mUserProfileContainerView.setVisibility(View.VISIBLE);
}
private void bindUserProfileView(View container) {
UiCall primaryCall = UiCallManager.get().getPrimaryCall();
if (primaryCall == null) {
return;
}
String number = primaryCall.getNumber();
String displayName = TelecomUtils.getDisplayName(getContext(), primaryCall);
TextView nameView = container.findViewById(R.id.title);
nameView.setText(displayName);
ImageView avatar = container.findViewById(R.id.avatar);
TelecomUtils.setContactBitmapAsync(getContext(), avatar, displayName, number);
mCallInfoLabel = TelecomUtils.getTypeFromNumber(getContext(), primaryCall.getNumber());
}
private void updateControllerBarFragment(int callState) {
Fragment controllerBarFragment;
if (callState == Call.STATE_RINGING) {
controllerBarFragment = RingingCallControllerBarFragment.newInstance();
} else {
controllerBarFragment = OnGoingCallControllerBarFragment.newInstance();
}
getChildFragmentManager().beginTransaction()
.replace(R.id.controller_bar_container, controllerBarFragment)
.commit();
}
@Override
public void onAudioStateChanged(boolean isMuted, int route, int supportedRouteMask) {
}
@Override
public void onCallStateChanged(UiCall call, int state) {
int callState = call.getState();
switch (callState) {
case Call.STATE_NEW:
case Call.STATE_CONNECTING:
case Call.STATE_DIALING:
case Call.STATE_SELECT_PHONE_ACCOUNT:
case Call.STATE_HOLDING:
case Call.STATE_DISCONNECTED:
mHandler.removeCallbacks(mUpdateDurationRunnable);
updateBody(call);
break;
case Call.STATE_ACTIVE:
mHandler.post(mUpdateDurationRunnable);
updateControllerBarFragment(call.getState());
break;
}
}
@Override
public void onCallUpdated(UiCall call) {
}
@Override
public void onCallAdded(UiCall call) {
}
@Override
public void onCallRemoved(UiCall call) {
}
private final Runnable mUpdateDurationRunnable = new Runnable() {
@Override
public void run() {
UiCall primaryCall = UiCallManager.get().getPrimaryCall();
if (primaryCall.getState() != Call.STATE_ACTIVE) {
return;
}
updateBody(primaryCall);
mHandler.postDelayed(this /* runnable */, DateUtils.SECOND_IN_MILLIS);
}
};
private void updateBody(UiCall primaryCall) {
String callInfoText = TelecomUtils.getCallInfoText(getContext(),
primaryCall, mCallInfoLabel);
mUserProfileBodyText.setText(callInfoText);
mUserProfileBodyText.setVisibility(
TextUtils.isEmpty(callInfoText) ? View.GONE : View.VISIBLE);
}
}