1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.car.dialer.ui; 17 18 import static android.telecom.Call.STATE_RINGING; 19 20 import android.os.Bundle; 21 import android.os.Handler; 22 import android.support.annotation.NonNull; 23 import android.support.annotation.Nullable; 24 import android.support.v4.app.Fragment; 25 import android.telecom.Call; 26 import android.text.TextUtils; 27 import android.text.format.DateUtils; 28 import android.util.Log; 29 import android.view.LayoutInflater; 30 import android.view.View; 31 import android.view.ViewGroup; 32 import android.widget.ImageView; 33 import android.widget.TextView; 34 35 import com.android.car.dialer.CallListener; 36 import com.android.car.dialer.DialerFragment; 37 import com.android.car.dialer.R; 38 import com.android.car.dialer.telecom.TelecomUtils; 39 import com.android.car.dialer.telecom.UiCall; 40 import com.android.car.dialer.telecom.UiCallManager; 41 42 /** 43 * A fragment that displays information about an on-going call with options to hang up. 44 */ 45 public class InCallFragment extends Fragment implements 46 OnGoingCallControllerBarFragment.OnGoingCallControllerBarCallback, CallListener { 47 48 private Fragment mDialerFragment; 49 private View mUserProfileContainerView; 50 private View mDialerFragmentContainer; 51 private TextView mUserProfileBodyText; 52 53 private Handler mHandler = new Handler(); 54 private CharSequence mCallInfoLabel; 55 newInstance()56 public static InCallFragment newInstance() { 57 return new InCallFragment(); 58 } 59 60 @Override onCreateView(@onNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)61 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, 62 @Nullable Bundle savedInstanceState) { 63 View fragmentView = inflater.inflate(R.layout.in_call_fragment, container, false); 64 mUserProfileContainerView = fragmentView.findViewById(R.id.user_profile_container); 65 mDialerFragmentContainer = fragmentView.findViewById(R.id.dialer_container); 66 mUserProfileBodyText = mUserProfileContainerView.findViewById(R.id.body); 67 mDialerFragment = new DialerFragment(); 68 69 updateControllerBarFragment(UiCallManager.get().getPrimaryCall().getState()); 70 bindUserProfileView(fragmentView.findViewById(R.id.user_profile_container)); 71 return fragmentView; 72 } 73 74 @Override onPause()75 public void onPause() { 76 super.onPause(); 77 mHandler.removeCallbacks(mUpdateDurationRunnable); 78 } 79 80 @Override onOpenDialpad()81 public void onOpenDialpad() { 82 mDialerFragment = new DialerFragment(); 83 getChildFragmentManager().beginTransaction() 84 .replace(R.id.dialer_container, mDialerFragment) 85 .commit(); 86 mDialerFragmentContainer.setVisibility(View.VISIBLE); 87 mUserProfileContainerView.setVisibility(View.GONE); 88 } 89 90 @Override onCloseDialpad()91 public void onCloseDialpad() { 92 getFragmentManager().beginTransaction() 93 .remove(mDialerFragment) 94 .commit(); 95 mDialerFragmentContainer.setVisibility(View.GONE); 96 mUserProfileContainerView.setVisibility(View.VISIBLE); 97 } 98 bindUserProfileView(View container)99 private void bindUserProfileView(View container) { 100 UiCall primaryCall = UiCallManager.get().getPrimaryCall(); 101 if (primaryCall == null) { 102 return; 103 } 104 String number = primaryCall.getNumber(); 105 String displayName = TelecomUtils.getDisplayName(getContext(), primaryCall); 106 107 TextView nameView = container.findViewById(R.id.title); 108 nameView.setText(displayName); 109 110 ImageView avatar = container.findViewById(R.id.avatar); 111 TelecomUtils.setContactBitmapAsync(getContext(), avatar, displayName, number); 112 113 mCallInfoLabel = TelecomUtils.getTypeFromNumber(getContext(), primaryCall.getNumber()); 114 } 115 updateControllerBarFragment(int callState)116 private void updateControllerBarFragment(int callState) { 117 Fragment controllerBarFragment; 118 if (callState == Call.STATE_RINGING) { 119 controllerBarFragment = RingingCallControllerBarFragment.newInstance(); 120 } else { 121 controllerBarFragment = OnGoingCallControllerBarFragment.newInstance(); 122 } 123 124 getChildFragmentManager().beginTransaction() 125 .replace(R.id.controller_bar_container, controllerBarFragment) 126 .commit(); 127 } 128 129 @Override onAudioStateChanged(boolean isMuted, int route, int supportedRouteMask)130 public void onAudioStateChanged(boolean isMuted, int route, int supportedRouteMask) { 131 132 } 133 134 @Override onCallStateChanged(UiCall call, int state)135 public void onCallStateChanged(UiCall call, int state) { 136 int callState = call.getState(); 137 switch (callState) { 138 case Call.STATE_NEW: 139 case Call.STATE_CONNECTING: 140 case Call.STATE_DIALING: 141 case Call.STATE_SELECT_PHONE_ACCOUNT: 142 case Call.STATE_HOLDING: 143 case Call.STATE_DISCONNECTED: 144 mHandler.removeCallbacks(mUpdateDurationRunnable); 145 updateBody(call); 146 break; 147 case Call.STATE_ACTIVE: 148 mHandler.post(mUpdateDurationRunnable); 149 updateControllerBarFragment(call.getState()); 150 break; 151 } 152 } 153 154 @Override onCallUpdated(UiCall call)155 public void onCallUpdated(UiCall call) { 156 157 } 158 159 @Override onCallAdded(UiCall call)160 public void onCallAdded(UiCall call) { 161 162 } 163 164 @Override onCallRemoved(UiCall call)165 public void onCallRemoved(UiCall call) { 166 167 } 168 169 private final Runnable mUpdateDurationRunnable = new Runnable() { 170 @Override 171 public void run() { 172 UiCall primaryCall = UiCallManager.get().getPrimaryCall(); 173 if (primaryCall.getState() != Call.STATE_ACTIVE) { 174 return; 175 } 176 updateBody(primaryCall); 177 mHandler.postDelayed(this /* runnable */, DateUtils.SECOND_IN_MILLIS); 178 } 179 }; 180 updateBody(UiCall primaryCall)181 private void updateBody(UiCall primaryCall) { 182 String callInfoText = TelecomUtils.getCallInfoText(getContext(), 183 primaryCall, mCallInfoLabel); 184 mUserProfileBodyText.setText(callInfoText); 185 mUserProfileBodyText.setVisibility( 186 TextUtils.isEmpty(callInfoText) ? View.GONE : View.VISIBLE); 187 } 188 } 189