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

Commit e6c626e5 authored by Suprabh Shukla's avatar Suprabh Shukla
Browse files

Report start and end for NLS binder calls

Adding explicit start and end signals for the processing of NLS
callbacks. Since the callbacks are made on the app's main thread, added
a grace period of 10 seconds for the app to allow execution.

Flag: android.service.notification.report_nls_start_and_end

Test: atest FrameworksUiServicesNotificationTests:ManagedServicesTest
Test: atest\
FrameworksUiServicesNotificationTests:NotificationListenerWrapperTest
Test: atest\
FrameworksUiServicesNotificationTests:NotificationListenersTest

Bug: 344050265
Change-Id: If27148379c9e5f86f53923f735c7c397ea965812
parent da4bf7d7
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
/**
 * Copyright (c) 2025, 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 android.service.notification;

import android.os.IBinder;

/**
 * Callback from app into system process to indicate that the "dispatch" of a notification
 * event (by calling the corresponding NotificationListenerService API method on the main thread)
 * was completed or there was an error that resulted in no dispatch. This does not signal that the
 * app completed processing the event. It may still be doing that off the main thread.
 * {@hide}
 */
interface IDispatchCompletionListener {
    void notifyDispatchComplete(in long dispatchToken);
}
+15 −11
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.pm.ParceledListSlice;
import android.os.Bundle;
import android.os.UserHandle;
import android.service.notification.NotificationStats;
import android.service.notification.IDispatchCompletionListener;
import android.service.notification.IStatusBarNotificationHolder;
import android.service.notification.StatusBarNotification;
import android.service.notification.NotificationRankingUpdate;
@@ -31,24 +32,27 @@ import android.service.notification.NotificationRankingUpdate;
oneway interface INotificationListener
{
    // listeners and assistant
    void onListenerConnected(in NotificationRankingUpdate update);
    void onListenerConnected(in NotificationRankingUpdate update,
            in IDispatchCompletionListener completionCallback, in long dispatchToken);
    void onNotificationPosted(in IStatusBarNotificationHolder notificationHolder,
            in NotificationRankingUpdate update);
            in NotificationRankingUpdate update, in long dispatchToken);
    void onNotificationPostedFull(in StatusBarNotification sbn,
            in NotificationRankingUpdate update);
    void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons);
            in NotificationRankingUpdate update, in long dispatchToken);
    void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons, in long dispatchToken);
    // stats only for assistant
    void onNotificationRemoved(in IStatusBarNotificationHolder notificationHolder,
            in NotificationRankingUpdate update, in NotificationStats stats, int reason);
            in NotificationRankingUpdate update, in NotificationStats stats, int reason,
            in long dispatchToken);
    void onNotificationRemovedFull(in StatusBarNotification sbn,
                in NotificationRankingUpdate update, in NotificationStats stats, int reason);
    void onNotificationRankingUpdate(in NotificationRankingUpdate update);
    void onListenerHintsChanged(int hints);
    void onInterruptionFilterChanged(int interruptionFilter);
                in NotificationRankingUpdate update, in NotificationStats stats, int reason,
                in long dispatchToken);
    void onNotificationRankingUpdate(in NotificationRankingUpdate update, in long dispatchToken);
    void onListenerHintsChanged(int hints, in long dispatchToken);
    void onInterruptionFilterChanged(int interruptionFilter, in long dispatchToken);

    // companion device managers and assistants only
    void onNotificationChannelModification(String pkgName, in UserHandle user, in NotificationChannel channel, int modificationType);
    void onNotificationChannelGroupModification(String pkgName, in UserHandle user, in NotificationChannelGroup group, int modificationType);
    void onNotificationChannelModification(String pkgName, in UserHandle user, in NotificationChannel channel, int modificationType, in long dispatchToken);
    void onNotificationChannelGroupModification(String pkgName, in UserHandle user, in NotificationChannelGroup group, int modificationType, in long dispatchToken);

    // assistants only
    void onNotificationEnqueuedWithChannel(in IStatusBarNotificationHolder notificationHolder, in NotificationChannel channel, in NotificationRankingUpdate update);
