Merge "Cleanup CarAudioService - part 2"
diff --git a/car-lib/api/current.txt b/car-lib/api/current.txt
index d7e1fa8..b14948c 100644
--- a/car-lib/api/current.txt
+++ b/car-lib/api/current.txt
@@ -278,12 +278,10 @@
 package android.car.media {
 
   public final class CarAudioManager {
-    method public void abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
     method public android.media.AudioAttributes getAudioAttributesForCarUsage(int) throws android.car.CarNotConnectedException;
     method public int getUsageMaxVolume(int) throws android.car.CarNotConnectedException;
     method public int getUsageMinVolume(int) throws android.car.CarNotConnectedException;
     method public int getUsageVolume(int) throws android.car.CarNotConnectedException;
-    method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int) throws android.car.CarNotConnectedException, java.lang.IllegalArgumentException;
     method public void setUsageVolume(int, int, int) throws android.car.CarNotConnectedException;
     field public static final int CAR_AUDIO_USAGE_ALARM = 6; // 0x6
     field public static final int CAR_AUDIO_USAGE_DEFAULT = 0; // 0x0
diff --git a/car-lib/src/android/car/media/CarAudioManager.java b/car-lib/src/android/car/media/CarAudioManager.java
index 5e11666..1953937 100644
--- a/car-lib/src/android/car/media/CarAudioManager.java
+++ b/car-lib/src/android/car/media/CarAudioManager.java
@@ -22,8 +22,6 @@
 import android.car.CarNotConnectedException;
 import android.content.Context;
 import android.media.AudioAttributes;
-import android.media.AudioManager;
-import android.media.AudioManager.OnAudioFocusChangeListener;
 import android.media.IVolumeController;
 import android.os.Handler;
 import android.os.IBinder;
@@ -125,7 +123,6 @@
     public static final String CAR_EXTERNAL_SOURCE_TYPE_EXT_SAFETY_ALERT = "EXT_SAFETY_ALERT";
 
     private final ICarAudio mService;
-    private final AudioManager mAudioManager;
 
     /**
      * Get {@link AudioAttributes} relevant for the given usage in car.
@@ -142,103 +139,9 @@
     }
 
     /**
-     * Get AudioAttributes for radio. This is necessary when there are multiple types of radio
-     * in system.
-     *
-     * @param radioType String specifying the desired radio type. Should use only what is listed in
-     *        {@link #getSupportedRadioTypes()}.
-     * @return
-     * @throws IllegalArgumentException If not supported type is passed.
-     *
-     * @hide
-     */
-    public AudioAttributes getAudioAttributesForRadio(String radioType)
-            throws CarNotConnectedException, IllegalArgumentException {
-        try {
-            return mService.getAudioAttributesForRadio(radioType);
-        } catch (RemoteException e) {
-            throw new CarNotConnectedException();
-        }
-    }
-
-    /**
-     * Get AudioAttributes for external audio source.
-     *
-     * @param externalSourceType String specifying the desired source type. Should use only what is
-     *        listed in {@link #getSupportedExternalSourceTypes()}.
-     * @return
-     * @throws IllegalArgumentException If not supported type is passed.
-     *
-     * @hide
-     */
-    public AudioAttributes getAudioAttributesForExternalSource(String externalSourceType)
-            throws CarNotConnectedException, IllegalArgumentException {
-        try {
-            return mService.getAudioAttributesForExternalSource(externalSourceType);
-        } catch (RemoteException e) {
-            throw new CarNotConnectedException();
-        }
-    }
-
-    /**
-     * List all supported external audio sources.
-     *
-     * @return
-     *
-     * @hide
-     */
-    public String[] getSupportedExternalSourceTypes() throws CarNotConnectedException {
-        try {
-            return mService.getSupportedExternalSourceTypes();
-        } catch (RemoteException e) {
-            throw new CarNotConnectedException();
-        }
-    }
-
-    /**
-     * List all supported radio sources.
-     *
-     * @return
-     *
-     * @hide
-     */
-    public String[] getSupportedRadioTypes() throws CarNotConnectedException {
-        try {
-            return mService.getSupportedRadioTypes();
-        } catch (RemoteException e) {
-            throw new CarNotConnectedException();
-        }
-    }
-
-    /**
-     * Request audio focus.
-     * Send a request to obtain the audio focus.
-     * @param l
-     * @param requestAttributes
-     * @param durationHint
-     * @param flags
-     */
-    public int requestAudioFocus(OnAudioFocusChangeListener l,
-                                 AudioAttributes requestAttributes,
-                                 int durationHint,
-                                 int flags)
-                                         throws CarNotConnectedException, IllegalArgumentException {
-        return mAudioManager.requestAudioFocus(l, requestAttributes, durationHint, flags);
-    }
-
-    /**
-     * Abandon audio focus. Causes the previous focus owner, if any, to receive focus.
-     * @param l
-     * @param aa
-     */
-    public void abandonAudioFocus(OnAudioFocusChangeListener l, AudioAttributes aa) {
-        mAudioManager.abandonAudioFocus(l, aa);
-    }
-
-    /**
      * Sets the volume index for a particular usage.
      *
-     * Requires {@link android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
+     * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
      *
      * @param carUsage The car audio usage whose volume index should be set.
      * @param index The volume index to set. See
@@ -260,7 +163,7 @@
     /**
      * Registers a global volume controller interface.
      *
-     * Requires {@link android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
+     * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
      *
      * @hide
      */
@@ -278,7 +181,7 @@
     /**
      * Returns the maximum volume index for a particular usage.
      *
-     * Requires {@link android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
+     * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
      *
      * @param carUsage The car audio usage whose maximum volume index is returned.
      * @return The maximum valid volume index for the usage.
@@ -296,7 +199,7 @@
     /**
      * Returns the minimum volume index for a particular usage.
      *
-     * Requires {@link android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
+     * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
      *
      * @param carUsage The car audio usage whose maximum volume index is returned.
      * @return The maximum valid volume index for the usage.
@@ -314,7 +217,7 @@
     /**
      * Returns the current volume index for a particular usage.
      *
-     * Requires {@link android.car.Car.PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
+     * Requires {@link android.car.Car#PERMISSION_CAR_CONTROL_AUDIO_VOLUME} permission.
      *
      * @param carUsage The car audio usage whose volume index is returned.
      * @return The current volume index for the usage.
@@ -340,6 +243,5 @@
     /** @hide */
     public CarAudioManager(IBinder service, Context context, Handler handler) {
         mService = ICarAudio.Stub.asInterface(service);
-        mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
     }
 }
