Improved generics on AbstractMasterSystemService / AbstractPerUserSystemService.

Bug: 117779333
Test: atest CtsAutoFillServiceTestCases

Change-Id: I777fbe44aa395372eba3c97a1c18c2de4c771dd4
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 31238df..17d8ea7 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -89,7 +89,7 @@
  * {@link AutofillManagerServiceImpl} itself.
  */
 public final class AutofillManagerService
-        extends AbstractMasterSystemService<AutofillManagerServiceImpl> {
+        extends AbstractMasterSystemService<AutofillManagerService, AutofillManagerServiceImpl> {
 
     private static final String TAG = "AutofillManagerService";
 
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 4810355..67ccc9b 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -86,7 +86,7 @@
  *
  */
 final class AutofillManagerServiceImpl
-        extends AbstractPerUserSystemService<AutofillManagerServiceImpl> {
+        extends AbstractPerUserSystemService<AutofillManagerServiceImpl, AutofillManagerService> {
 
     private static final String TAG = "AutofillManagerServiceImpl";
     private static final int MAX_SESSION_ID_CREATE_TRIES = 2048;
diff --git a/services/core/java/com/android/server/AbstractMasterSystemService.java b/services/core/java/com/android/server/AbstractMasterSystemService.java
index 6cae887..9c1e3cd 100644
--- a/services/core/java/com/android/server/AbstractMasterSystemService.java
+++ b/services/core/java/com/android/server/AbstractMasterSystemService.java
@@ -62,13 +62,14 @@
  * <p>See {@code com.android.server.autofill.AutofillManagerService} for a concrete
  * (no pun intended) example of how to use it.
  *
+ * @param <M> "master" service class.
  * @param <S> "real" service class.
  *
  * @hide
  */
 // TODO(b/117779333): improve javadoc above instead of using Autofill as an example
-public abstract class AbstractMasterSystemService<S extends AbstractPerUserSystemService<S>>
-        extends SystemService {
+public abstract class AbstractMasterSystemService<M extends AbstractMasterSystemService<M, S>,
+        S extends AbstractPerUserSystemService<S, M>> extends SystemService {
 
     /**
      * Log tag
diff --git a/services/core/java/com/android/server/AbstractPerUserSystemService.java b/services/core/java/com/android/server/AbstractPerUserSystemService.java
index 97977df..b37888f 100644
--- a/services/core/java/com/android/server/AbstractPerUserSystemService.java
+++ b/services/core/java/com/android/server/AbstractPerUserSystemService.java
@@ -41,17 +41,19 @@
  * Companion for {@link AbstractMasterSystemService}, it's the base class for the "real" service
  * implementation.
  *
- * @param <S> itself
+ * @param <M> "master" service class.
+ * @param <S> "real" service class.
  *
  * @hide
  */
-public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSystemService<S>> {
+public abstract class AbstractPerUserSystemService<S extends AbstractPerUserSystemService<S, M>,
+        M extends AbstractMasterSystemService<M, S>> {
 
     protected final @UserIdInt int mUserId;
     protected final Object mLock;
     protected final String mTag = getClass().getSimpleName();
 
-    protected final AbstractMasterSystemService<S> mMaster;
+    protected final M mMaster;
 
     /**
      * Whether service was disabled for user due to {@link UserManager} restrictions.
@@ -68,8 +70,8 @@
     @GuardedBy("mLock")
     private ServiceInfo mServiceInfo;
 
-    protected AbstractPerUserSystemService(@NonNull AbstractMasterSystemService<S> master,
-            @NonNull Object lock, @UserIdInt int userId) {
+    protected AbstractPerUserSystemService(@NonNull M master, @NonNull Object lock,
+            @UserIdInt int userId) {
         mMaster = master;
         mLock = lock;
         mUserId = userId;
diff --git a/services/intelligence/java/com/android/server/intelligence/IntelligenceManagerService.java b/services/intelligence/java/com/android/server/intelligence/IntelligenceManagerService.java
index fcfd246..3d13570 100644
--- a/services/intelligence/java/com/android/server/intelligence/IntelligenceManagerService.java
+++ b/services/intelligence/java/com/android/server/intelligence/IntelligenceManagerService.java
@@ -46,8 +46,8 @@
  * <p>The data collected by this service can be analyzed and combined with other sources to provide
  * contextual data in other areas of the system such as Autofill.
  */
-public final class IntelligenceManagerService
-        extends AbstractMasterSystemService<IntelligencePerUserService> {
+public final class IntelligenceManagerService extends
+        AbstractMasterSystemService<IntelligenceManagerService, IntelligencePerUserService> {
 
     private static final String TAG = "IntelligenceManagerService";
 
diff --git a/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java b/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java
index 471b40f..3b9c4e2 100644
--- a/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java
+++ b/services/intelligence/java/com/android/server/intelligence/IntelligencePerUserService.java
@@ -42,7 +42,8 @@
  * Per-user instance of {@link IntelligenceManagerService}.
  */
 final class IntelligencePerUserService
-        extends AbstractPerUserSystemService<IntelligencePerUserService> {
+        extends AbstractPerUserSystemService<IntelligencePerUserService,
+            IntelligenceManagerService> {
 
     private static final String TAG = "IntelligencePerUserService";