[automerger skipped] Migrate radio app to androidx
am: e9d693e2cf -s ours
Change-Id: I7c4b7677e1034a08c0aa7e160e837c9d825266fb
diff --git a/Android.mk b/Android.mk
index 982b031..943ea60 100644
--- a/Android.mk
+++ b/Android.mk
@@ -40,29 +40,25 @@
LOCAL_JAVA_LIBRARIES += android.car
LOCAL_STATIC_ANDROID_LIBRARIES += \
- androidx.car_car \
androidx-constraintlayout_constraintlayout \
+ androidx.car_car \
car-apps-common \
car-broadcastradio-support \
car-stream-ui-lib
-# Dependency for bcradio-android-arch-room-runtime-nodeps
-LOCAL_STATIC_ANDROID_LIBRARIES += \
- android-support-v4
-
LOCAL_STATIC_JAVA_LIBRARIES := \
- android-arch-lifecycle-livedata \
- android-arch-persistence-db-framework \
- android-arch-persistence-db \
android-support-constraint-layout-solver \
- bcradio-android-arch-room-common-nodeps \
- bcradio-android-arch-room-runtime-nodeps
+ androidx.lifecycle_lifecycle-livedata \
+ androidx.sqlite_sqlite-framework \
+ androidx.sqlite_sqlite \
+ bcradio-androidx-room-common-nodeps \
+ bcradio-androidx-room-runtime-nodeps
LOCAL_ANNOTATION_PROCESSORS := \
- bcradio-android-arch-room-common-nodeps \
- bcradio-android-arch-room-compiler-nodeps \
- bcradio-android-arch-room-migration-nodeps \
- bcradio-android-support-annotations-nodeps \
+ bcradio-androidx-annotation-nodeps \
+ bcradio-androidx-room-common-nodeps \
+ bcradio-androidx-room-compiler-nodeps \
+ bcradio-androidx-room-migration-nodeps \
bcradio-antlr4-nodeps \
bcradio-apache-commons-codec-nodeps \
bcradio-auto-common-nodeps \
@@ -73,7 +69,7 @@
kotlin-stdlib
LOCAL_ANNOTATION_PROCESSOR_CLASSES := \
- android.arch.persistence.room.RoomProcessor
+ androidx.room.RoomProcessor
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
@@ -86,21 +82,20 @@
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
- bcradio-android-arch-room-runtime-nodeps:libs/android-arch/room/runtime-1.1.0-beta3.aar \
- bcradio-android-arch-room-common-nodeps:libs/android-arch/room/common-1.1.0-beta3.jar
+ bcradio-androidx-room-runtime-nodeps:libs/androidx.room/room-runtime-2.0.0-alpha1.aar \
+ bcradio-androidx-room-common-nodeps:libs/androidx.room/room-common-2.0.0-alpha1.jar
include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS)
COMMON_LIBS_PATH := ../../../../prebuilts/tools/common/m2/repository
-MAVEN_LIBS_PATH := ../../../../prebuilts/maven_repo/android
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
- bcradio-android-arch-room-common-nodeps:libs/android-arch/room/common-1.1.0-beta3.jar \
- bcradio-android-arch-room-compiler-nodeps:libs/android-arch/room/compiler-1.1.0-beta3.jar \
- bcradio-android-arch-room-migration-nodeps:libs/android-arch/room/migration-1.1.0-beta3.jar \
- bcradio-android-support-annotations-nodeps:$(MAVEN_LIBS_PATH)/com/android/support/support-annotations/27.1.0/support-annotations-27.1.0.jar \
+ bcradio-androidx-room-common-nodeps:libs/androidx.room/room-common-2.0.0-alpha1.jar \
+ bcradio-androidx-room-compiler-nodeps:libs/androidx.room/room-compiler-2.0.0-alpha1.jar \
+ bcradio-androidx-room-migration-nodeps:libs/androidx.room/room-migration-2.0.0-alpha1.jar \
+ bcradio-androidx-annotation-nodeps:libs/annotation-1.0.0-alpha1.jar \
bcradio-antlr4-nodeps:$(COMMON_LIBS_PATH)/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar \
bcradio-apache-commons-codec-nodeps:$(COMMON_LIBS_PATH)/org/eclipse/tycho/tycho-bundles-external/0.18.1/eclipse/plugins/org.apache.commons.codec_1.4.0.v201209201156.jar \
bcradio-auto-common-nodeps:$(COMMON_LIBS_PATH)/com/google/auto/auto-common/0.9/auto-common-0.9.jar \
diff --git a/libs/android-arch/room/common-1.1.0-beta3.jar b/libs/android-arch/room/common-1.1.0-beta3.jar
deleted file mode 100644
index 8539f0b..0000000
--- a/libs/android-arch/room/common-1.1.0-beta3.jar
+++ /dev/null
Binary files differ
diff --git a/libs/android-arch/room/compiler-1.1.0-beta3.jar b/libs/android-arch/room/compiler-1.1.0-beta3.jar
deleted file mode 100644
index 9fe428f..0000000
--- a/libs/android-arch/room/compiler-1.1.0-beta3.jar
+++ /dev/null
Binary files differ
diff --git a/libs/android-arch/room/migration-1.1.0-beta3.jar b/libs/android-arch/room/migration-1.1.0-beta3.jar
deleted file mode 100644
index 61f4559..0000000
--- a/libs/android-arch/room/migration-1.1.0-beta3.jar
+++ /dev/null
Binary files differ
diff --git a/libs/android-arch/room/runtime-1.1.0-beta3.aar b/libs/android-arch/room/runtime-1.1.0-beta3.aar
deleted file mode 100644
index 89093f7..0000000
--- a/libs/android-arch/room/runtime-1.1.0-beta3.aar
+++ /dev/null
Binary files differ
diff --git a/libs/androidx.room/room-common-2.0.0-alpha1.jar b/libs/androidx.room/room-common-2.0.0-alpha1.jar
new file mode 100644
index 0000000..2c09fdf
--- /dev/null
+++ b/libs/androidx.room/room-common-2.0.0-alpha1.jar
Binary files differ
diff --git a/libs/androidx.room/room-compiler-2.0.0-alpha1.jar b/libs/androidx.room/room-compiler-2.0.0-alpha1.jar
new file mode 100644
index 0000000..a95872d
--- /dev/null
+++ b/libs/androidx.room/room-compiler-2.0.0-alpha1.jar
Binary files differ
diff --git a/libs/androidx.room/room-migration-2.0.0-alpha1.jar b/libs/androidx.room/room-migration-2.0.0-alpha1.jar
new file mode 100644
index 0000000..4851df9
--- /dev/null
+++ b/libs/androidx.room/room-migration-2.0.0-alpha1.jar
Binary files differ
diff --git a/libs/androidx.room/room-runtime-2.0.0-alpha1.aar b/libs/androidx.room/room-runtime-2.0.0-alpha1.aar
new file mode 100644
index 0000000..ca797dd
--- /dev/null
+++ b/libs/androidx.room/room-runtime-2.0.0-alpha1.aar
Binary files differ
diff --git a/libs/annotation-1.0.0-alpha1.jar b/libs/annotation-1.0.0-alpha1.jar
new file mode 100644
index 0000000..3bfd348
--- /dev/null
+++ b/libs/annotation-1.0.0-alpha1.jar
Binary files differ
diff --git a/src/com/android/car/radio/PlayPauseButton.java b/src/com/android/car/radio/PlayPauseButton.java
index 0e1f82d..2f1cb75 100644
--- a/src/com/android/car/radio/PlayPauseButton.java
+++ b/src/com/android/car/radio/PlayPauseButton.java
@@ -28,8 +28,8 @@
public class PlayPauseButton extends ImageView {
private static final String TAG = "Em.PlayPauseButton";
- private final int[] STATE_PLAYING = {R.attr.state_playing};
- private final int[] STATE_PAUSED = {R.attr.state_paused};
+ private static final int[] STATE_PLAYING = {R.attr.state_playing};
+ private static final int[] STATE_PAUSED = {R.attr.state_paused};
private int mPlaybackState = -1;
@@ -40,16 +40,9 @@
/**
* Set the current play state of the button.
*
- * @param playState One of the values from {@link PlaybackState}. Only
- * {@link PlaybackState#STATE_PAUSED} and {@link PlaybackState#STATE_PLAYING}
- * are valid.
+ * @param playState One of the values from {@link PlaybackState}.
*/
public void setPlayState(int playState) {
- if (playState != PlaybackState.STATE_PAUSED && playState != PlaybackState.STATE_PLAYING) {
- throw new IllegalArgumentException("Playback state should be either "
- + "PlaybackState.STATE_PAUSED or PlaybackState.STATE_PLAYING");
- }
-
mPlaybackState = playState;
}
@@ -62,11 +55,14 @@
case PlaybackState.STATE_PLAYING:
mergeDrawableStates(drawableState, STATE_PLAYING);
break;
+ case PlaybackState.STATE_NONE:
case PlaybackState.STATE_PAUSED:
+ case PlaybackState.STATE_STOPPED:
+ case PlaybackState.STATE_CONNECTING:
mergeDrawableStates(drawableState, STATE_PAUSED);
break;
default:
- Log.e(TAG, "Unknown PlaybackState: " + mPlaybackState);
+ Log.e(TAG, "Unsupported PlaybackState: " + mPlaybackState);
}
if (getBackground() != null) {
getBackground().setState(drawableState);
diff --git a/src/com/android/car/radio/RadioController.java b/src/com/android/car/radio/RadioController.java
index 713f64b..8bec5d0 100644
--- a/src/com/android/car/radio/RadioController.java
+++ b/src/com/android/car/radio/RadioController.java
@@ -32,7 +32,6 @@
import android.hardware.radio.RadioManager.ProgramInfo;
import android.hardware.radio.RadioMetadata;
import android.hardware.radio.RadioTuner;
-import android.media.AudioManager;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
@@ -98,20 +97,13 @@
private final RadioDisplayController mRadioDisplayController;
- /**
- * Keeps track of if the user has manually muted the radio. This value is used to determine
- * whether or not to un-mute the radio after an {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT}
- * event has been received.
- */
- private boolean mUserHasMuted;
-
private final RadioStorage mRadioStorage;
private final String mAmBandString;
private final String mFmBandString;
- private List<ProgramInfoChangeListener> mProgramInfoChangeListeners = new ArrayList<>();
- private List<RadioServiceConnectionListener> mRadioServiceConnectionListeners =
+ private final List<ProgramInfoChangeListener> mProgramInfoChangeListeners = new ArrayList<>();
+ private final List<RadioServiceConnectionListener> mRadioServiceConnectionListeners =
new ArrayList<>();
/**
@@ -255,9 +247,6 @@
try {
mRadioDisplayController.setSingleChannelDisplay(mRadioBackground);
- // Ensure the play button properly reflects the current mute state.
- mRadioDisplayController.setPlayPauseButtonState(mRadioManager.isMuted());
-
// TODO(b/73950974): use callback only
ProgramInfo current = mRadioManager.getCurrentProgramInfo();
if (current != null) mCallback.onCurrentProgramInfoChanged(current);
@@ -442,18 +431,6 @@
}
/**
- * Closes any active {@link RadioTuner}s and releases audio focus.
- */
- private void close() {
- if (Log.isLoggable(TAG, Log.DEBUG)) {
- Log.d(TAG, "close()");
- }
-
- // Lost focus, so display that the radio is not playing anymore.
- mRadioDisplayController.setPlayPauseButtonState(true);
- }
-
- /**
* Closes all active connections in the {@link RadioController}.
*/
public void shutdown() {
@@ -471,8 +448,6 @@
Log.e(TAG, "tuneToRadioChannel(); remote exception: " + e.getMessage());
}
}
-
- close();
}
@Override
@@ -515,23 +490,10 @@
mRadioDisplayController.setChannelIsPreset(mRadioStorage.isPreset(sel));
// Notify that the current radio station has changed.
- if (mProgramInfoChangeListeners != null) {
- for (ProgramInfoChangeListener listener : mProgramInfoChangeListeners) {
- listener.onProgramInfoChanged(info);
- }
+ for (ProgramInfoChangeListener listener : mProgramInfoChangeListeners) {
+ listener.onProgramInfoChanged(info);
}
}
-
- @Override
- public void onRadioMuteChanged(boolean isMuted) {
- mRadioDisplayController.setPlayPauseButtonState(isMuted);
- }
-
- @Override
- public void onError(int status) {
- Log.e(TAG, "Radio callback error with status: " + status);
- close();
- }
};
private final View.OnClickListener mBackwardSeekClickListener = new View.OnClickListener() {
@@ -587,11 +549,6 @@
} else {
mRadioManager.mute();
}
-
- boolean isMuted = mRadioManager.isMuted();
-
- mUserHasMuted = isMuted;
- mRadioDisplayController.setPlayPauseButtonState(isMuted);
} catch (RemoteException e) {
Log.e(TAG, "playPauseClickListener(); remote exception: " + e.getMessage());
}
@@ -638,6 +595,7 @@
}
mRadioDisplayController.setEnabled(true);
+ mRadioManager.addPlaybackStateListener(mRadioDisplayController);
if (mRadioErrorDisplay != null) {
mRadioErrorDisplay.setVisibility(View.GONE);
diff --git a/src/com/android/car/radio/RadioDisplayController.java b/src/com/android/car/radio/RadioDisplayController.java
index f9b1b7e..9c1179a 100644
--- a/src/com/android/car/radio/RadioDisplayController.java
+++ b/src/com/android/car/radio/RadioDisplayController.java
@@ -17,17 +17,20 @@
package com.android.car.radio;
import android.content.Context;
-import android.media.session.PlaybackState;
+import android.support.v4.media.session.PlaybackStateCompat;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewStub;
import android.widget.ImageView;
import android.widget.TextView;
+import com.android.car.radio.audio.IPlaybackStateListener;
+import com.android.car.radio.utils.LocalInterface;
+
/**
* Controller that controls the appearance state of various UI elements in the radio.
*/
-public class RadioDisplayController {
+public class RadioDisplayController implements IPlaybackStateListener, LocalInterface {
private final Context mContext;
private TextView mChannelBand;
@@ -225,21 +228,15 @@
}
}
- /**
- * Sets the current state of the play button. If the given {@code muted} value is {@code true},
- * then the button display a play icon. If {@code false}, then the button will display a
- * pause icon.
- */
- public void setPlayPauseButtonState(boolean muted) {
+ @Override
+ public void onPlaybackStateChanged(@PlaybackStateCompat.State int state) {
if (mPlayButton != null) {
- mPlayButton.setPlayState(muted
- ? PlaybackState.STATE_PAUSED : PlaybackState.STATE_PLAYING);
+ mPlayButton.setPlayState(state);
mPlayButton.refreshDrawableState();
}
if (mPresetPlayButton != null) {
- mPresetPlayButton.setPlayState(muted
- ? PlaybackState.STATE_PAUSED : PlaybackState.STATE_PLAYING);
+ mPresetPlayButton.setPlayState(state);
mPresetPlayButton.refreshDrawableState();
}
}
diff --git a/src/com/android/car/radio/RadioService.java b/src/com/android/car/radio/RadioService.java
index 5cbe278..e51a2ab 100644
--- a/src/com/android/car/radio/RadioService.java
+++ b/src/com/android/car/radio/RadioService.java
@@ -28,7 +28,6 @@
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v4.media.MediaBrowserCompat.MediaItem;
-import android.support.v4.media.session.PlaybackStateCompat;
import android.util.Log;
import androidx.media.MediaBrowserServiceCompat;
@@ -44,6 +43,7 @@
import com.android.car.radio.service.IRadioCallback;
import com.android.car.radio.service.IRadioManager;
import com.android.car.radio.storage.RadioStorage;
+import com.android.car.radio.utils.LocalInterface;
import java.util.ArrayList;
import java.util.HashSet;
@@ -58,7 +58,7 @@
*
* <p>Utilize the {@link RadioBinder} to perform radio operations.
*/
-public class RadioService extends MediaBrowserServiceCompat implements IPlaybackStateListener {
+public class RadioService extends MediaBrowserServiceCompat implements LocalInterface {
private static String TAG = "BcRadioApp.uisrv";
@@ -138,8 +138,6 @@
mRadioStorage.addPresetsChangeListener(mPresetsListener);
onPresetsChanged();
- mAudioStreamController.addPlaybackStateListener(this);
-
openRadioBandInternal(mRadioStorage.getStoredRadioBand());
mRadioSuccessfullyInitialized = true;
@@ -216,23 +214,6 @@
}
}
- /* TODO(b/73950974): remove onRadioMuteChanged from IRadioCallback,
- * use IPlaybackStateListener directly.
- */
- @Override
- public void onPlaybackStateChanged(@PlaybackStateCompat.State int state) {
- boolean muted = state != PlaybackStateCompat.STATE_PLAYING;
- synchronized (mLock) {
- for (IRadioCallback callback : mRadioTunerCallbacks) {
- try {
- callback.onRadioMuteChanged(muted);
- } catch (RemoteException e) {
- Log.e(TAG, "Mute state change callback failed", e);
- }
- }
- }
- }
-
/**
* Closes any active {@link RadioTuner}s and releases audio focus.
*/
@@ -379,6 +360,16 @@
return mCurrentProgram;
}
+ @Override
+ public void addPlaybackStateListener(IPlaybackStateListener callback) {
+ mAudioStreamController.addPlaybackStateListener(callback);
+ }
+
+ @Override
+ public void removePlaybackStateListener(IPlaybackStateListener callback) {
+ mAudioStreamController.removePlaybackStateListener(callback);
+ }
+
/**
* Returns {@code true} if the radio was able to successfully initialize. A value of
* {@code false} here could mean that the {@code RadioService} was not able to connect to
@@ -442,14 +433,6 @@
mReOpenRadioTunerCount++;
}
-
- try {
- for (IRadioCallback callback : mRadioTunerCallbacks) {
- callback.onError(status);
- }
- } catch (RemoteException e) {
- Log.e(TAG, "onError(); Failed to notify IRadioCallbacks: " + e.getMessage());
- }
}
@Override
@@ -494,9 +477,4 @@
return super.onStartCommand(intent, flags, startId);
}
-
- @Override
- public IBinder asBinder() {
- throw new UnsupportedOperationException("Not a binder");
- }
}
diff --git a/src/com/android/car/radio/media/TunerSession.java b/src/com/android/car/radio/media/TunerSession.java
index 3b77057..a565046 100644
--- a/src/com/android/car/radio/media/TunerSession.java
+++ b/src/com/android/car/radio/media/TunerSession.java
@@ -23,7 +23,6 @@
import android.hardware.radio.RadioManager.ProgramInfo;
import android.net.Uri;
import android.os.Bundle;
-import android.os.IBinder;
import android.os.RemoteException;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.RatingCompat;
@@ -39,6 +38,7 @@
import com.android.car.radio.R;
import com.android.car.radio.audio.IPlaybackStateListener;
import com.android.car.radio.service.IRadioManager;
+import com.android.car.radio.utils.LocalInterface;
import com.android.car.radio.utils.ThrowingRunnable;
import java.util.Objects;
@@ -46,7 +46,8 @@
/**
* Implementation of tuner's MediaSession.
*/
-public class TunerSession extends MediaSessionCompat implements IPlaybackStateListener {
+public class TunerSession extends MediaSessionCompat
+ implements IPlaybackStateListener, LocalInterface {
private static final String TAG = "BcRadioApp.msess";
private final Object mLock = new Object();
@@ -191,9 +192,4 @@
}
}
}
-
- @Override
- public IBinder asBinder() {
- throw new UnsupportedOperationException("Not a binder");
- }
}
diff --git a/src/com/android/car/radio/service/IRadioCallback.aidl b/src/com/android/car/radio/service/IRadioCallback.aidl
index d1ecf93..95bab45 100644
--- a/src/com/android/car/radio/service/IRadioCallback.aidl
+++ b/src/com/android/car/radio/service/IRadioCallback.aidl
@@ -29,19 +29,4 @@
* @param info The current program info.
*/
void onCurrentProgramInfoChanged(in RadioManager.ProgramInfo info);
-
- /**
- * Called when the mute state of the radio has changed.
- *
- * @param isMuted {@code true} if the radio is muted.
- */
- void onRadioMuteChanged(boolean isMuted);
-
- /**
- * Called when the radio has encountered an error.
- *
- * @param status One of the error states in {@link RadioManager}. For example,
- * {@link RadioManager#ERROR_HARDWARE_FAILURE}.
- */
- void onError(int status);
}
diff --git a/src/com/android/car/radio/service/IRadioManager.aidl b/src/com/android/car/radio/service/IRadioManager.aidl
index ba005ba..4902c4b 100644
--- a/src/com/android/car/radio/service/IRadioManager.aidl
+++ b/src/com/android/car/radio/service/IRadioManager.aidl
@@ -19,6 +19,7 @@
import android.hardware.radio.RadioManager;
import com.android.car.broadcastradio.support.Program;
+import com.android.car.radio.audio.IPlaybackStateListener;
import com.android.car.radio.service.IRadioCallback;
/**
@@ -96,6 +97,16 @@
RadioManager.ProgramInfo getCurrentProgramInfo();
/**
+ * Adds {@link IPlaybackStateListener} listener for play/pause notifications.
+ */
+ void addPlaybackStateListener(in IPlaybackStateListener callback);
+
+ /**
+ * Removes {@link IPlaybackStateListener} listener.
+ */
+ void removePlaybackStateListener(in IPlaybackStateListener callback);
+
+ /**
* Returns {@code true} if the radio was able to successfully initialize. A value of
* {@code false} here could mean that the {@code RadioService} was not able to connect to
* the {@link RadioManager} or there were no radio modules on the current device.
diff --git a/src/com/android/car/radio/storage/Favorite.java b/src/com/android/car/radio/storage/Favorite.java
index 596099b..07f3baf 100644
--- a/src/com/android/car/radio/storage/Favorite.java
+++ b/src/com/android/car/radio/storage/Favorite.java
@@ -16,11 +16,12 @@
package com.android.car.radio.storage;
-import android.arch.persistence.room.Embedded;
-import android.arch.persistence.room.Entity;
-import android.arch.persistence.room.PrimaryKey;
import android.hardware.radio.ProgramSelector;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
+import androidx.room.Embedded;
+import androidx.room.Entity;
+import androidx.room.PrimaryKey;
import com.android.car.broadcastradio.support.Program;
diff --git a/src/com/android/car/radio/storage/IdentifierEntity.java b/src/com/android/car/radio/storage/IdentifierEntity.java
index ccda8ba..1068f9b 100644
--- a/src/com/android/car/radio/storage/IdentifierEntity.java
+++ b/src/com/android/car/radio/storage/IdentifierEntity.java
@@ -16,11 +16,12 @@
package com.android.car.radio.storage;
-import android.annotation.Nullable;
-import android.arch.persistence.room.Entity;
import android.hardware.radio.ProgramSelector;
import android.hardware.radio.ProgramSelector.IdentifierType;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.room.Entity;
@Entity
class IdentifierEntity {
diff --git a/src/com/android/car/radio/storage/ProgramSelectorConverter.java b/src/com/android/car/radio/storage/ProgramSelectorConverter.java
index a41a527..8354046 100644
--- a/src/com/android/car/radio/storage/ProgramSelectorConverter.java
+++ b/src/com/android/car/radio/storage/ProgramSelectorConverter.java
@@ -16,10 +16,11 @@
package com.android.car.radio.storage;
-import android.arch.persistence.room.TypeConverter;
import android.hardware.radio.ProgramSelector;
import android.net.Uri;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
+import androidx.room.TypeConverter;
import com.android.car.broadcastradio.support.platform.ProgramSelectorExt;
diff --git a/src/com/android/car/radio/storage/RadioDatabase.java b/src/com/android/car/radio/storage/RadioDatabase.java
index 29e9078..4473dd6 100644
--- a/src/com/android/car/radio/storage/RadioDatabase.java
+++ b/src/com/android/car/radio/storage/RadioDatabase.java
@@ -16,20 +16,21 @@
package com.android.car.radio.storage;
-import android.annotation.WorkerThread;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.Transformations;
-import android.arch.persistence.room.Dao;
-import android.arch.persistence.room.Database;
-import android.arch.persistence.room.Insert;
-import android.arch.persistence.room.OnConflictStrategy;
-import android.arch.persistence.room.Query;
-import android.arch.persistence.room.Room;
-import android.arch.persistence.room.RoomDatabase;
-import android.arch.persistence.room.TypeConverters;
import android.content.Context;
import android.hardware.radio.ProgramSelector;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.WorkerThread;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.Transformations;
+import androidx.room.Dao;
+import androidx.room.Database;
+import androidx.room.Insert;
+import androidx.room.OnConflictStrategy;
+import androidx.room.Query;
+import androidx.room.Room;
+import androidx.room.RoomDatabase;
+import androidx.room.TypeConverters;
import com.android.car.broadcastradio.support.Program;
diff --git a/src/com/android/car/radio/storage/RadioStorage.java b/src/com/android/car/radio/storage/RadioStorage.java
index b77a64c..4598bc3 100644
--- a/src/com/android/car/radio/storage/RadioStorage.java
+++ b/src/com/android/car/radio/storage/RadioStorage.java
@@ -16,9 +16,6 @@
package com.android.car.radio.storage;
-import android.annotation.NonNull;
-import android.arch.lifecycle.LiveData;
-import android.arch.lifecycle.Observer;
import android.content.Context;
import android.content.SharedPreferences;
import android.hardware.radio.ProgramSelector;
@@ -26,6 +23,10 @@
import android.os.AsyncTask;
import android.util.Log;
+import androidx.annotation.NonNull;
+import androidx.lifecycle.LiveData;
+import androidx.lifecycle.Observer;
+
import com.android.car.broadcastradio.support.Program;
import com.android.car.radio.utils.ProgramSelectorUtils;
diff --git a/src/com/android/car/radio/utils/LocalInterface.java b/src/com/android/car/radio/utils/LocalInterface.java
new file mode 100644
index 0000000..ddc9fa7
--- /dev/null
+++ b/src/com/android/car/radio/utils/LocalInterface.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.radio.utils;
+
+import android.os.IBinder;
+import android.os.IInterface;
+
+/**
+ * Marks given I-Class as not-a-binder.
+ *
+ * It saves some copy-pasting for interfaces that are not meant to be used cross-process.
+ */
+public interface LocalInterface extends IInterface {
+ /**
+ * Dummy implementation of {@link IInterface#asBinder}.
+ */
+ default IBinder asBinder() {
+ throw new UnsupportedOperationException("Not a binder");
+ }
+}