• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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