From c36d72b76800064828c32b03bac02e43969a4b82 Mon Sep 17 00:00:00 2001 From: nchalko Date: Wed, 19 Dec 2018 10:33:22 -0800 Subject: Use HasSingletons for application singletons PiperOrigin-RevId: 226195173 Change-Id: Ie0272d84d56e2a43d95a1ff2c4b6859370ca6283 --- common/src/com/android/tv/common/BaseApplication.java | 8 +++++++- common/src/com/android/tv/common/singletons/HasSingletons.java | 7 +++++++ src/com/android/tv/TvSingletons.java | 8 +++++++- src/com/android/tv/app/LiveTvApplication.java | 9 ++++++++- tests/common/src/com/android/tv/testing/TestSingletonApp.java | 9 ++++++++- tests/unit/src/com/android/tv/util/MockTvSingletons.java | 8 +++++++- 6 files changed, 44 insertions(+), 5 deletions(-) diff --git a/common/src/com/android/tv/common/BaseApplication.java b/common/src/com/android/tv/common/BaseApplication.java index 6166b46b..566bd25b 100644 --- a/common/src/com/android/tv/common/BaseApplication.java +++ b/common/src/com/android/tv/common/BaseApplication.java @@ -40,7 +40,13 @@ public abstract class BaseApplication extends Application implements BaseSinglet */ @VisibleForTesting public static BaseSingletons sSingletons; - /** Returns the {@link BaseSingletons} using the application context. */ + /** + * Returns the {@link BaseSingletons} using the application context. + * + * @deprecated use {@link com.android.tv.common.singletons.HasSingletons#get(Class, Context)} + * instead + */ + @Deprecated public static BaseSingletons getSingletons(Context context) { // STOP-SHIP: changing the method to protected once the Tuner application is created. // No need to be "synchronized" because this doesn't create any instance. diff --git a/common/src/com/android/tv/common/singletons/HasSingletons.java b/common/src/com/android/tv/common/singletons/HasSingletons.java index b72ee4fc..193aed3a 100644 --- a/common/src/com/android/tv/common/singletons/HasSingletons.java +++ b/common/src/com/android/tv/common/singletons/HasSingletons.java @@ -15,12 +15,19 @@ */ package com.android.tv.common.singletons; +import android.content.Context; + /** * A type that can know about and supply a singleton, typically a type t such as an android activity * or application. */ public interface HasSingletons { + @SuppressWarnings("unchecked") // injection + static C get(Class clazz, Context context) { + return ((HasSingletons) context).singletons(); + } + /** Returns the strongly typed singleton. */ C singletons(); } diff --git a/src/com/android/tv/TvSingletons.java b/src/com/android/tv/TvSingletons.java index f582b236..89e45a81 100644 --- a/src/com/android/tv/TvSingletons.java +++ b/src/com/android/tv/TvSingletons.java @@ -44,7 +44,13 @@ import javax.inject.Provider; /** Interface with getters for application scoped singletons. */ public interface TvSingletons extends BaseSingletons, HasBuiltInTunerManager { - /** Returns the @{@link TvSingletons} using the application context. */ + /** + * Returns the @{@link TvSingletons} using the application context. + * + * @deprecated use {@link com.android.tv.common.singletons.HasSingletons#get(Class, Context)} + * instead + */ + @Deprecated static TvSingletons getSingletons(Context context) { return (TvSingletons) BaseApplication.getSingletons(context); } diff --git a/src/com/android/tv/app/LiveTvApplication.java b/src/com/android/tv/app/LiveTvApplication.java index db20846c..0646e104 100644 --- a/src/com/android/tv/app/LiveTvApplication.java +++ b/src/com/android/tv/app/LiveTvApplication.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.media.tv.TvContract; import com.android.tv.TvActivity; import com.android.tv.TvApplication; +import com.android.tv.TvSingletons; import com.android.tv.analytics.Analytics; import com.android.tv.analytics.StubAnalytics; import com.android.tv.analytics.Tracker; @@ -30,6 +31,7 @@ import com.android.tv.common.experiments.ExperimentLoader; import com.android.tv.common.flags.impl.DefaultBackendKnobsFlags; import com.android.tv.common.flags.impl.DefaultCloudEpgFlags; import com.android.tv.common.flags.impl.DefaultConcurrentDvrPlaybackFlags; +import com.android.tv.common.singletons.HasSingletons; import com.android.tv.common.util.CommonUtils; import com.android.tv.data.epg.EpgReader; import com.android.tv.data.epg.StubEpgReader; @@ -44,7 +46,7 @@ import com.google.common.base.Optional; import javax.inject.Provider; /** The top level application for Live TV. */ -public class LiveTvApplication extends TvApplication { +public class LiveTvApplication extends TvApplication implements HasSingletons { static { PERFORMANCE_MONITOR_MANAGER.getStartupMeasure().onAppClassLoaded(); @@ -169,4 +171,9 @@ public class LiveTvApplication extends TvApplication { public DefaultConcurrentDvrPlaybackFlags getConcurrentDvrPlaybackFlags() { return mConcurrentDvrPlaybackFlags; } + + @Override + public TvSingletons singletons() { + return this; + } } diff --git a/tests/common/src/com/android/tv/testing/TestSingletonApp.java b/tests/common/src/com/android/tv/testing/TestSingletonApp.java index de0db8ce..199ce98e 100644 --- a/tests/common/src/com/android/tv/testing/TestSingletonApp.java +++ b/tests/common/src/com/android/tv/testing/TestSingletonApp.java @@ -33,6 +33,7 @@ import com.android.tv.common.flags.impl.DefaultCloudEpgFlags; import com.android.tv.common.flags.impl.DefaultConcurrentDvrPlaybackFlags; import com.android.tv.common.flags.impl.DefaultExoplayer2Flags; import com.android.tv.common.recording.RecordingStorageStatusManager; +import com.android.tv.common.singletons.HasSingletons; import com.android.tv.common.util.Clock; import com.android.tv.data.ChannelDataManager; import com.android.tv.data.PreviewDataManager; @@ -60,7 +61,8 @@ import java.util.concurrent.Executor; import javax.inject.Provider; /** Test application for Live TV. */ -public class TestSingletonApp extends Application implements TvSingletons, HasTunerSessionFactory { +public class TestSingletonApp extends Application + implements TvSingletons, HasTunerSessionFactory, HasSingletons { public final FakeClock fakeClock = FakeClock.createWithCurrentTime(); public final FakeEpgReader epgReader = new FakeEpgReader(fakeClock); public final FakeEpgFetcher epgFetcher = new FakeEpgFetcher(); @@ -271,4 +273,9 @@ public class TestSingletonApp extends Application implements TvSingletons, HasTu public TunerSessionFactory getTunerSessionFactory() { return mTunerSessionFactory; } + + @Override + public TvSingletons singletons() { + return this; + } } diff --git a/tests/unit/src/com/android/tv/util/MockTvSingletons.java b/tests/unit/src/com/android/tv/util/MockTvSingletons.java index d59ef2d4..f16722f3 100644 --- a/tests/unit/src/com/android/tv/util/MockTvSingletons.java +++ b/tests/unit/src/com/android/tv/util/MockTvSingletons.java @@ -29,6 +29,7 @@ import com.android.tv.common.flags.impl.DefaultBackendKnobsFlags; import com.android.tv.common.flags.impl.DefaultCloudEpgFlags; import com.android.tv.common.flags.impl.DefaultConcurrentDvrPlaybackFlags; import com.android.tv.common.recording.RecordingStorageStatusManager; +import com.android.tv.common.singletons.HasSingletons; import com.android.tv.common.util.Clock; import com.android.tv.data.ChannelDataManager; import com.android.tv.data.PreviewDataManager; @@ -48,7 +49,7 @@ import java.util.concurrent.Executor; import javax.inject.Provider; /** Mock {@link TvSingletons} class. */ -public class MockTvSingletons implements TvSingletons { +public class MockTvSingletons implements TvSingletons, HasSingletons { public final FakeClock fakeClock = FakeClock.createWithCurrentTime(); private final TvApplication mApp; @@ -228,4 +229,9 @@ public class MockTvSingletons implements TvSingletons { public DefaultConcurrentDvrPlaybackFlags getConcurrentDvrPlaybackFlags() { return mConcurrentDvrPlaybackFlags; } + + @Override + public TvSingletons singletons() { + return this; + } } -- cgit v1.2.3