Revert "fmapp2: remove audio mute & headphone/speaker toggle"

This reverts commit 0f3b06671e23bd5bde7f496fd18351ab75521017.

With backported changes to hardware/qcom/audio this functionality is
working again.

Change-Id: If3d79eefafeb79256108fd1ed84a60c85140322c
diff --git a/fmapp2/res/layout/action_bar.xml b/fmapp2/res/layout/action_bar.xml
index f22cf95..75c8628 100644
--- a/fmapp2/res/layout/action_bar.xml
+++ b/fmapp2/res/layout/action_bar.xml
@@ -23,4 +23,26 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content" />
 
+    <Space
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"/>
+
+    <ImageView android:id="@+id/btn_silent"
+        android:src="@drawable/ic_silent_mode_off"
+        android:layout_toLeftOf="@+id/btn_speaker_earphone"
+        android:layout_width="wrap_content"
+        android:layout_marginRight="10dp"
+        android:clickable="true"
+        android:focusable="true"
+        android:layout_height="wrap_content" />
+
+    <ImageView android:id="@+id/btn_speaker_earphone"
+        android:src="@drawable/btn_earphone"
+        android:layout_alignParentRight="true"
+        android:clickable="true"
+        android:focusable="true"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
 </LinearLayout>
diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 0e626a8..c962b64 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -197,6 +197,8 @@
 
    /* Button Resources */
    private ImageView mOnOffButton;
+   private ImageView mMuteButton;
+   private ImageView mSpeakerButton;
    /* Button to navigate Preset pages */
    private ImageButton mPresetPageButton;
    /* 6 Preset Buttons */
@@ -328,6 +330,16 @@
       mAnimation = AnimationUtils.loadAnimation(this,
                                                 R.anim.preset_select);
 
+      mMuteButton = (ImageView)findViewById(R.id.btn_silent);
+      if (mMuteButton != null) {
+          mMuteButton.setOnClickListener(mMuteModeClickListener);
+      }
+
+      mSpeakerButton = (ImageView)findViewById(R.id.btn_speaker_earphone);
+      if (mSpeakerButton != null) {
+          mSpeakerButton.setOnClickListener(mSpeakerClickListener);
+      }
+
       mOnOffButton = (ImageView)findViewById(R.id.btn_onoff);
       if (mOnOffButton != null) {
           mOnOffButton.setOnClickListener(mTurnOnOffClickListener);
@@ -796,6 +808,27 @@
       return super.onOptionsItemSelected(item);
    }
 
+   private void enableSpeaker() {
+       //This method with toggle Speaker phone based on existing state .
+       boolean bSpeakerPhoneOn = isSpeakerEnabled();
+       if(mService != null) {
+           try {
+               if (bSpeakerPhoneOn) {  // as Speaker is already on turn it off.
+                   mService.enableSpeaker(false);
+                   Log.d(LOGTAG, "Speaker phone is  turned off");
+                   mSpeakerButton.setImageResource(R.drawable.btn_earphone);
+               }else { // as Speaker is off turn it on.
+                   mService.enableSpeaker(true);
+                   Log.d(LOGTAG, "Speaker phone is turned on");
+                   mSpeakerButton.setImageResource(R.drawable.btn_speaker);
+               }
+               invalidateOptionsMenu();
+           }catch (RemoteException e) {
+               e.printStackTrace();
+           }
+       }
+   }
+
    private static final int RECORDTIMER_EXPIRED = 0x1003;
    private static final int RECORDTIMER_UPDATE = 0x1004;
 
@@ -1502,6 +1535,54 @@
         }
    };
 
+    private View.OnClickListener mSpeakerClickListener =
+        new View.OnClickListener() {
+          @Override
+          public void onClick(View v) {
+             mSpeakerButton.setClickable(false);
+             mSpeakerButton.setOnClickListener(null);
+             mHandler.removeCallbacks(mEnableRadioTask);
+             mHandler.postDelayed(mEnableSpeakerTask, 0);
+          }
+    };
+
+   private Runnable mEnableSpeakerTask = new Runnable() {
+     public void run() {
+       enableSpeaker();
+       mSpeakerButton.setClickable(true);
+       mSpeakerButton.setOnClickListener(mSpeakerClickListener);
+     }
+   };
+
+   private View.OnClickListener mMuteModeClickListener =
+      new View.OnClickListener() {
+        public void onClick(View v) {
+           boolean bStatus = false;
+           if (mService != null) {
+              try {
+               if (true == isMuted()) {
+                   bStatus = mService.unMute();
+               }else {
+                   bStatus = mService.mute();
+               }
+               if (bStatus) {
+                   setMuteModeButtonImage(true);
+                   v.startAnimation(mAnimation);
+               }else {
+                   mCommandFailed = CMD_MUTE;
+                   if(isCallActive()) {
+                      showDialog(DIALOG_CMD_FAILED_CALL_ON);
+                   }else {
+                      showDialog(DIALOG_CMD_FAILED);
+                   }
+               }
+              }catch (RemoteException e) {
+                e.printStackTrace();
+              }
+           }
+      }
+   };
+
    private View.OnClickListener mRecordButtonListener =
       new View.OnClickListener() {
         public void onClick(View v) {
@@ -1559,6 +1640,22 @@
       }
    }
 