diff --git a/car-support-lib/api/current.txt b/car-support-lib/api/current.txt
index 8410557..f58f491 100644
--- a/car-support-lib/api/current.txt
+++ b/car-support-lib/api/current.txt
@@ -179,14 +179,12 @@
 
   public abstract class CarAudioManager {
     ctor public CarAudioManager();
-    method public abstract void abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
     method public abstract android.support.car.media.CarAudioRecord createCarAudioRecord(int) throws android.support.car.CarNotConnectedException, java.lang.SecurityException;
     method public abstract android.media.AudioAttributes getAudioAttributesForCarUsage(int) throws android.support.car.CarNotConnectedException;
     method public abstract android.media.AudioFormat getAudioRecordAudioFormat() throws android.support.car.CarNotConnectedException;
     method public abstract int getAudioRecordMaxBufferSize() throws android.support.car.CarNotConnectedException;
     method public abstract int getAudioRecordMinBufferSize() throws android.support.car.CarNotConnectedException;
     method public abstract boolean isAudioRecordSupported() throws android.support.car.CarNotConnectedException;
-    method public abstract int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
     field public static final int CAR_AUDIO_USAGE_ALARM = 6; // 0x6
     field public static final int CAR_AUDIO_USAGE_DEFAULT = 0; // 0x0
     field public static final int CAR_AUDIO_USAGE_MUSIC = 1; // 0x1
diff --git a/car-support-lib/src/android/support/car/media/CarAudioManager.java b/car-support-lib/src/android/support/car/media/CarAudioManager.java
index e69d7ed..9fc998f 100644
--- a/car-support-lib/src/android/support/car/media/CarAudioManager.java
+++ b/car-support-lib/src/android/support/car/media/CarAudioManager.java
@@ -19,7 +19,6 @@
 import android.media.AudioAttributes;
 import android.media.AudioFormat;
 import android.media.AudioManager;
-import android.media.AudioManager.OnAudioFocusChangeListener;
 import android.support.annotation.IntDef;
 import android.support.annotation.RequiresPermission;
 import android.support.car.CarManagerBase;
@@ -96,46 +95,6 @@
             throws CarNotConnectedException;
 
     /**
-     * Request audio focus. Send a request to obtain audio focus.
-     *
-     * @param listener The listener to be notified of audio focus changes.
-     * @param requestAttributes Obtained from {@link #getAudioAttributesForCarUsage(int)}.
-     * @param durationHint Use {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT} to indicate this
-     * focus request is temporary and focus will be abandoned shortly. Examples of transient
-     * requests include playback of driving directions and notification sounds.
-     * </p>
-     * Use {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate it's OK for the
-     * previous focus owner to keep playing if it ducks its audio output.
-     * </p>
-     * Use {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE} for a temporary request that
-     * benefits from the system not playing disruptive sounds such as notifications, for use cases
-     * such as voice memo recording, or speech recognition.
-     * </p>
-     * Use {@link AudioManager#AUDIOFOCUS_GAIN} for a focus request of unknown duration, such as
-     * the playback of a song or a video.
-     * @return {@link AudioManager#AUDIOFOCUS_REQUEST_FAILED}, or
-     * {@link AudioManager#AUDIOFOCUS_REQUEST_GRANTED}.
-     * @throws IllegalArgumentException
-     */
-    public abstract int requestAudioFocus(OnAudioFocusChangeListener listener,
-            AudioAttributes requestAttributes,
-            int durationHint) throws CarNotConnectedException, IllegalArgumentException;
-
-    /**
-     * @hide
-     */
-    public abstract int requestAudioFocus(OnAudioFocusChangeListener listener,
-            AudioAttributes requestAttributes,
-            int durationHint,
-            int flags) throws CarNotConnectedException, IllegalArgumentException;
-    /**
-     * Abandon audio focus. Causes the previous focus owner (if any) to receive focus.
-     * @param listener The listener with which focus was requested.
-     * @param aa
-     */
-    public abstract void abandonAudioFocus(OnAudioFocusChangeListener listener, AudioAttributes aa);
-
-    /**
      * Get {@link AudioFormat} for audio record.
      * @return {@link AudioFormat} for audio record.
      */
diff --git a/car-support-lib/src/android/support/car/media/CarAudioManagerEmbedded.java b/car-support-lib/src/android/support/car/media/CarAudioManagerEmbedded.java
index 713ffd3..1747d63 100644
--- a/car-support-lib/src/android/support/car/media/CarAudioManagerEmbedded.java
+++ b/car-support-lib/src/android/support/car/media/CarAudioManagerEmbedded.java
@@ -55,35 +55,6 @@
     }
 
     @Override
