CurrentCallStreamViewHolder.java revision 87061df379ddeaf474b98f06cd778335adf8cf23
187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer/* 287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * Copyright (c) 2016, The Android Open Source Project 387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * 487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * Licensed under the Apache License, Version 2.0 (the "License"); 587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * you may not use this file except in compliance with the License. 687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * You may obtain a copy of the License at 787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * 887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * http://www.apache.org/licenses/LICENSE-2.0 987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * 1087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * Unless required by applicable law or agreed to in writing, software 1187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * distributed under the License is distributed on an "AS IS" BASIS, 1287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * See the License for the specific language governing permissions and 1487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * limitations under the License. 1587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer */ 1687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerpackage com.android.car.overview; 1787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 1887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.app.PendingIntent; 1987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.content.Context; 2087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.graphics.Color; 2187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.telecom.Call; 2287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.util.Log; 2387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.view.View; 2487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.widget.Chronometer; 2587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.widget.ImageButton; 2687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.widget.ImageView; 2787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport android.widget.TextView; 2887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport com.android.car.overview.utils.BitmapUtils; 2987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport com.android.car.stream.CurrentCallExtension; 3087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerimport com.android.car.stream.StreamCard; 3187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 3287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer/** 3387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * A {@link StreamViewHolder} that binds a {@link CurrentCallExtension} to 3487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer * an interactive in call UI. 3587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer */ 3687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyerpublic class CurrentCallStreamViewHolder extends StreamViewHolder { 3787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private static final String TAG = "CurrentCallStreamVH"; 3887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 3987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private final ImageView mBackgroundImage; 4087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private final TextView mDisplayNameTextView; 4187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 4287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private final TextView mCallStateTextView; 4387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private final Chronometer mTimerView; 4487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 4587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private final OverviewFabButton mCallActionButton; 4687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private final ImageButton mMuteActionButton; 4787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 4887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private PendingIntent mCallAction; 4987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private PendingIntent mMuteAction; 5087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private PendingIntent mContainerClickAction; 5187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 5287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer public CurrentCallStreamViewHolder(Context context, View itemView) { 5387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer super(context, itemView); 5487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 5587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mBackgroundImage = (ImageView) itemView.findViewById(R.id.background_image); 5687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mDisplayNameTextView = (TextView) itemView.findViewById(R.id.display_name); 5787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallStateTextView = (TextView) itemView.findViewById(R.id.call_state); 5887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mTimerView = (Chronometer) itemView.findViewById(R.id.timer); 5987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 6087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallActionButton = (OverviewFabButton) itemView.findViewById(R.id.call_button); 6187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteActionButton = (ImageButton) itemView.findViewById(R.id.mute_button); 6287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 6387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallActionButton.setAccentColor(Color.RED); 6487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallActionButton.setOnClickListener(new View.OnClickListener() { 6587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer @Override 6687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer public void onClick(View v) { 6787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (mCallAction == null) { 6887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return; 6987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 7087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer try { 7187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallAction.send(mContext, 0 /* resultCode */, null /* intent */); 7287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } catch (PendingIntent.CanceledException e) { 7387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer Log.e(TAG, "Failed to send call action pending intent", e); 7487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 7587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 7687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer }); 7787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 7887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteActionButton.setOnClickListener(new View.OnClickListener() { 7987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer @Override 8087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer public void onClick(View v) { 8187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (mMuteAction == null) { 8287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return; 8387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 8487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer try { 8587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteAction.send(mContext, 0 /* resultCode */, null /* intent */); 8687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } catch (PendingIntent.CanceledException e) { 8787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer Log.e(TAG, "Failed to send mute action pending intent", e); 8887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 8987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 9087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer }); 9187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 9287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mActionContainer.setOnClickListener(new View.OnClickListener() { 9387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer @Override 9487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer public void onClick(View v) { 9587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (mContainerClickAction == null) { 9687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return; 9787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 9887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer try { 9987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mContainerClickAction.send(mContext, 0 /* resultCode */, null /* intent */); 10087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } catch (PendingIntent.CanceledException e) { 10187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer Log.e(TAG, "Failed to send call action pending intent", e); 10287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 10387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 10487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer }); 10587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 10687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 10787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer @Override 10887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer public void bindStreamCard(StreamCard card) { 10987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer super.bindStreamCard(card); 11087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 11187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (!(card.getCardExtension() instanceof CurrentCallExtension)) { 11287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer Log.e(TAG, "StreamCard does not contain a CurrentCallExtension"); 11387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return; 11487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 11587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 11687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mContainerClickAction = card.getContentPendingIntent(); 11787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 11887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer CurrentCallExtension call = (CurrentCallExtension) card.getCardExtension(); 11987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer int callState = call.getCallState(); 12087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 12187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mDisplayNameTextView.setText(call.getDisplayName()); 12287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallStateTextView.setText(getCallState(mContext, callState)); 12387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 12487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer // For active calls set up mute button and timer view. 12587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (callState == Call.STATE_ACTIVE) { 12687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mTimerView.setVisibility(View.VISIBLE); 12787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mTimerView.setBase(call.getCallStartTime()); 12887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mTimerView.start(); 12987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 13087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer int muteIconRes = call.isMuted() ? R.drawable.ic_mic_muted : R.drawable.ic_mic; 13187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteActionButton.setVisibility(View.VISIBLE); 13287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteActionButton.setImageResource(muteIconRes); 13387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteAction = call.isMuted() ? call.getUnMuteAction() : call.getMuteAction(); 13487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 13587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 13687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer // Setup the call button. 13787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (callState == Call.STATE_DIALING || callState == Call.STATE_ACTIVE 13887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer || callState == Call.STATE_RINGING) { 13987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallActionButton.setVisibility(View.VISIBLE); 14087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallActionButton.setImageResource(R.drawable.ic_phone_hangup); 14187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 14287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (callState == Call.STATE_RINGING) { 14387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallAction = call.getAcceptCallAction(); 14487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } else { 14587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallAction = call.getHangupCallAction(); 14687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 14787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 14887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 14987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer if (call.getContactPhoto() != null) { 15087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mBackgroundImage 15187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer .setImageBitmap(BitmapUtils.applySaturation(call.getContactPhoto(), 01.f)); 15287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 15387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 15487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 15587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer private String getCallState(Context context, int state) { 15687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer switch (state) { 15787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer case Call.STATE_ACTIVE: 15887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return context.getString(R.string.ongoing_call); 15987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer case Call.STATE_DIALING: 16087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return context.getString(R.string.dialing_call); 16187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer case Call.STATE_DISCONNECTING: 16287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return context.getString(R.string.disconnecting_call); 16387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer case Call.STATE_RINGING: 16487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return context.getString(R.string.notification_incoming_call); 16587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer default: 16687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer return context.getString(R.string.unknown); 16787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 16887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 16987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 17087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer @Override 17187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer protected void resetViews() { 17287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mBackgroundImage.setImageBitmap(null); 17387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mDisplayNameTextView.setText(null); 17487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallStateTextView.setText(null); 17587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 17687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mTimerView.setText(null); 17787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mTimerView.setVisibility(View.INVISIBLE); 17887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 17987061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallActionButton.setImageBitmap(null); 18087061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallActionButton.setVisibility(View.INVISIBLE); 18187061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 18287061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteActionButton.setImageBitmap(null); 18387061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteActionButton.setVisibility(View.INVISIBLE); 18487061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer 18587061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mCallAction = null; 18687061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer mMuteAction = null; 18787061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer } 18887061df379ddeaf474b98f06cd778335adf8cf23Rakesh Iyer} 189