• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2016, 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.overview;
17 
18 import android.app.PendingIntent;
19 import android.content.Context;
20 import android.graphics.Color;
21 import android.telecom.Call;
22 import android.util.Log;
23 import android.view.View;
24 import android.widget.Chronometer;
25 import android.widget.ImageButton;
26 import android.widget.ImageView;
27 import android.widget.TextView;
28 import com.android.car.overview.utils.BitmapUtils;
29 import com.android.car.stream.CurrentCallExtension;
30 import com.android.car.stream.StreamCard;
31 
32 /**
33  * A {@link StreamViewHolder} that binds a {@link CurrentCallExtension} to
34  * an interactive in call UI.
35  */
36 public class CurrentCallStreamViewHolder extends StreamViewHolder {
37     private static final String TAG = "CurrentCallStreamVH";
38 
39     private final ImageView mBackgroundImage;
40     private final TextView mDisplayNameTextView;
41 
42     private final TextView mCallStateTextView;
43     private final Chronometer mTimerView;
44 
45     private final OverviewFabButton mCallActionButton;
46     private final ImageButton mMuteActionButton;
47 
48     private PendingIntent mCallAction;
49     private PendingIntent mMuteAction;
50     private PendingIntent mContainerClickAction;
51 
CurrentCallStreamViewHolder(Context context, View itemView)52     public CurrentCallStreamViewHolder(Context context, View itemView) {
53         super(context, itemView);
54 
55         mBackgroundImage = (ImageView) itemView.findViewById(R.id.background_image);
56         mDisplayNameTextView = (TextView) itemView.findViewById(R.id.display_name);
57         mCallStateTextView = (TextView) itemView.findViewById(R.id.call_state);
58         mTimerView = (Chronometer) itemView.findViewById(R.id.timer);
59 
60         mCallActionButton = (OverviewFabButton) itemView.findViewById(R.id.call_button);
61         mMuteActionButton = (ImageButton) itemView.findViewById(R.id.mute_button);
62 
63         mCallActionButton.setAccentColor(Color.RED);
64         mCallActionButton.setOnClickListener(new View.OnClickListener() {
65             @Override
66             public void onClick(View v) {
67                 if (mCallAction == null) {
68                     return;
69                 }
70                 try {
71                     mCallAction.send(mContext, 0 /* resultCode */, null /* intent */);
72                 } catch (PendingIntent.CanceledException e) {
73                     Log.e(TAG, "Failed to send call action pending intent", e);
74                 }
75             }
76         });
77 
78         mMuteActionButton.setOnClickListener(new View.OnClickListener() {
79             @Override
80             public void onClick(View v) {
81                 if (mMuteAction == null) {
82                     return;
83                 }
84                 try {
85                     mMuteAction.send(mContext, 0 /* resultCode */, null /* intent */);
86                 } catch (PendingIntent.CanceledException e) {
87                     Log.e(TAG, "Failed to send mute action pending intent", e);
88                 }
89             }
90         });
91 
92         mActionContainer.setOnClickListener(new View.OnClickListener() {
93             @Override
94             public void onClick(View v) {
95                 if (mContainerClickAction == null) {
96                     return;
97                 }
98                 try {
99                     mContainerClickAction.send(mContext, 0 /* resultCode */, null /* intent */);
100                 } catch (PendingIntent.CanceledException e) {
101                     Log.e(TAG, "Failed to send call action pending intent", e);
102                 }
103             }
104         });
105     }
106 
107     @Override
bindStreamCard(StreamCard card)108     public void bindStreamCard(StreamCard card) {
109         super.bindStreamCard(card);
110 
111         if (!(card.getCardExtension() instanceof CurrentCallExtension)) {
112             Log.e(TAG, "StreamCard does not contain a CurrentCallExtension");
113             return;
114         }
115 
116         mContainerClickAction = card.getContentPendingIntent();
117 
118         CurrentCallExtension call = (CurrentCallExtension) card.getCardExtension();
119         int callState = call.getCallState();
120 
121         mDisplayNameTextView.setText(call.getDisplayName());
122         mCallStateTextView.setText(getCallState(mContext, callState));
123 
124         // For active calls set up mute button and timer view.
125         if (callState == Call.STATE_ACTIVE) {
126             mTimerView.setVisibility(View.VISIBLE);
127             mTimerView.setBase(call.getCallStartTime());
128             mTimerView.start();
129 
130             int muteIconRes = call.isMuted() ? R.drawable.ic_mic_muted : R.drawable.ic_mic;
131             mMuteActionButton.setVisibility(View.VISIBLE);
132             mMuteActionButton.setImageResource(muteIconRes);
133             mMuteAction = call.isMuted() ? call.getUnMuteAction() : call.getMuteAction();
134         }
135 
136         // Setup the call button.
137         if (callState == Call.STATE_DIALING || callState == Call.STATE_ACTIVE
138                 || callState == Call.STATE_RINGING) {
139             mCallActionButton.setVisibility(View.VISIBLE);
140             mCallActionButton.setImageResource(R.drawable.ic_phone_hangup);
141 
142             if (callState == Call.STATE_RINGING) {
143                 mCallAction = call.getAcceptCallAction();
144             } else {
145                 mCallAction = call.getHangupCallAction();
146             }
147         }
148 
149         if (call.getContactPhoto() != null) {
150             mBackgroundImage
151                     .setImageBitmap(BitmapUtils.applySaturation(call.getContactPhoto(), 01.f));
152         }
153     }
154 
getCallState(Context context, int state)155     private String getCallState(Context context, int state) {
156         switch (state) {
157             case Call.STATE_ACTIVE:
158                 return context.getString(R.string.ongoing_call);
159             case Call.STATE_DIALING:
160                 return context.getString(R.string.dialing_call);
161             case Call.STATE_DISCONNECTING:
162                 return context.getString(R.string.disconnecting_call);
163             case Call.STATE_RINGING:
164                 return context.getString(R.string.notification_incoming_call);
165             default:
166                 return context.getString(R.string.unknown);
167         }
168     }
169 
170     @Override
resetViews()171     protected void resetViews() {
172         mBackgroundImage.setImageBitmap(null);
173         mDisplayNameTextView.setText(null);
174         mCallStateTextView.setText(null);
175 
176         mTimerView.setText(null);
177         mTimerView.setVisibility(View.INVISIBLE);
178 
179         mCallActionButton.setImageBitmap(null);
180         mCallActionButton.setVisibility(View.INVISIBLE);
181 
182         mMuteActionButton.setImageBitmap(null);
183         mMuteActionButton.setVisibility(View.INVISIBLE);
184 
185         mCallAction = null;
186         mMuteAction = null;
187     }
188 }
189