-    public int requestAudioFocus(OnAudioFocusChangeListener listener,
-            AudioAttributes requestAttributes,
-            int durationHint,
-            int flags) throws CarNotConnectedException, IllegalArgumentException {
-        try {
-            return mManager.requestAudioFocus(listener, requestAttributes, durationHint, flags);
-        } catch (android.car.CarNotConnectedException e) {
-            throw new CarNotConnectedException(e);
-        }
-    }
-
-    @Override
-    public int requestAudioFocus(OnAudioFocusChangeListener listener,
-            AudioAttributes requestAttributes,
-            int durationHint) throws CarNotConnectedException, IllegalArgumentException {
-        try {
-            return mManager.requestAudioFocus(listener, requestAttributes, durationHint,
-                    0 /*flags*/);
-        } catch (android.car.CarNotConnectedException e) {
-            throw new CarNotConnectedException(e);
-        }
-    }
-
-    @Override
-    public void abandonAudioFocus(OnAudioFocusChangeListener listener, AudioAttributes aa) {
-        mManager.abandonAudioFocus(listener, aa);
-    }
-
-    @Override
     public boolean isAudioRecordSupported() throws CarNotConnectedException {
         //always true in embedded
         return true;
diff --git a/tests/EmbeddedKitchenSinkApp/res/layout/radio.xml b/tests/EmbeddedKitchenSinkApp/res/layout/radio.xml
index 590e7f1..fd47687 100644
--- a/tests/EmbeddedKitchenSinkApp/res/layout/radio.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/layout/radio.xml
@@ -50,38 +50,6 @@
             android:layout_height="wrap_content"
             android:orientation="horizontal"
             android:layout_weight="1" >
-        <Button
-                android:id="@+id/button_get_radio_focus"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/radio_get_radio_focus" />
-        <Button
-                android:id="@+id/button_release_radio_focus"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/radio_release_radio_focus" />
-    </LinearLayout>
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:layout_weight="1" >
-        <Button
-                android:id="@+id/button_get_focus_in_radio"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/radio_get_focus" />
-        <Button
-                android:id="@+id/button_release_focus_in_radio"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:text="@string/radio_release_focus" />
-    </LinearLayout>
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:layout_weight="1" >
         <EditText
                 android:id="@+id/edittext_station_frequency"
                 android:layout_width="wrap_content"
diff --git a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
index e8fa534..51a9223 100644
--- a/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
+++ b/tests/EmbeddedKitchenSinkApp/res/values/strings.xml
@@ -178,10 +178,6 @@
     <string name="radio_close">Close</string>
     <string name="radio_muted">Muted</string>
     <string name="radio_unmuted">Unmuted</string>
-    <string name="radio_get_radio_focus">Get Radio focus</string>
-    <string name="radio_release_radio_focus">Release Radio focus</string>
-    <string name="radio_get_focus">Get Audio focus</string>
-    <string name="radio_release_focus">Release Audio focus</string>
     <string name="radio_next">Next</string>
     <string name="radio_prev">Previous</string>
     <string name="radio_scan_cancel">Cancel scan</string>
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
index c19a3e8..5a160f1 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/audio/AudioTestFragment.java
@@ -35,11 +35,8 @@
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
-import android.view.View.OnClickListener;
 import android.view.ViewGroup;
 import android.widget.Button;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.RadioGroup;
 import android.widget.TextView;
 import android.widget.Toast;
@@ -47,7 +44,6 @@
 
 import com.google.android.car.kitchensink.CarEmulator;
 import com.google.android.car.kitchensink.R;
-import com.google.android.car.kitchensink.audio.AudioPlayer.PlayStateListener;
 
 public class AudioTestFragment extends Fragment {
     private static final String TAG = "CAR.AUDIO.KS";
@@ -55,24 +51,6 @@
 
     private AudioManager mAudioManager;
     private FocusHandler mAudioFocusHandler;
-    private Button mNavPlayOnce;
-    private Button mVrPlayOnce;
-    private Button mSystemPlayOnce;
-    private Button mMediaPlay;
-    private Button mMediaPlayOnce;
-    private Button mMediaStop;
-    private Button mWavPlay;
-    private Button mWavStop;
-    private Button mNavStart;
-    private Button mNavEnd;
-    private Button mVrStart;
-    private Button mVrEnd;
-    private Button mRadioStart;
-    private Button mRadioEnd;
-    private Button mSpeakerPhoneOn;
-    private Button mSpeakerPhoneOff;
-    private Button mMicrophoneOn;
-    private Button mMicrophoneOff;
     private ToggleButton mEnableMocking;
     private ToggleButton mRejectFocus;
 
@@ -97,26 +75,14 @@
     private AudioAttributes mSystemSoundAudioAttrib;
     private CarEmulator mCarEmulator;
 
-    private final AudioManager.OnAudioFocusChangeListener mNavFocusListener =
-            new AudioManager.OnAudioFocusChangeListener() {
-                @Override
-                public void onAudioFocusChange(int focusChange) {
-                    Log.i(TAG, "Nav focus change:" + focusChange);
-                }
+    private final AudioManager.OnAudioFocusChangeListener mNavFocusListener = (focusChange) -> {
+        Log.i(TAG, "Nav focus change:" + focusChange);
     };
-    private final AudioManager.OnAudioFocusChangeListener mVrFocusListener =
-            new AudioManager.OnAudioFocusChangeListener() {
-                @Override
-                public void onAudioFocusChange(int focusChange) {
-                    Log.i(TAG, "VR focus change:" + focusChange);
-                }
+    private final AudioManager.OnAudioFocusChangeListener mVrFocusListener = (focusChange) -> {
+        Log.i(TAG, "VR focus change:" + focusChange);
     };
-    private final AudioManager.OnAudioFocusChangeListener mRadioFocusListener =
-            new AudioManager.OnAudioFocusChangeListener() {
-                @Override
-                public void onAudioFocusChange(int focusChange) {
-                    Log.i(TAG, "Radio focus change:" + focusChange);
-                }
+    private final AudioManager.OnAudioFocusChangeListener mRadioFocusListener = (focusChange) -> {
+        Log.i(TAG, "Radio focus change:" + focusChange);
     };
 
     private final CarAppFocusManager.OnAppFocusOwnershipCallback mOwnershipCallbacks =
@@ -211,232 +177,120 @@
         mAudioManager = (AudioManager) mContext.getSystemService(
                 Context.AUDIO_SERVICE);
         mAudioFocusHandler = new FocusHandler(
-                (RadioGroup) view.findViewById(R.id.button_focus_request_selection),
-                (Button) view.findViewById(R.id.button_audio_focus_request),
-                (TextView) view.findViewById(R.id.text_audio_focus_state));
-        mMediaPlay = (Button) view.findViewById(R.id.button_media_play_start);
-        mMediaPlay.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                boolean requestFocus = true;
-                boolean repeat = true;
-                mMusicPlayer.start(requestFocus, repeat, AudioManager.AUDIOFOCUS_GAIN);
+                view.findViewById(R.id.button_focus_request_selection),
+                view.findViewById(R.id.button_audio_focus_request),
+                view.findViewById(R.id.text_audio_focus_state));
+        view.findViewById(R.id.button_media_play_start).setOnClickListener(v -> {
+            boolean requestFocus = true;
+            boolean repeat = true;
+            mMusicPlayer.start(requestFocus, repeat, AudioManager.AUDIOFOCUS_GAIN);
+        });
+        view.findViewById(R.id.button_media_play_once).setOnClickListener(v -> {
+            mMusicPlayerShort.start(true, false, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
+            // play only for 1 sec and stop
+            mHandler.postDelayed(() -> mMusicPlayerShort.stop(), 1000);
+        });
+        view.findViewById(R.id.button_media_play_stop).setOnClickListener(v -> mMusicPlayer.stop());
+        view.findViewById(R.id.button_wav_play_start).setOnClickListener(
+                v -> mWavPlayer.start(true, true, AudioManager.AUDIOFOCUS_GAIN));
+        view.findViewById(R.id.button_wav_play_stop).setOnClickListener(v -> mWavPlayer.stop());
+        view.findViewById(R.id.button_nav_play_once).setOnClickListener(v -> {
+            if (mAppFocusManager == null) {
+                return;
+            }
+            if (DBG) {
+                Log.i(TAG, "Nav start");
+            }
+            try {
+                mAppFocusManager.requestAppFocus(
+                        CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, mOwnershipCallbacks);
+            } catch (CarNotConnectedException e) {
+                Log.e(TAG, "Failed to set active focus", e);
+            }
+            if (!mNavGuidancePlayer.isPlaying()) {
+                mNavGuidancePlayer.start(true, false,
+                        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
+                        () -> mAppFocusManager.abandonAppFocus(mOwnershipCallbacks,
+                                CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION));
             }
         });
-        mMediaPlayOnce = (Button) view.findViewById(R.id.button_media_play_once);
-        mMediaPlayOnce.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mMusicPlayerShort.start(true, false, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
-                // play only for 1 sec and stop
-                mHandler.postDelayed(new Runnable() {
-                    @Override
-                    public void run() {
-                        mMusicPlayerShort.stop();
-                    }
-                }, 1000);
+        view.findViewById(R.id.button_vr_play_once).setOnClickListener(v -> {
+            if (mAppFocusManager == null) {
+                return;
+            }
+            if (DBG) {
+                Log.i(TAG, "VR start");
+            }
+            try {
+                mAppFocusManager.requestAppFocus(
+                        CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, mOwnershipCallbacks);
+            } catch (CarNotConnectedException e) {
+                Log.e(TAG, "Failed to set active focus", e);
+            }
+            if (!mVrPlayer.isPlaying()) {
+                mVrPlayer.start(true, false,
+                        AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
+                        () -> mAppFocusManager.abandonAppFocus(mOwnershipCallbacks,
+                                CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND));
             }
         });
-        mMediaStop = (Button) view.findViewById(R.id.button_media_play_stop);
-        mMediaStop.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mMusicPlayer.stop();
+        view.findViewById(R.id.button_system_play_once).setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "System start");
+            }
+            if (!mSystemPlayer.isPlaying()) {
+                // system sound played without focus
+                mSystemPlayer.start(false, false, 0);
             }
         });
-        mWavPlay = (Button) view.findViewById(R.id.button_wav_play_start);
-        mWavPlay.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mWavPlayer.start(true, true, AudioManager.AUDIOFOCUS_GAIN);
-            }
-        });
-        mWavStop = (Button) view.findViewById(R.id.button_wav_play_stop);
-        mWavStop.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mWavPlayer.stop();
-            }
-        });
-        mNavPlayOnce = (Button) view.findViewById(R.id.button_nav_play_once);
-        mNavPlayOnce.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mAppFocusManager == null) {
-                    return;
-                }
-                if (DBG) {
-                    Log.i(TAG, "Nav start");
-                }
-                if (!mNavGuidancePlayer.isPlaying()) {
-                    try {
-                        mAppFocusManager.requestAppFocus(
-                                CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION, mOwnershipCallbacks);
-                    } catch (CarNotConnectedException e) {
-                        Log.e(TAG, "Failed to set active focus", e);
-                    }
-                    mNavGuidancePlayer.start(true, false,
-                            AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
-                            new PlayStateListener() {
-                        @Override
-                        public void onCompletion() {
-                            mAppFocusManager.abandonAppFocus(mOwnershipCallbacks,
-                                    CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
-                        }
-                    });
-                }
-            }
-        });
-        mVrPlayOnce = (Button) view.findViewById(R.id.button_vr_play_once);
-        mVrPlayOnce.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (mAppFocusManager == null) {
-                    return;
-                }
-                if (DBG) {
-                    Log.i(TAG, "VR start");
-                }
-                try {
-                    mAppFocusManager.requestAppFocus(
-                            CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND, mOwnershipCallbacks);
-                } catch (CarNotConnectedException e) {
-                    Log.e(TAG, "Failed to set active focus", e);
-                }
-                if (!mVrPlayer.isPlaying()) {
-                    mVrPlayer.start(true, false, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
-                            new PlayStateListener() {
-                        @Override
-                        public void onCompletion() {
-                            mAppFocusManager.abandonAppFocus(mOwnershipCallbacks,
-                                    CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
-                        }
-                    });
-                }
-            }
-        });
-        mSystemPlayOnce = (Button) view.findViewById(R.id.button_system_play_once);
-        mSystemPlayOnce.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "System start");
-                }
-                if (!mSystemPlayer.isPlaying()) {
-                    // system sound played without focus
-                    mSystemPlayer.start(false, false, 0);
-                }
-            }
-        });
-        mNavStart = (Button) view.findViewById(R.id.button_nav_start);
-        mNavStart.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleNavStart();
-            }
-        });
-        mNavEnd = (Button) view.findViewById(R.id.button_nav_end);
-        mNavEnd.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleNavEnd();
-            }
-        });
-        mVrStart = (Button) view.findViewById(R.id.button_vr_start);
-        mVrStart.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleVrStart();
-            }
-        });
-        mVrEnd = (Button) view.findViewById(R.id.button_vr_end);
-        mVrEnd.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleVrEnd();
-            }
-        });
-        mRadioStart = (Button) view.findViewById(R.id.button_radio_start);
-        mRadioStart.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleRadioStart();
-            }
-        });
-        mRadioEnd = (Button) view.findViewById(R.id.button_radio_end);
-        mRadioEnd.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleRadioEnd();
-            }
-        });
-        mSpeakerPhoneOn = (Button) view.findViewById(R.id.button_speaker_phone_on);
-        mSpeakerPhoneOn.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mAudioManager.setSpeakerphoneOn(true);
-            }
-        });
-        mSpeakerPhoneOff = (Button) view.findViewById(R.id.button_speaker_phone_off);
-        mSpeakerPhoneOff.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mAudioManager.setSpeakerphoneOn(false);
-            }
-        });
-        mMicrophoneOn = (Button) view.findViewById(R.id.button_microphone_on);
-        mMicrophoneOn.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mAudioManager.setMicrophoneMute(false); // Turn the microphone on.
-            }
-        });
-        mMicrophoneOff = (Button) view.findViewById(R.id.button_microphone_off);
-        mMicrophoneOff.setOnClickListener(new OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                mAudioManager.setMicrophoneMute(true); // Mute the microphone.
-            }
-        });
+        view.findViewById(R.id.button_nav_start).setOnClickListener(v -> handleNavStart());
+        view.findViewById(R.id.button_nav_end).setOnClickListener(v -> handleNavEnd());
+        view.findViewById(R.id.button_vr_start).setOnClickListener(v -> handleVrStart());
+        view.findViewById(R.id.button_vr_end).setOnClickListener(v -> handleVrEnd());
+        view.findViewById(R.id.button_radio_start).setOnClickListener(v -> handleRadioStart());
+        view.findViewById(R.id.button_radio_end).setOnClickListener(v -> handleRadioEnd());
+        view.findViewById(R.id.button_speaker_phone_on).setOnClickListener(
+                v -> mAudioManager.setSpeakerphoneOn(true));
+        view.findViewById(R.id.button_speaker_phone_off).setOnClickListener(
+                v -> mAudioManager.setSpeakerphoneOn(false));
+        view.findViewById(R.id.button_microphone_on).setOnClickListener(
+                v -> mAudioManager.setMicrophoneMute(false));
+        view.findViewById(R.id.button_microphone_off).setOnClickListener(
+                v -> mAudioManager.setMicrophoneMute(true));
 
 
-        mRejectFocus = (ToggleButton) view.findViewById(R.id.button_reject_audio_focus);
-        mRejectFocus.setOnCheckedChangeListener(new OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                if (mCarEmulator == null) {
-                    return;
-                }
-                if (!mEnableMocking.isChecked()) {
-                    return;
-                }
-                if (isChecked) {
-                    mCarEmulator.setAudioFocusControl(true);
-                } else {
-                    mCarEmulator.setAudioFocusControl(false);
-                }
+        mRejectFocus = view.findViewById(R.id.button_reject_audio_focus);
+        mRejectFocus.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            if (mCarEmulator == null) {
+                return;
+            }
+            if (!mEnableMocking.isChecked()) {
+                return;
+            }
+            if (isChecked) {
+                mCarEmulator.setAudioFocusControl(true);
+            } else {
+                mCarEmulator.setAudioFocusControl(false);
             }
         });
         mRejectFocus.setActivated(false);
