1eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen/*
2eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Copyright (C) 2014 The Android Open Source Project
3eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *
4eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Licensed under the Apache License, Version 2.0 (the "License");
5eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * you may not use this file except in compliance with the License.
6eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * You may obtain a copy of the License at
7eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *
8eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *      http://www.apache.org/licenses/LICENSE-2.0
9eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen *
10eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Unless required by applicable law or agreed to in writing, software
11eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * distributed under the License is distributed on an "AS IS" BASIS,
12eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * See the License for the specific language governing permissions and
14eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * limitations under the License.
15eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen */
16eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
17eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenpackage com.android.server.telecom;
18eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
19eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport android.app.StatusBarManager;
20eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport android.content.Context;
21eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport android.telecom.Log;
22eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
23eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenimport com.android.internal.annotations.VisibleForTesting;
24eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
25eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen// TODO: Needed for move to system service: import com.android.internal.R;
262038a4aa1d8bc0a65cbb9a21911722ebe504e0c1Tyler Gunn
27eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen/**
28eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen * Manages the special status bar notifications used by the phone app.
29eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen */
30eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen@VisibleForTesting
31eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohenpublic class StatusBarNotifier extends CallsManagerListenerBase {
32eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private static final String SLOT_MUTE = "mute";
33eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private static final String SLOT_SPEAKERPHONE = "speakerphone";
34eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
35eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private final Context mContext;
36eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private final CallsManager mCallsManager;
37eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private final StatusBarManager mStatusBarManager;
38eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
39eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private boolean mIsShowingMute;
40eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    private boolean mIsShowingSpeakerphone;
41eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
42eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    StatusBarNotifier(Context context, CallsManager callsManager) {
43eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        mContext = context;
44eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        mCallsManager = callsManager;
45eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        mStatusBarManager = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE);
46eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
47eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
48eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    /** ${inheritDoc} */
49eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    @Override
50eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    public void onCallRemoved(Call call) {
51eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        if (!mCallsManager.hasAnyCalls()) {
52eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            notifyMute(false);
53eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            notifySpeakerphone(false);
54eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
55eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
56eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
57eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    @VisibleForTesting
58eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    public void notifyMute(boolean isMuted) {
59eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // Never display anything if there are no calls.
60eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        if (!mCallsManager.hasAnyCalls()) {
61eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            isMuted = false;
62eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
63eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
64eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        if (mIsShowingMute == isMuted) {
65eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return;
66eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
67eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
68eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        Log.d(this, "Mute status bar icon being set to %b", isMuted);
69eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
70ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak        if (isMuted) {
71ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak            mStatusBarManager.setIcon(
72ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak                    SLOT_MUTE,
73ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak                    android.R.drawable.stat_notify_call_mute,
74ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak                    0,  /* iconLevel */
75ce41017a51d0ecf6e0e2059011f21ec68f33771aPavel Zhamaitsiak                    mContext.getString(R.string.accessibility_call_muted));
76eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        } else {
77eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            mStatusBarManager.removeIcon(SLOT_MUTE);
78eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
79eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        mIsShowingMute = isMuted;
80eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
81eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
82eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    @VisibleForTesting
83eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    public void notifySpeakerphone(boolean isSpeakerphone) {
84eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        // Never display anything if there are no calls.
85eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        if (!mCallsManager.hasAnyCalls()) {
86eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            isSpeakerphone = false;
87eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
88eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
89eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        if (mIsShowingSpeakerphone == isSpeakerphone) {
90eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            return;
91eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
92eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
93eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        Log.d(this, "Speakerphone status bar icon being set to %b", isSpeakerphone);
94eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen
95eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        if (isSpeakerphone) {
96eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            mStatusBarManager.setIcon(
97eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                    SLOT_SPEAKERPHONE,
98eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                    android.R.drawable.stat_sys_speakerphone,
99eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                    0,  /* iconLevel */
100eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen                    mContext.getString(R.string.accessibility_speakerphone_enabled));
101eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        } else {
102eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen            mStatusBarManager.removeIcon(SLOT_SPEAKERPHONE);
103eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        }
104eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen        mIsShowingSpeakerphone = isSpeakerphone;
105eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen    }
106eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen}
107eea3d44c049ec27c98c531b5f05b1c2d267cba73Etan Cohen