+   private void setMuteModeButtonImage(boolean notify) {
+      String fmMutedString;
+      if (isMuted() == true) {
+         mMuteButton.setImageResource(R.drawable.ic_silent_mode);
+         fmMutedString = "FM Radio Muted";
+      }else {
+         /* Find a icon for Stations */
+         mMuteButton.setImageResource(R.drawable.ic_silent_mode_off);
+         fmMutedString = "FM Radio Playing";
+      }
+      if (notify) {
+         //Toast.makeText(this, fmMutedString, Toast.LENGTH_SHORT).show();
+         Log.d(LOGTAG, fmMutedString);
+      }
+   }
+
    private void enableRadio() {
       mIsScaning = false;
       mIsSeeking = false;
@@ -1841,6 +1938,10 @@
    }
 
    private void enableRadioOnOffUI(boolean bEnable) {
+      if (mMuteButton != null) {
+          mMuteButton.setEnabled(bEnable);
+          setMuteModeButtonImage(false);
+      }
       if (bEnable) {
          mFmSeeker.setVisibility(View.VISIBLE);
          if (mRadioTextScroller != null) {
@@ -1978,6 +2079,18 @@
          mPresetPageButton.setEnabled(bEnable &&
                                    (FmSharedPreferences.getListStationCount() >= MAX_PRESETS_PER_PAGE));
       }
+      if(mSpeakerButton != null) {
+        mSpeakerButton.setEnabled(bEnable);
+        if (bEnable) {
+            if(isSpeakerEnabled()) {
+               mSpeakerButton.setImageResource(R.drawable.btn_speaker);
+            }else {
+               mSpeakerButton.setImageResource(R.drawable.btn_earphone);
+            }
+        }else{
+            mSpeakerButton.setImageResource(R.drawable.btn_earphone);
+        }
+      }
    }
 
    private void resetSearchProgress() {
@@ -2183,8 +2296,10 @@
       Log.d(LOGTAG, "A2DPConnectionState with: " + state);
       if (state) {
           Log.d(LOGTAG, "A2DP connected, set button to speaker");
+          mSpeakerButton.setImageResource(R.drawable.btn_speaker);
       } else {
           Log.d(LOGTAG, "A2DP dis-connected, set button to earphone");
+          mSpeakerButton.setImageResource(R.drawable.btn_earphone);
       }
    }
    /** Scan related */
@@ -2642,6 +2757,12 @@
       }
    };
 
+   Runnable mOnMute = new Runnable() {
+      public void run() {
+         setMuteModeButtonImage(true);
+      }
+   };
+
    Runnable mOnStereo = new Runnable() {
       public void run() {
          if (FMRADIO_UI_STATION_AUDIO_STEREO == mStereo) {
@@ -3105,6 +3226,7 @@
       }
       public void onMute(boolean bMuted) {
          Log.d(LOGTAG, "mServiceCallbacks.onMute :" + bMuted);
+         mHandler.post(mOnMute);
       }
       public void onAudioUpdate(boolean bStereo) {
          if((bStereo) && (FmSharedPreferences.getAudioOutputMode())) {
@@ -3153,9 +3275,13 @@
       }
       public void onFmAudioPathStarted() {
           Log.d(LOGTAG, "mServiceCallbacks.onFmAudioPathStarted:");
+          mSpeakerButton.setClickable(true);
+          mMuteButton.setClickable(true);
       }
       public void onFmAudioPathStopped() {
           Log.d(LOGTAG, "mServiceCallbacks.onFmAudioPathStopped:");
+          mSpeakerButton.setClickable(false);
+          mMuteButton.setClickable(false);
       }
       /* Not used in FmRadio */
       public void getSigThCb(int val, int status) {