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