From b271dcf279d0818c01c080827141a1ac311250c2 Mon Sep 17 00:00:00 2001 From: Adnan Begovic Date: Fri, 25 Mar 2016 12:43:22 -0700 Subject: [PATCH] cmsdk: Mandate partner feature xml's for service implementation. The feature xml plays two roles: 1) To allow sdk interface (constructor) to throw when system service is unavailable. This allows for clearer platform development debugging. 2) To allow for simpler disambiguation of what services to instrument in a modular environment. Change-Id: Ic980225df9c115e97f7147cf043cf92bbb225f01 TICKET: CYNGNOS-2293 --- .../platform/internal/PartnerInterfaceService.java | 8 +++++++- src/java/cyanogenmod/app/CMContextConstants.java | 8 ++++++++ src/java/cyanogenmod/app/PartnerInterface.java | 6 ++++++ .../tests/settings/unit/CMPartnerInterfaceTest.java | 5 +++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/cm/lib/main/java/org/cyanogenmod/platform/internal/PartnerInterfaceService.java b/cm/lib/main/java/org/cyanogenmod/platform/internal/PartnerInterfaceService.java index a7a1daa..8810149 100644 --- a/cm/lib/main/java/org/cyanogenmod/platform/internal/PartnerInterfaceService.java +++ b/cm/lib/main/java/org/cyanogenmod/platform/internal/PartnerInterfaceService.java @@ -60,7 +60,13 @@ public class PartnerInterfaceService extends SystemService { public PartnerInterfaceService(Context context) { super(context); mContext = context; - publishBinderService(CMContextConstants.CM_PARTNER_INTERFACE, mService); + if (mContext.getPackageManager().hasSystemFeature( + CMContextConstants.Features.PERFORMANCE)) { + publishBinderService(CMContextConstants.CM_PARTNER_INTERFACE, mService); + } else { + Log.wtf(TAG, "CM partner service started by system server but feature xml not" + + " declared. Not publishing binder service!"); + } } @Override diff --git a/src/java/cyanogenmod/app/CMContextConstants.java b/src/java/cyanogenmod/app/CMContextConstants.java index e34f211..e90d8ed 100644 --- a/src/java/cyanogenmod/app/CMContextConstants.java +++ b/src/java/cyanogenmod/app/CMContextConstants.java @@ -173,5 +173,13 @@ public final class CMContextConstants { */ @SdkConstant(SdkConstant.SdkConstantType.FEATURE) public static final String PERFORMANCE = "org.cyanogenmod.performance"; + + /** + * Feature for {@link PackageManager#getSystemAvailableFeatures} and + * {@link PackageManager#hasSystemFeature}: The device includes the cm partner service + * utilized by the cmsdk. + */ + @SdkConstant(SdkConstant.SdkConstantType.FEATURE) + public static final String PARTNER = "org.cyanogenmod.partner"; } } diff --git a/src/java/cyanogenmod/app/PartnerInterface.java b/src/java/cyanogenmod/app/PartnerInterface.java index b06effd..a7661ff 100644 --- a/src/java/cyanogenmod/app/PartnerInterface.java +++ b/src/java/cyanogenmod/app/PartnerInterface.java @@ -83,6 +83,12 @@ public class PartnerInterface { mContext = context; } sService = getService(); + if (context.getPackageManager().hasSystemFeature( + CMContextConstants.Features.PARTNER) && sService == null) { + throw new RuntimeException("Unable to get PartnerInterfaceService. The service" + + " either crashed, was not started, or the interface has been called to early" + + " in SystemServer init"); + } } /** diff --git a/tests/src/org/cyanogenmod/tests/settings/unit/CMPartnerInterfaceTest.java b/tests/src/org/cyanogenmod/tests/settings/unit/CMPartnerInterfaceTest.java index ec28d0a..c1ac0de 100644 --- a/tests/src/org/cyanogenmod/tests/settings/unit/CMPartnerInterfaceTest.java +++ b/tests/src/org/cyanogenmod/tests/settings/unit/CMPartnerInterfaceTest.java @@ -29,6 +29,8 @@ import android.test.suitebuilder.annotation.SmallTest; import android.provider.Settings; import android.text.format.DateUtils; import android.util.Log; + +import cyanogenmod.app.CMContextConstants; import cyanogenmod.app.PartnerInterface; import java.util.List; @@ -45,6 +47,9 @@ public class CMPartnerInterfaceTest extends AndroidTestCase { @Override protected void setUp() throws Exception { super.setUp(); + // Only run this if we support partner interfaces + org.junit.Assume.assumeTrue(mContext.getPackageManager().hasSystemFeature( + CMContextConstants.Features.PARTNER)); mPartnerInterface = PartnerInterface.getInstance(getContext()); setupAirplaneModeTests();