package com.android.systemui.statusbar; import android.app.StatusBarManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.AudioManager; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.Slog; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; import android.widget.Chronometer; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.android.internal.telephony.CallManager; import com.android.internal.telephony.ITelephony; import com.android.systemui.R; public class CallWidget extends LinearLayout implements OnClickListener { private static final FrameLayout.LayoutParams WIDGET_LAYOUT_PARAMS = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, // width = match_parent ViewGroup.LayoutParams.WRAP_CONTENT // height = wrap_content ); private static final LinearLayout.LayoutParams BUTTON_LAYOUT_PARAMS = new LinearLayout.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, // width = wrap_content ViewGroup.LayoutParams.MATCH_PARENT, // height = match_parent 2.0f // weight = 1 ); public Button mPhoneButton; public Button mMuteOn; public Button mMuteOff; public Button mSpeakerOn; public Button mSpeakerOff; public Button mEndCallButton; private Chronometer mTimer; ITelephony phone; TelephonyManager telephony; AudioManager am; CallManager mCM; private StatusBarManager mStatusBar; private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); switch (state) { case TelephonyManager.CALL_STATE_RINGING: mMuteOn.setEnabled(false); mMuteOff.setEnabled(false); mTimer.setVisibility(View.GONE); hideMusic(); show(); break; case TelephonyManager.CALL_STATE_OFFHOOK: mMuteOn.setEnabled(true); mMuteOff.setEnabled(true); show(); hideMusic(); mTimer.setVisibility(View.VISIBLE); mTimer.setBase(SystemClock.elapsedRealtime()); mTimer.start(); break; case TelephonyManager.CALL_STATE_IDLE: hide(); showMusic(); mTimer.setVisibility(View.GONE); mMuteOn.setEnabled(true); mMuteOff.setEnabled(true); break; } updateWidget(); } }; private LayoutInflater mInflater; private static String TAG = "CallWidget"; private CallHandler mHandler = new CallHandler(); public CallWidget(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); hide(); Slog.i(TAG, "Creating call widget from XML"); mStatusBar = (StatusBarManager) context.getSystemService(Context.STATUS_BAR_SERVICE); telephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); setupButtons(); IntentFilter filter = new IntentFilter(); filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); context.registerReceiver(new PhoneStateReceiver(), filter); } protected void showMusic() { mContext.sendOrderedBroadcast(new Intent(MusicControls.CALL_ENDED_INTENT), null); } protected void hideMusic() { mContext.sendOrderedBroadcast(new Intent(MusicControls.CALL_STARTED_INTENT), null); } public void setupButtons() { Slog.i(TAG, "Setting up call widget"); View callView = mInflater.inflate(R.layout.call_ongoing, null, false); addView(callView, BUTTON_LAYOUT_PARAMS); mPhoneButton = (Button) findViewById(R.id.ongoing_call_button); mPhoneButton.setOnClickListener(this); mMuteOff = (Button) findViewById(R.id.quickpanel_call_mute_off); mMuteOff.setOnClickListener(this); mMuteOn = (Button) findViewById(R.id.quickpanel_call_mute_on); mMuteOn.setOnClickListener(this); mSpeakerOff = (Button) findViewById(R.id.quickpanel_call_speaker_off); mSpeakerOff.setOnClickListener(this); mSpeakerOn = (Button) findViewById(R.id.quickpanel_call_speaker_on); mSpeakerOn.setOnClickListener(this); mEndCallButton = (Button) findViewById(R.id.quickpanel_call_end); mEndCallButton.setOnClickListener(this); mTimer = (Chronometer) findViewById(R.id.quickpanel_time); } public void updateWidget() { am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); if (am.isSpeakerphoneOn()) { Slog.i(TAG, "Speaker is on"); mSpeakerOn.setVisibility(View.VISIBLE); mSpeakerOff.setVisibility(View.GONE); } else { Slog.i(TAG, "Speaker is off"); mSpeakerOff.setVisibility(View.VISIBLE); mSpeakerOn.setVisibility(View.GONE); } if (am.isMicrophoneMute()) { mMuteOn.setVisibility(View.VISIBLE); mMuteOff.setVisibility(View.GONE); } else { mMuteOff.setVisibility(View.VISIBLE); mMuteOn.setVisibility(View.GONE); } // mSpeakerPhoneButton.setChecked(am.isSpeakerphoneOn()); // mMuteButton.setChecked(am.isMicrophoneMute()); } public void show() { Slog.i(TAG, "Show call widget"); setVisibility(View.VISIBLE); if (mTimer != null) { mTimer.setVisibility(View.VISIBLE); } } public void hide() { Slog.i(TAG, "Hide call widget"); setVisibility(View.GONE); if (mTimer != null) { mTimer.stop(); mTimer.setVisibility(View.GONE); } } class PhoneStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { telephony.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); } } private static final int ACTION_HANGUP = 10; private static final int ACTION_UPDATE = 11; private static final int ACTION_MUTE = 12; private static final int ACTION_SPEAKER = 13; private static final int ACTION_SHOW_SCREEN = 14; private class CallHandler extends Handler { public void handleMessage(Message m) { switch (m.what) { case ACTION_HANGUP: mContext.sendOrderedBroadcast(new Intent("com.android.phone.END"), null); break; case ACTION_UPDATE: updateWidget(); break; case ACTION_MUTE: mContext.sendOrderedBroadcast(new Intent("com.android.phone.MUTE"), null); break; case ACTION_SPEAKER: mContext.sendOrderedBroadcast(new Intent("com.android.phone.SPEAKER"), null); break; case ACTION_SHOW_SCREEN: mContext.sendOrderedBroadcast(new Intent("com.android.phone.SHOW_SCREEN"), null); break; } } } @Override public void onClick(View v) { if (v == mPhoneButton) { mHandler.sendEmptyMessage(ACTION_SHOW_SCREEN); } else if (v == mEndCallButton) { mHandler.sendEmptyMessage(ACTION_HANGUP); } else if (v == mMuteOff) { mHandler.sendEmptyMessage(ACTION_MUTE); mMuteOff.setVisibility(View.GONE); mMuteOn.setVisibility(View.VISIBLE); } else if (v == mMuteOn) { mHandler.sendEmptyMessage(ACTION_MUTE); mMuteOn.setVisibility(View.GONE); mMuteOff.setVisibility(View.VISIBLE); } else if (v == mSpeakerOff) { mHandler.sendEmptyMessage(ACTION_SPEAKER); mSpeakerOff.setVisibility(View.GONE); mSpeakerOn.setVisibility(View.VISIBLE); } else if (v == mSpeakerOn) { mHandler.sendEmptyMessage(ACTION_SPEAKER); mSpeakerOn.setVisibility(View.GONE); mSpeakerOff.setVisibility(View.VISIBLE); } mHandler.sendEmptyMessageDelayed(ACTION_UPDATE, 1000); } }