+109 −28
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UiThread;
import android.app.ActivityManager;
import android.app.INotificationManager;
@@ -433,6 +432,9 @@ public abstract class NotificationListenerService extends Service {
    @GuardedBy("mLock")
    private RankingMap mRankingMap;

    @GuardedBy("mLock")
    private IDispatchCompletionListener mCompletionListener;

    /**
     * @hide
     */
@@ -465,6 +467,16 @@ public abstract class NotificationListenerService extends Service {
        mHandler = new MyHandler(getMainLooper());
    }

    /**
     * Returns the handler for tests.
     * @hide
     */
    @VisibleForTesting
    @Nullable
    public final Handler getHandler() {
        return mHandler;
    }

    /**
     * Implement this method to learn about new notifications as they are posted by apps.
     *
@@ -1315,6 +1327,9 @@ public abstract class NotificationListenerService extends Service {

    @Override
    public void onDestroy() {
        synchronized (mLock) {
            mCompletionListener = null;
        }
        onListenerDisconnected();
        super.onDestroy();
    }
@@ -1480,24 +1495,26 @@ public abstract class NotificationListenerService extends Service {
    protected class NotificationListenerWrapper extends INotificationListener.Stub {
        @Override
        public void onNotificationPosted(IStatusBarNotificationHolder sbnHolder,
                NotificationRankingUpdate update) {
                NotificationRankingUpdate update, long dispatchToken) {
            StatusBarNotification sbn;
            try {
                sbn = sbnHolder.get();
            } catch (RemoteException e) {
                Log.w(TAG, "onNotificationPosted: Error receiving StatusBarNotification", e);
                notifyDispatchCompletion(dispatchToken);
                return;
            }
            if (sbn == null) {
                Log.w(TAG, "onNotificationPosted: Error receiving StatusBarNotification");
                notifyDispatchCompletion(dispatchToken);
                return;
            }
            onNotificationPostedFull(sbn, update);
            onNotificationPostedFull(sbn, update, dispatchToken);
        }

        @Override
        public void onNotificationPostedFull(StatusBarNotification sbn,
                NotificationRankingUpdate update) {
                NotificationRankingUpdate update, long dispatchToken) {
            try {
                // convert icon metadata to legacy format for older clients
                createLegacyIconExtras(sbn.getNotification());
@@ -1510,41 +1527,49 @@ public abstract class NotificationListenerService extends Service {
                sbn = null;
            }

            final SomeArgs args = SomeArgs.obtain();
            args.argl1 = dispatchToken;

            // protect subclass from concurrent modifications of (@link mNotificationKeys}.
            synchronized (mLock) {
                applyUpdateLocked(update);
                if (sbn != null) {
                    SomeArgs args = SomeArgs.obtain();
                    args.arg1 = sbn;
                    args.arg2 = mRankingMap;

                    mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_POSTED,
                            args).sendToTarget();
                } else {
                    // still pass along the ranking map, it may contain other information
                    args.arg1 = mRankingMap;
                    mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_RANKING_UPDATE,
                            mRankingMap).sendToTarget();
                            args).sendToTarget();
                }
            }
        }

        @Override
        public void onNotificationRemoved(IStatusBarNotificationHolder sbnHolder,
                NotificationRankingUpdate update, NotificationStats stats, int reason) {
                NotificationRankingUpdate update, NotificationStats stats, int reason,
                long dispatchToken) {
            StatusBarNotification sbn;
            try {
                sbn = sbnHolder.get();
            } catch (RemoteException e) {
                Log.w(TAG, "onNotificationRemoved: Error receiving StatusBarNotification", e);
                notifyDispatchCompletion(dispatchToken);
                return;
            }
            onNotificationRemovedFull(sbn, update, stats, reason);
            onNotificationRemovedFull(sbn, update, stats, reason, dispatchToken);
        }

        @Override
        public void onNotificationRemovedFull(StatusBarNotification sbn,
                NotificationRankingUpdate update, NotificationStats stats, int reason) {
                NotificationRankingUpdate update, NotificationStats stats, int reason,
                long dispatchToken) {
            if (sbn == null) {
                Log.w(TAG, "onNotificationRemoved: Error receiving StatusBarNotification");
                notifyDispatchCompletion(dispatchToken);
                return;
            }
            // protect subclass from concurrent modifications of (@link mNotificationKeys}.
@@ -1555,6 +1580,7 @@ public abstract class NotificationListenerService extends Service {
                args.arg2 = mRankingMap;
                args.arg3 = reason;
                args.arg4 = stats;
                args.argl1 = dispatchToken;
                mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_REMOVED,
                        args).sendToTarget();
            }
@@ -1562,37 +1588,53 @@ public abstract class NotificationListenerService extends Service {
        }

        @Override
        public void onListenerConnected(NotificationRankingUpdate update) {
        public void onListenerConnected(NotificationRankingUpdate update,
                IDispatchCompletionListener completionListener, long dispatchToken) {
            if (Flags.reportNlsStartAndEnd() && completionListener == null) {
                Log.e(TAG, "No completion listener supplied for this service!");
            }

            // protect subclass from concurrent modifications of (@link mNotificationKeys}.
            synchronized (mLock) {
                applyUpdateLocked(update);
                mCompletionListener = completionListener;
            }
            isConnected = true;
            mHandler.obtainMessage(MyHandler.MSG_ON_LISTENER_CONNECTED).sendToTarget();
            final SomeArgs args = SomeArgs.obtain();
            args.argl1 = dispatchToken;
            mHandler.obtainMessage(MyHandler.MSG_ON_LISTENER_CONNECTED, args).sendToTarget();
        }

        @Override
        public void onNotificationRankingUpdate(NotificationRankingUpdate update)
                throws RemoteException {
        public void onNotificationRankingUpdate(NotificationRankingUpdate update,
                long dispatchToken) throws RemoteException {
            final SomeArgs args = SomeArgs.obtain();
            args.argl1 = dispatchToken;
            // protect subclass from concurrent modifications of (@link mNotificationKeys}.
            synchronized (mLock) {
                applyUpdateLocked(update);
                args.arg1 = mRankingMap;
                mHandler.obtainMessage(MyHandler.MSG_ON_NOTIFICATION_RANKING_UPDATE,
                        mRankingMap).sendToTarget();
                        args).sendToTarget();
            }

        }

        @Override
        public void onListenerHintsChanged(int hints) throws RemoteException {
        public void onListenerHintsChanged(int hints, long dispatchToken) throws RemoteException {
            final SomeArgs args = SomeArgs.obtain();
            args.argl1 = dispatchToken;
            mHandler.obtainMessage(MyHandler.MSG_ON_LISTENER_HINTS_CHANGED,
                    hints, 0).sendToTarget();
                    hints, 0, args).sendToTarget();
        }

        @Override
        public void onInterruptionFilterChanged(int interruptionFilter) throws RemoteException {
        public void onInterruptionFilterChanged(int interruptionFilter,
                long dispatchToken) throws RemoteException {
            final SomeArgs args = SomeArgs.obtain();
            args.argl1 = dispatchToken;
            mHandler.obtainMessage(MyHandler.MSG_ON_INTERRUPTION_FILTER_CHANGED,
                    interruptionFilter, 0).sendToTarget();
                    interruptionFilter, 0, args).sendToTarget();
        }

        @Override
@@ -1681,12 +1723,13 @@ public abstract class NotificationListenerService extends Service {
        @Override
        public void onNotificationChannelModification(String pkgName, UserHandle user,
                NotificationChannel channel,
                @ChannelOrGroupModificationTypes int modificationType) {
                @ChannelOrGroupModificationTypes int modificationType, long dispatchToken) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = pkgName;
            args.arg2 = user;
            args.arg3 = channel;
            args.arg4 = modificationType;
            args.argl1 = dispatchToken;
            mHandler.obtainMessage(
                    MyHandler.MSG_ON_NOTIFICATION_CHANNEL_MODIFIED, args).sendToTarget();
        }
@@ -1694,20 +1737,25 @@ public abstract class NotificationListenerService extends Service {
        @Override
        public void onNotificationChannelGroupModification(String pkgName, UserHandle user,
                NotificationChannelGroup group,
                @ChannelOrGroupModificationTypes int modificationType) {
                @ChannelOrGroupModificationTypes int modificationType, long dispatchToken) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = pkgName;
            args.arg2 = user;
            args.arg3 = group;
            args.arg4 = modificationType;
            args.argl1 = dispatchToken;
            mHandler.obtainMessage(
                    MyHandler.MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED, args).sendToTarget();
        }

        @Override
        public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons) {
        public void onStatusBarIconsBehaviorChanged(boolean hideSilentStatusIcons,
                long dispatchToken) {
            final SomeArgs args = SomeArgs.obtain();
            args.argl1 = dispatchToken;
            args.argi1 = hideSilentStatusIcons ? 1 : 0;
            mHandler.obtainMessage(MyHandler.MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED,
                    hideSilentStatusIcons).sendToTarget();
                    args).sendToTarget();
        }

        @Override
@@ -2465,6 +2513,20 @@ public abstract class NotificationListenerService extends Service {
        }
    }

    private void notifyDispatchCompletion(long token) {
        synchronized (mLock) {
            if (!Flags.reportNlsStartAndEnd() || mCompletionListener == null) {
                // System listeners are not bound so we don't supply them a mCompletionListener.
                return;
            }
            try {
                mCompletionListener.notifyDispatchComplete(token);
            } catch (RemoteException e) {
                Log.e(TAG, "Cannot send dispatch completion to the system", e);
            }
        }
    }

    private final class MyHandler extends Handler {
        public static final int MSG_ON_NOTIFICATION_POSTED = 1;
        public static final int MSG_ON_NOTIFICATION_REMOVED = 2;
@@ -2490,8 +2552,9 @@ public abstract class NotificationListenerService extends Service {
                    SomeArgs args = (SomeArgs) msg.obj;
                    StatusBarNotification sbn = (StatusBarNotification) args.arg1;
                    RankingMap rankingMap = (RankingMap) args.arg2;
                    args.recycle();
                    onNotificationPosted(sbn, rankingMap);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_NOTIFICATION_REMOVED: {
@@ -2500,27 +2563,40 @@ public abstract class NotificationListenerService extends Service {
                    RankingMap rankingMap = (RankingMap) args.arg2;
                    int reason = (int) args.arg3;
                    NotificationStats stats = (NotificationStats) args.arg4;
                    args.recycle();
                    onNotificationRemoved(sbn, rankingMap, stats, reason);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_LISTENER_CONNECTED: {
                    SomeArgs args = (SomeArgs) msg.obj;
                    onListenerConnected();
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_NOTIFICATION_RANKING_UPDATE: {
                    RankingMap rankingMap = (RankingMap) msg.obj;
                    SomeArgs args = (SomeArgs) msg.obj;
                    RankingMap rankingMap = (RankingMap) args.arg1;
                    onNotificationRankingUpdate(rankingMap);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_LISTENER_HINTS_CHANGED: {
                    SomeArgs args = (SomeArgs) msg.obj;
                    final int hints = msg.arg1;
                    onListenerHintsChanged(hints);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_INTERRUPTION_FILTER_CHANGED: {
                    SomeArgs args = (SomeArgs) msg.obj;
                    final int interruptionFilter = msg.arg1;
                    onInterruptionFilterChanged(interruptionFilter);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_NOTIFICATION_CHANNEL_MODIFIED: {
@@ -2529,8 +2605,9 @@ public abstract class NotificationListenerService extends Service {
                    UserHandle user= (UserHandle) args.arg2;
                    NotificationChannel channel = (NotificationChannel) args.arg3;
                    int modificationType = (int) args.arg4;
                    args.recycle();
                    onNotificationChannelModified(pkgName, user, channel, modificationType);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_NOTIFICATION_CHANNEL_GROUP_MODIFIED: {
@@ -2539,12 +2616,16 @@ public abstract class NotificationListenerService extends Service {
                    UserHandle user = (UserHandle) args.arg2;
                    NotificationChannelGroup group = (NotificationChannelGroup) args.arg3;
                    int modificationType = (int) args.arg4;
                    args.recycle();
                    onNotificationChannelGroupModified(pkgName, user, group, modificationType);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;

                case MSG_ON_STATUS_BAR_ICON_BEHAVIOR_CHANGED: {
                    onSilentStatusBarIconsVisibilityChanged((Boolean) msg.obj);
                    SomeArgs args = (SomeArgs) msg.obj;
                    onSilentStatusBarIconsVisibilityChanged(args.argi1 == 1);
                    notifyDispatchCompletion(args.argl1);
                    args.recycle();
                } break;
            }
        }
+7 −0
Original line number Diff line number Diff line
@@ -74,6 +74,13 @@ flag {
  bug: "398153219"
}

flag {
  name: "report_nls_start_and_end"
  namespace: "backstage_power"
  description: "Reports NLS calls start and end to ActivityManager for process capability adjustments"
  bug: "398072400"
}

flag {
  name: "notification_get_original_importance"
  is_exported: true
+31 −13
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static android.content.Context.BIND_FOREGROUND_SERVICE;
import static android.content.Context.DEVICE_POLICY_SERVICE;
import static android.os.UserHandle.USER_ALL;
import static android.os.UserHandle.USER_SYSTEM;
import static android.service.notification.Flags.reportNlsStartAndEnd;
import static android.service.notification.NotificationListenerService.META_DATA_DEFAULT_AUTOBIND;

import static com.android.server.notification.Flags.FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER;
@@ -33,11 +34,13 @@ import android.annotation.FlaggedApi;
import android.annotation.NonNull;
import android.app.ActivityManager;
import android.app.ActivityOptions;
import android.app.IBinderSession;
import android.app.PendingIntent;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Context.BindServiceFlags;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
@@ -359,19 +362,12 @@ abstract public class ManagedServices {
        return userSet != null && userSet.remove(approvedValue);
    }

    protected int getBindFlags() {
    protected long getBindFlags() {
        return BIND_AUTO_CREATE | BIND_FOREGROUND_SERVICE | BIND_ALLOW_WHITELIST_MANAGEMENT;
    }

    protected void onServiceRemovedLocked(ManagedServiceInfo removed) { }

    private ManagedServiceInfo newServiceInfo(IInterface service,
            ComponentName component, int userId, boolean isSystem, ServiceConnection connection,
            int targetSdkVersion, int uid) {
        return new ManagedServiceInfo(service, component, userId, isSystem, connection,
                targetSdkVersion, uid);
    }

    public void onBootPhaseAppsCanStart() {}

    public void dump(PrintWriter pw, DumpFilter filter) {
@@ -1865,7 +1861,8 @@ abstract public class ManagedServices {
                IInterface mService;

                @Override
                public void onServiceConnected(ComponentName name, IBinder binder) {
                public void onServiceConnected(ComponentName name, IBinder binder,
                        IBinderSession binderSession) {
                    Slog.v(TAG,  userid + " " + getCaption() + " service connected: " + name);
                    boolean added = false;
                    ManagedServiceInfo info = null;
@@ -1873,8 +1870,13 @@ abstract public class ManagedServices {
                        mServicesRebinding.remove(servicesBindingTag);
                        try {
                            mService = asInterface(binder);
                            info = newServiceInfo(mService, name,
                                userid, isSystem, this, targetSdkVersion, uid);
                            if (reportNlsStartAndEnd()) {
                                info = new ManagedServiceInfo(mService, name, userid, isSystem,
                                        this, targetSdkVersion, uid, binderSession);
                            } else {
                                info = new ManagedServiceInfo(mService, name, userid, isSystem,
                                        this, targetSdkVersion, uid);
                            }
                            binder.linkToDeath(info, 0);
                            added = mServices.add(info);
                        } catch (RemoteException e) {
@@ -1886,6 +1888,14 @@ abstract public class ManagedServices {
                    }
                }

                @Override
                public void onServiceConnected(ComponentName name, IBinder service) {
                    Slog.wtfStack(TAG,
                            "onServiceConnected(ComponentName, IBinder) called even when "
                                    + "onServiceConnected(ComponentName, IBinder, IBinderSession)"
                                    + " was overridden");
                }

                @Override
                public void onServiceDisconnected(ComponentName name) {
                    Slog.v(TAG, userid + " " + getCaption() + " connection lost: " + name);
@@ -1916,7 +1926,7 @@ abstract public class ManagedServices {
            };
            if (!mContext.bindServiceAsUser(intent,
                    serviceConnection,
                    getBindFlags(),
                    BindServiceFlags.of(getBindFlags()),
                    new UserHandle(userid))) {
                mServicesBound.remove(servicesBindingTag);
                Slog.w(TAG, "Unable to bind " + getCaption() + " service: " + intent
@@ -2002,7 +2012,7 @@ abstract public class ManagedServices {

    private ManagedServiceInfo registerServiceImpl(final IInterface service,
            final ComponentName component, final int userid, int targetSdk, int uid) {
        ManagedServiceInfo info = newServiceInfo(service, component, userid,
        ManagedServiceInfo info = new ManagedServiceInfo(service, component, userid,
                true /*isSystem*/, null /*connection*/, targetSdk, uid);
        return registerServiceImpl(info);
    }
@@ -2105,10 +2115,17 @@ abstract public class ManagedServices {
        public int uid;
        @FlaggedApi(FLAG_MANAGED_SERVICES_CONCURRENT_MULTIUSER)
        public boolean isVisibleBackgroundUserService;
        public final IBinderSession mBinderSession;

        public ManagedServiceInfo(IInterface service, ComponentName component,
                int userid, boolean isSystem, ServiceConnection connection, int targetSdkVersion,
                int uid) {
            this(service, component, userid, isSystem, connection, targetSdkVersion, uid, null);
        }

        public ManagedServiceInfo(IInterface service, ComponentName component,
                int userid, boolean isSystem, ServiceConnection connection, int targetSdkVersion,
                int uid, IBinderSession binderSession) {
            this.service = service;
            this.component = component;
            this.userid = userid;
@@ -2121,6 +2138,7 @@ abstract public class ManagedServices {
                        .getService(UserManagerInternal.class).isVisibleBackgroundFullUser(userid);
            }
            mKey = Pair.create(component, userid);
            mBinderSession = binderSession;
        }

        public boolean isGuest(ManagedServices host) {
Loading