-        mEnableMocking = (ToggleButton) view.findViewById(R.id.button_mock_audio);
-        mEnableMocking.setOnCheckedChangeListener(new OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                if (mCarEmulator == null) {
-                    //TODO(pavelm): need to do a full switch between emulated and normal mode
-                    // all Car*Manager references should be invalidated.
-                    Toast.makeText(AudioTestFragment.this.getContext(),
-                            "Not supported yet :(", Toast.LENGTH_SHORT).show();
-                    return;
-                }
-                if (isChecked) {
-                    mRejectFocus.setActivated(true);
-                    mCarEmulator.start();
-                } else {
-                    mRejectFocus.setActivated(false);
-                    mCarEmulator.stop();
-                    mCarEmulator = null;
-                }
+
+        mEnableMocking = view.findViewById(R.id.button_mock_audio);
+        mEnableMocking.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            if (mCarEmulator == null) {
+                //TODO(pavelm): need to do a full switch between emulated and normal mode
+                // all Car*Manager references should be invalidated.
+                Toast.makeText(AudioTestFragment.this.getContext(),
+                        "Not supported yet :(", Toast.LENGTH_SHORT).show();
+                return;
+            }
+            if (isChecked) {
+                mRejectFocus.setActivated(true);
+                mCarEmulator.start();
+            } else {
+                mRejectFocus.setActivated(false);
+                mCarEmulator.stop();
+                mCarEmulator = null;
             }
         });
         return view;
