Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1882a02f authored by Jorge Ruesga's avatar Jorge Ruesga Committed by Steve Kondik
Browse files

base: start nfc service prior to systemui

Since registration of NfcService as a manager service happens in the first run of the Nfc app,
and since the SystemUi makes use of this manager service through the NfcTile, NfcManager
can lead into a null reference for the NfcAdapter because the NfcService isn't registered
when the SystemUi starts (this condition depends on the device speed to bring up the call
to the apps).
This change adds a noop service that allow to be called by SystemServer before start the
systemui and ensure that NfcService is available before apps start using NfcManager.

Depends on: http://review.cyanogenmod.org/#/c/108684/
Additional info: http://review.cyanogenmod.org/#/c/108411



TICKET: CYNGNOS-848
Change-Id: Iea84c672762a62946e5708396d8d3b56166eaee8
Signed-off-by: default avatarJorge Ruesga <jorge@ruesga.com>
parent f826b24a
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -1204,6 +1204,15 @@ public final class SystemServer {
                Slog.i(TAG, "WebViewFactory preparation");
                WebViewFactory.prepareWebViewInSystemServer();

                // Start Nfc before SystemUi to ensure NfcTile and other apps gets a
                // valid NfcAdapter from NfcManager
                try {
                    startNfcService(context);
                } catch (Throwable e) {
                    // Don't crash. Nfc is an optional service. Just annotate that isn't ready
                    Slog.e(TAG, "Nfc service didn't start. Nfc will not be available.", e);
                }

                try {
                    startSystemUi(context);
                } catch (Throwable e) {
@@ -1333,4 +1342,23 @@ public final class SystemServer {
        //Slog.d(TAG, "Starting service: " + intent);
        context.startServiceAsUser(intent, UserHandle.OWNER);
    }

    static final void startNfcService(Context context) {
        IPackageManager pm = ActivityThread.getPackageManager();
        if (pm == null) {
            Slog.w(TAG, "Cannot get package manager, assuming no NFC feature");
            return;
        }
        try {
            if (pm.hasSystemFeature(PackageManager.FEATURE_NFC)) {
                Intent intent = new Intent();
                intent.setComponent(new ComponentName("com.android.nfc",
                            "com.android.nfc.NfcBootstrapService"));
                context.startServiceAsUser(intent, UserHandle.OWNER);
            }
        } catch (RemoteException e) {
            Slog.w(TAG, "Package manager query failed, assuming no NFC feature", e);
            return;
        }
    }
}