@@ -466,16 +320,13 @@
         if (mAppFocusManager == null) {
             return;
         }
-        if (mCarAudioManager == null) {
-            return;
-        }
         if (DBG) {
             Log.i(TAG, "Nav start");
         }
         try {
             mAppFocusManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION,
                     mOwnershipCallbacks);
-            mCarAudioManager.requestAudioFocus(mNavFocusListener, mNavAudioAttrib,
+            mAudioManager.requestAudioFocus(mNavFocusListener, mNavAudioAttrib,
                     AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 0);
         } catch (CarNotConnectedException e) {
             Log.e(TAG, "Failed to set active focus", e);
@@ -486,31 +337,25 @@
         if (mAppFocusManager == null) {
             return;
         }
-        if (mCarAudioManager == null) {
-            return;
-        }
         if (DBG) {
             Log.i(TAG, "Nav end");
         }
+        mAudioManager.abandonAudioFocus(mNavFocusListener, mNavAudioAttrib);
         mAppFocusManager.abandonAppFocus(mOwnershipCallbacks,
                 CarAppFocusManager.APP_FOCUS_TYPE_NAVIGATION);
-        mCarAudioManager.abandonAudioFocus(mNavFocusListener, mNavAudioAttrib);
     }
 
     private void handleVrStart() {
         if (mAppFocusManager == null) {
             return;
         }
-        if (mCarAudioManager == null) {
-            return;
-        }
         if (DBG) {
             Log.i(TAG, "VR start");
         }
         try {
             mAppFocusManager.requestAppFocus(CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND,
                     mOwnershipCallbacks);
-            mCarAudioManager.requestAudioFocus(mVrFocusListener, mVrAudioAttrib,
+            mAudioManager.requestAudioFocus(mVrFocusListener, mVrAudioAttrib,
                     AudioManager.AUDIOFOCUS_GAIN_TRANSIENT, 0);
         } catch (CarNotConnectedException e) {
             Log.e(TAG, "Failed to set active focus", e);
@@ -521,40 +366,27 @@
         if (mAppFocusManager == null) {
             return;
         }
-        if (mCarAudioManager == null) {
-            return;
-        }
         if (DBG) {
             Log.i(TAG, "VR end");
         }
+        mAudioManager.abandonAudioFocus(mVrFocusListener, mVrAudioAttrib);
         mAppFocusManager.abandonAppFocus(mOwnershipCallbacks,
                 CarAppFocusManager.APP_FOCUS_TYPE_VOICE_COMMAND);
-        mCarAudioManager.abandonAudioFocus(mVrFocusListener, mVrAudioAttrib);
     }
 
     private void handleRadioStart() {
-        if (mCarAudioManager == null) {
-            return;
-        }
         if (DBG) {
             Log.i(TAG, "Radio start");
         }
-        try {
-            mCarAudioManager.requestAudioFocus(mRadioFocusListener, mRadioAudioAttrib,
-                    AudioManager.AUDIOFOCUS_GAIN, 0);
-        } catch (CarNotConnectedException e) {
-            Log.e(TAG, "failed", e);
-        }
+        mAudioManager.requestAudioFocus(mRadioFocusListener, mRadioAudioAttrib,
+                AudioManager.AUDIOFOCUS_GAIN, 0);
     }
 
     private void handleRadioEnd() {
-        if (mCarAudioManager == null) {
-            return;
-        }
         if (DBG) {
             Log.i(TAG, "Radio end");
         }
-        mCarAudioManager.abandonAudioFocus(mRadioFocusListener, mRadioAudioAttrib);
+        mAudioManager.abandonAudioFocus(mRadioFocusListener, mRadioAudioAttrib);
     }
 
     private class FocusHandler {
@@ -571,24 +403,21 @@
             mRequestSelection.check(R.id.focus_gain);
             setFocusText(AUDIO_FOCUS_STATE_RELEASED_UNKNOWN);
             mFocusListener = new AudioFocusListener();
-            requestButton.setOnClickListener(new OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    int selectedButtonId = mRequestSelection.getCheckedRadioButtonId();
-                    int focusRequest = AudioManager.AUDIOFOCUS_GAIN;
-                    if (selectedButtonId == R.id.focus_gain_transient_duck) {
-                        focusRequest = AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
-                    } else if (selectedButtonId == R.id.focus_release) {
-                        mAudioManager.abandonAudioFocus(mFocusListener);
-                        setFocusText(AUDIO_FOCUS_STATE_RELEASED_UNKNOWN);
-                        return;
-                    }
-                    int ret = mAudioManager.requestAudioFocus(mFocusListener,
-                            AudioManager.STREAM_MUSIC, focusRequest);
-                    Log.i(TAG, "requestAudioFocus returned " + ret);
-                    if (ret == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
-                        setFocusText(AUDIO_FOCUS_STATE_GAIN);
-                    }
+            requestButton.setOnClickListener(v -> {
+                int selectedButtonId = mRequestSelection.getCheckedRadioButtonId();
+                int focusRequest = AudioManager.AUDIOFOCUS_GAIN;
+                if (selectedButtonId == R.id.focus_gain_transient_duck) {
+                    focusRequest = AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
+                } else if (selectedButtonId == R.id.focus_release) {
+                    mAudioManager.abandonAudioFocus(mFocusListener);
+                    setFocusText(AUDIO_FOCUS_STATE_RELEASED_UNKNOWN);
+                    return;
+                }
+                int ret = mAudioManager.requestAudioFocus(mFocusListener,
+                        AudioManager.STREAM_MUSIC, focusRequest);
+                Log.i(TAG, "requestAudioFocus returned " + ret);
+                if (ret == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+                    setFocusText(AUDIO_FOCUS_STATE_GAIN);
                 }
             });
         }
diff --git a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/radio/RadioTestFragment.java b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/radio/RadioTestFragment.java
index 0214791..1b0f029 100644
--- a/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/radio/RadioTestFragment.java
+++ b/tests/EmbeddedKitchenSinkApp/src/com/google/android/car/kitchensink/radio/RadioTestFragment.java
@@ -26,11 +26,8 @@
 import android.hardware.radio.RadioManager;
 import android.hardware.radio.RadioMetadata;
 import android.hardware.radio.RadioTuner;
-import android.media.AudioAttributes;
-import android.media.AudioManager;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.os.Looper;
 import android.support.v4.app.Fragment;
 import android.text.TextUtils;
 import android.text.method.ScrollingMovementMethod;
@@ -40,7 +37,6 @@
 import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.EditText;
 import android.widget.TextView;
 import android.widget.ToggleButton;
@@ -56,22 +52,6 @@
     private static final boolean DBG = true;
     private static final int MAX_LOG_MESSAGES = 100;
 
-    private final AudioManager.OnAudioFocusChangeListener mRadioFocusListener =
-            new AudioManager.OnAudioFocusChangeListener() {
-                @Override
-                public void onAudioFocusChange(int focusChange) {
-                    addLog(Log.INFO, "Radio focus change:" + focusChange);
-                }
-            };
-
-    private final AudioManager.OnAudioFocusChangeListener mSecondaryFocusListener =
-            new AudioManager.OnAudioFocusChangeListener() {
-                @Override
-                public void onAudioFocusChange(int focusChange) {
-                    addLog(Log.INFO, "Secondary focus change:" + focusChange);
-                }
-            };
-
     private final RadioTuner.Callback mRadioCallback = new RadioTuner.Callback() {
         @Override
         public void onError(int status) {
@@ -110,10 +90,6 @@
 
     private Button mOpenRadio;
     private Button mCloseRadio;
-    private Button mGetRadioFocus;
-    private Button mReleaseRadioFocus;
-    private Button mGetFocus;
-    private Button mReleaseFocus;
     private Button mRadioNext;
     private Button mRadioPrev;
     private Button mRadioScanCancel;
@@ -132,10 +108,6 @@
 
     private Car mCar;
     private CarAudioManager mCarAudioManager;
-    private AudioAttributes mRadioAudioAttrib;
-    private AudioManager mAudioManager;
-    private boolean mHasRadioFocus;
-    private boolean mHasSecondaryFocus;
     private RadioTuner mRadioTuner;
     private RadioManager mRadioManager;
     private RadioManager.FmBandDescriptor mFmDescriptor;
@@ -162,32 +134,28 @@
         init();
         View view = inflater.inflate(R.layout.radio, container, false);
 
-        mOpenRadio = (Button) view.findViewById(R.id.button_open_radio);
-        mCloseRadio = (Button) view.findViewById(R.id.button_close_radio);
-        mGetRadioFocus = (Button) view.findViewById(R.id.button_get_radio_focus);
-        mReleaseRadioFocus = (Button) view.findViewById(R.id.button_release_radio_focus);
-        mGetFocus = (Button) view.findViewById(R.id.button_get_focus_in_radio);
-        mReleaseFocus = (Button) view.findViewById(R.id.button_release_focus_in_radio);
-        mRadioNext = (Button) view.findViewById(R.id.button_radio_next);
-        mRadioPrev = (Button) view.findViewById(R.id.button_radio_prev);
-        mRadioScanCancel = (Button) view.findViewById(R.id.button_radio_scan_cancel);
-        mRadioGetProgramInfo = (Button) view.findViewById(R.id.button_radio_get_program_info);
-        mRadioTuneToStation = (Button) view.findViewById(R.id.button_radio_tune_to_station);
-        mRadioStepUp = (Button) view.findViewById(R.id.button_radio_step_up);
-        mRadioStepDown = (Button) view.findViewById(R.id.button_radio_step_down);
+        mOpenRadio = view.findViewById(R.id.button_open_radio);
+        mCloseRadio = view.findViewById(R.id.button_close_radio);
+        mRadioNext = view.findViewById(R.id.button_radio_next);
+        mRadioPrev = view.findViewById(R.id.button_radio_prev);
+        mRadioScanCancel = view.findViewById(R.id.button_radio_scan_cancel);
+        mRadioGetProgramInfo = view.findViewById(R.id.button_radio_get_program_info);
+        mRadioTuneToStation = view.findViewById(R.id.button_radio_tune_to_station);
+        mRadioStepUp = view.findViewById(R.id.button_radio_step_up);
+        mRadioStepDown = view.findViewById(R.id.button_radio_step_down);
 
-        mStationFrequency = (EditText) view.findViewById(R.id.edittext_station_frequency);
+        mStationFrequency = view.findViewById(R.id.edittext_station_frequency);
 
-        mToggleMuteRadio = (ToggleButton) view.findViewById(R.id.togglebutton_mute_radio);
+        mToggleMuteRadio = view.findViewById(R.id.togglebutton_mute_radio);
         mToggleMuteRadio.setChecked(true);
-        mRadioBand = (ToggleButton) view.findViewById(R.id.button_band_selection);
+        mRadioBand = view.findViewById(R.id.button_band_selection);
 
-        mStationInfo = (TextView) view.findViewById(R.id.radio_station_info);
-        mChannelInfo = (TextView) view.findViewById(R.id.radio_channel_info);
-        mSongInfo = (TextView) view.findViewById(R.id.radio_song_info);
-        mArtistInfo = (TextView) view.findViewById(R.id.radio_artist_info);
+        mStationInfo = view.findViewById(R.id.radio_station_info);
+        mChannelInfo = view.findViewById(R.id.radio_channel_info);
+        mSongInfo = view.findViewById(R.id.radio_song_info);
+        mArtistInfo = view.findViewById(R.id.radio_artist_info);
 
-        mLog = (TextView) view.findViewById(R.id.radio_log);
+        mLog = view.findViewById(R.id.radio_log);
         mLog.setMovementMethod(new ScrollingMovementMethod());
 
         mNaString = getContext().getString(R.string.radio_na);
@@ -213,8 +181,6 @@
             public void onServiceConnected(ComponentName name, IBinder service) {
                 try {
                     mCarAudioManager = (CarAudioManager) mCar.getCarManager(Car.AUDIO_SERVICE);
-                    mRadioAudioAttrib = mCarAudioManager.getAudioAttributesForCarUsage(
-                            CarAudioManager.CAR_AUDIO_USAGE_RADIO);
                 } catch (CarNotConnectedException e) {
                     Log.e(TAG, "Car not connected", e);
                 }
@@ -225,7 +191,6 @@
             }
         });
         mCar.connect();
-        mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
         initializeRadio();
     }
 
@@ -275,186 +240,103 @@
     }
 
     private void addHandlers() {
-        mOpenRadio.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleRadioStart();
-                updateStates();
+        mOpenRadio.setOnClickListener(v -> {
+            handleRadioStart();
+            updateStates();
+        });
+        mCloseRadio.setOnClickListener(v -> {
+            handleRadioEnd();
+            mToggleMuteRadio.setChecked(true);
+            updateStates();
+        });
+        mToggleMuteRadio.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "Toggle mute radio");
+            }
+            mRadioTuner.setMute(!mRadioTuner.getMute());
+            updateStates();
+        });
+        mRadioNext.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "Next radio station");
+            }
+            if (mRadioTuner != null) {
+                mRadioTuner.scan(RadioTuner.DIRECTION_UP, true);
+            }
+            updateStates();
+        });
+        mRadioPrev.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "Previous radio station");
+            }
+            if (mRadioTuner != null) {
+                mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true);
+            }
+            updateStates();
+        });
+        mRadioScanCancel.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "Cancel radio scan");
+            }
+            if (mRadioTuner != null) {
+                mRadioTuner.cancel();
+            }
+            updateStates();
+        });
+        mRadioTuneToStation.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "Tuning to station");
+            }
+            String station = mStationFrequency.getText().toString().trim();
+            if (mRadioTuner != null && !(station.equals(""))) {
+                mRadioTuner.tune(Integer.parseInt(station), 0);
+            }
+            resetMessages();
+            updateMessages();
+            updateStates();
+        });
+        mRadioStepUp.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "Step up");
+            }
+            if (mRadioTuner != null) {
+                mRadioTuner.step(RadioTuner.DIRECTION_UP, false);
+            }
+            resetMessages();
+            updateMessages();
+            updateStates();
+        });
+        mRadioStepDown.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "Step down");
+            }
+            if (mRadioTuner != null) {
+                mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false);
+            }
+            resetMessages();
+            updateMessages();
+            updateStates();
+        });
+        mRadioGetProgramInfo.setOnClickListener(v -> {
+            if (DBG) {
+                Log.i(TAG, "getProgramInformation");
+            }
+            if (mRadioTuner != null) {
+                RadioManager.ProgramInfo[] programInfos = new RadioManager.ProgramInfo[1];
+                mRadioTuner.getProgramInformation(programInfos);
+                addLog(Log.INFO, "mRadioTuner.getProgramInformation() =>" + programInfos[0]);
             }
         });
-        mCloseRadio.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                handleRadioEnd();
-                mToggleMuteRadio.setChecked(true);
-                updateStates();
+        mRadioBand.setOnCheckedChangeListener((buttonView, isChecked) -> {
+            if (DBG) {
+                Log.i(TAG, "Changing radio band");
             }
-        });
-        mToggleMuteRadio.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Toggle mute radio");
-                }
-                mRadioTuner.setMute(!mRadioTuner.getMute());
-                updateStates();
+            if (mRadioTuner != null) {
+                mRadioTuner.setConfiguration(mRadioBand.isChecked() ? mFmConfig : mAmConfig);
             }
-        });
-        mGetRadioFocus.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Get radio focus");
-                }
-                try {
-                    mCarAudioManager.requestAudioFocus(mRadioFocusListener, mRadioAudioAttrib,
-                            AudioManager.AUDIOFOCUS_GAIN, 0);
-                } catch (CarNotConnectedException e) {
-                  //ignore for now
-                }
-                mHasRadioFocus = true;
-                updateStates();
-            }
-        });
-        mReleaseRadioFocus.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Release radio focus");
-                }
-                mCarAudioManager.abandonAudioFocus(mRadioFocusListener, mRadioAudioAttrib);
-                mHasRadioFocus = false;
-                updateStates();
-            }
-        });
-        mGetFocus.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Get secondary focus");
-                }
-                mAudioManager.requestAudioFocus(mSecondaryFocusListener,
-                        AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
-                mHasSecondaryFocus = true;
-                updateStates();
-            }
-        });
-        mReleaseFocus.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Release secondary focus");
-                }
-                mAudioManager.abandonAudioFocus(mSecondaryFocusListener);
-                mHasSecondaryFocus = false;
-                updateStates();
-            }
-        });
-        mRadioNext.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Next radio station");
-                }
-                if (mRadioTuner != null) {
-                    mRadioTuner.scan(RadioTuner.DIRECTION_UP, true);
-                }
-                updateStates();
-            }
-        });
-        mRadioPrev.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Previous radio station");
-                }
-                if (mRadioTuner != null) {
-                    mRadioTuner.scan(RadioTuner.DIRECTION_DOWN, true);
-                }
-                updateStates();
-            }
-        });
-        mRadioScanCancel.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Cancel radio scan");
-                }
-                if (mRadioTuner != null) {
-                    mRadioTuner.cancel();
-                }
-                updateStates();
-            }
-        });
-        mRadioTuneToStation.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Tuning to station");
-                }
-                String station = mStationFrequency.getText().toString().trim();
-                if (mRadioTuner != null && !(station.equals(""))) {
-                    mRadioTuner.tune(Integer.parseInt(station), 0);
-                }
-                resetMessages();
-                updateMessages();
-                updateStates();
-            }
-        });
-        mRadioStepUp.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Step up");
-                }
-                if (mRadioTuner != null) {
-                    mRadioTuner.step(RadioTuner.DIRECTION_UP, false);
-                }
-                resetMessages();
-                updateMessages();
-                updateStates();
-            }
-        });
-        mRadioStepDown.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "Step down");
-                }
-                if (mRadioTuner != null) {
-                    mRadioTuner.step(RadioTuner.DIRECTION_DOWN, false);
-                }
-                resetMessages();
-                updateMessages();
-                updateStates();
-            }
-        });
-        mRadioGetProgramInfo.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (DBG) {
-                    Log.i(TAG, "getProgramInformation");
-                }
-                if (mRadioTuner != null) {
-                    RadioManager.ProgramInfo[] programInfos = new RadioManager.ProgramInfo[1];
-                    mRadioTuner.getProgramInformation(programInfos);
-                    addLog(Log.INFO, "mRadioTuner.getProgramInformation() =>" + programInfos[0]);
-                }
-            }
-        });
-        mRadioBand.setOnCheckedChangeListener(new OnCheckedChangeListener() {
-            @Override
-            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
-                if (DBG) {
-                    Log.i(TAG, "Changing radio band");
-                }
-                if (mRadioTuner != null) {
-                    mRadioTuner.setConfiguration(mRadioBand.isChecked() ? mFmConfig : mAmConfig);
-                }
-                resetMessages();
-                updateMessages();
-                updateStates();
-            }
+            resetMessages();
+            updateMessages();
+            updateStates();
         });
     }
 
@@ -462,10 +344,6 @@
         mOpenRadio.setEnabled(mRadioTuner == null);
         mCloseRadio.setEnabled(mRadioTuner != null);
         mToggleMuteRadio.setEnabled(mRadioTuner != null);
-        mGetRadioFocus.setEnabled(!mHasRadioFocus);
-        mReleaseRadioFocus.setEnabled(mHasRadioFocus);
-        mGetFocus.setEnabled(!mHasSecondaryFocus);
-        mReleaseFocus.setEnabled(mHasSecondaryFocus);
         mRadioNext.setEnabled(mRadioTuner != null);
         mRadioPrev.setEnabled(mRadioTuner != null);
         mRadioBand.setEnabled(mRadioTuner != null);