182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos/*
282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * Copyright (C) 2014 The Android Open Source Project
382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos *
482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * Licensed under the Apache License, Version 2.0 (the "License");
582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * you may not use this file except in compliance with the License.
682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * You may obtain a copy of the License at
782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos *
882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos *      http://www.apache.org/licenses/LICENSE-2.0
982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos *
1082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * Unless required by applicable law or agreed to in writing, software
1182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * distributed under the License is distributed on an "AS IS" BASIS,
1282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * See the License for the specific language governing permissions and
1482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * limitations under the License.
1582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos */
1682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
1782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roospackage com.android.server.trust;
1882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
19d4efaac5d54cdb3735b032bb76a5639949f33216Jim Millerimport android.app.AlarmManager;
20d4efaac5d54cdb3735b032bb76a5639949f33216Jim Millerimport android.app.PendingIntent;
21604e7558ef32098644b2f9456d7743a07ae789dcJim Millerimport android.app.admin.DevicePolicyManager;
22d4efaac5d54cdb3735b032bb76a5639949f33216Jim Millerimport android.content.BroadcastReceiver;
2382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.content.ComponentName;
2482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.content.Context;
2582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.content.Intent;
26d4efaac5d54cdb3735b032bb76a5639949f33216Jim Millerimport android.content.IntentFilter;
2782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.content.ServiceConnection;
28d4efaac5d54cdb3735b032bb76a5639949f33216Jim Millerimport android.net.Uri;
298f21158fe64eb93ff005dc1b831b282b95531023Adrian Roosimport android.os.Binder;
3082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.os.Handler;
3182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.os.IBinder;
3282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.os.Message;
33d4efaac5d54cdb3735b032bb76a5639949f33216Jim Millerimport android.os.PatternMatcher;
34e303bf443532c2ad756260133f00747bcff11e69Jim Millerimport android.os.PersistableBundle;
3582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.os.RemoteException;
36c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roosimport android.os.SystemClock;
3782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.os.UserHandle;
3882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.util.Log;
3982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.util.Slog;
4082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.service.trust.ITrustAgentService;
4182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roosimport android.service.trust.ITrustAgentServiceCallback;
42604e7558ef32098644b2f9456d7743a07ae789dcJim Miller
43604e7558ef32098644b2f9456d7743a07ae789dcJim Millerimport java.util.List;
4482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
4582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos/**
4682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * A wrapper around a TrustAgentService interface. Coordinates communication between
4782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos * TrustManager and the actual TrustAgent.
4882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos */
4982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roospublic class TrustAgentWrapper {
50d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    private static final String EXTRA_COMPONENT_NAME = "componentName";
51d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    private static final String TRUST_EXPIRED_ACTION = "android.server.trust.TRUST_EXPIRED_ACTION";
5276b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller    private static final String PERMISSION = android.Manifest.permission.PROVIDE_TRUST_AGENT;
5382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private static final boolean DEBUG = false;
5482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private static final String TAG = "TrustAgentWrapper";
5582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
567a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static final int MSG_GRANT_TRUST = 1;
5782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private static final int MSG_REVOKE_TRUST = 2;
5882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private static final int MSG_TRUST_TIMEOUT = 3;
59c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    private static final int MSG_RESTART_TIMEOUT = 4;
608f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos    private static final int MSG_SET_TRUST_AGENT_FEATURES_COMPLETED = 5;
617861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos    private static final int MSG_MANAGING_TRUST = 6;
62c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos
63c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    /**
64c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos     * Time in uptime millis that we wait for the service connection, both when starting
65c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos     * and when the service disconnects.
66c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos     */
67c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    private static final long RESTART_TIMEOUT_MILLIS = 5 * 60000;
6882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
697a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    /**
707a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos     * Long extra for {@link #MSG_GRANT_TRUST}
717a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos     */
727a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    private static final String DATA_DURATION = "duration";
737a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
7482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private final TrustManagerService mTrustManagerService;
7582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private final int mUserId;
7682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private final Context mContext;
7782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private final ComponentName mName;
7882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
7982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private ITrustAgentService mTrustAgentService;
80c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    private boolean mBound;
81c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    private long mScheduledRestartUptimeMillis;
8276b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller    private long mMaximumTimeToLock; // from DevicePolicyManager
8382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
8482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    // Trust state
8582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private boolean mTrusted;
867e03dfcb796ef1a6000a5fd5fda03c9e15ea62e1Adrian Roos    private CharSequence mMessage;
87604e7558ef32098644b2f9456d7743a07ae789dcJim Miller    private boolean mTrustDisabledByDpm;
887861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos    private boolean mManagingTrust;
898f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos    private IBinder mSetTrustAgentFeaturesToken;
90d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    private AlarmManager mAlarmManager;
91d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    private final Intent mAlarmIntent;
9276b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller    private PendingIntent mAlarmPendingIntent;
93d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller
94d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
95d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        @Override
96d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        public void onReceive(Context context, Intent intent) {
97d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller            ComponentName component = intent.getParcelableExtra(EXTRA_COMPONENT_NAME);
98d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller            if (TRUST_EXPIRED_ACTION.equals(intent.getAction())
99d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller                    && mName.equals(component)) {
100d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller                mHandler.removeMessages(MSG_TRUST_TIMEOUT);
101d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller                mHandler.sendEmptyMessage(MSG_TRUST_TIMEOUT);
102d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller            }
103d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        }
104d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    };
10582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
10682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private final Handler mHandler = new Handler() {
10782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        @Override
10882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        public void handleMessage(Message msg) {
10982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            switch (msg.what) {
1107a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                case MSG_GRANT_TRUST:
1117d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos                    if (!isConnected()) {
1127d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos                        Log.w(TAG, "Agent is not connected, cannot grant trust: "
1137d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos                                + mName.flattenToShortString());
1147d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos                        return;
1157d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos                    }
11682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    mTrusted = true;
1177e03dfcb796ef1a6000a5fd5fda03c9e15ea62e1Adrian Roos                    mMessage = (CharSequence) msg.obj;
11882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    boolean initiatedByUser = msg.arg1 != 0;
1197a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    long durationMs = msg.getData().getLong(DATA_DURATION);
1207a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    if (durationMs > 0) {
12176b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        final long duration;
12276b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        if (mMaximumTimeToLock != 0) {
12376b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            // Enforce DevicePolicyManager timeout.  This is here as a safeguard to
12476b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            // ensure trust agents are evaluating trust state at least as often as
12576b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            // the policy dictates. Admins that want more guarantees should be using
12676b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            // DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS.
12776b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            duration = Math.min(durationMs, mMaximumTimeToLock);
12876b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            if (DEBUG) {
12976b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                                Log.v(TAG, "DPM lock timeout in effect. Timeout adjusted from "
13076b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                                    + durationMs + " to " + duration);
13176b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            }
13276b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        } else {
13376b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                            duration = durationMs;
13476b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        }
13576b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        long expiration = SystemClock.elapsedRealtime() + duration;
13676b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        mAlarmPendingIntent = PendingIntent.getBroadcast(mContext, 0, mAlarmIntent,
137d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller                                PendingIntent.FLAG_CANCEL_CURRENT);
13876b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, expiration,
13976b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                                mAlarmPendingIntent);
1407a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    }
1417a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    mTrustManagerService.mArchive.logGrantTrust(mUserId, mName,
1427a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                            (mMessage != null ? mMessage.toString() : null),
1437a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                            durationMs, initiatedByUser);
1443c9a3501651aa8ad4f289e89119a6c0b4bdaf78aAdrian Roos                    mTrustManagerService.updateTrust(mUserId, initiatedByUser);
14582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    break;
14682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                case MSG_TRUST_TIMEOUT:
14782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    if (DEBUG) Slog.v(TAG, "Trust timed out : " + mName.flattenToShortString());
1487a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    mTrustManagerService.mArchive.logTrustTimeout(mUserId, mName);
149d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller                    onTrustTimeout();
15082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    // Fall through.
15182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                case MSG_REVOKE_TRUST:
15282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    mTrusted = false;
15382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    mMessage = null;
1547a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    mHandler.removeMessages(MSG_TRUST_TIMEOUT);
1557a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    if (msg.what == MSG_REVOKE_TRUST) {
1567a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                        mTrustManagerService.mArchive.logRevokeTrust(mUserId, mName);
1577a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    }
1583c9a3501651aa8ad4f289e89119a6c0b4bdaf78aAdrian Roos                    mTrustManagerService.updateTrust(mUserId, false);
15982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                    break;
160c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos                case MSG_RESTART_TIMEOUT:
161fc29e0b5829034d9c0a60882d2a21606b2f513b1Adrian Roos                    destroy();
162c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos                    mTrustManagerService.resetAgent(mName, mUserId);
163c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos                    break;
1648f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                case MSG_SET_TRUST_AGENT_FEATURES_COMPLETED:
1658f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                    IBinder token = (IBinder) msg.obj;
1668f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                    boolean result = msg.arg1 != 0;
1678f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                    if (mSetTrustAgentFeaturesToken == token) {
1688f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                        mSetTrustAgentFeaturesToken = null;
1698f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                        if (mTrustDisabledByDpm && result) {
1708f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                            if (DEBUG) Log.v(TAG, "Re-enabling agent because it acknowledged "
1718f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                                    + "enabled features: " + mName);
1728f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                            mTrustDisabledByDpm = false;
1733c9a3501651aa8ad4f289e89119a6c0b4bdaf78aAdrian Roos                            mTrustManagerService.updateTrust(mUserId, false);
1748f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                        }
1758f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                    } else {
1768f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                        if (DEBUG) Log.w(TAG, "Ignoring MSG_SET_TRUST_AGENT_FEATURES_COMPLETED "
1778f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                                + "with obsolete token: " + mName);
1788f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                    }
179604e7558ef32098644b2f9456d7743a07ae789dcJim Miller                    break;
1807861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                case MSG_MANAGING_TRUST:
1817861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                    mManagingTrust = msg.arg1 != 0;
1827861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                    if (!mManagingTrust) {
1837861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                        mTrusted = false;
1847861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                        mMessage = null;
1857861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                    }
1867861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                    mTrustManagerService.mArchive.logManagingTrust(mUserId, mName, mManagingTrust);
1873c9a3501651aa8ad4f289e89119a6c0b4bdaf78aAdrian Roos                    mTrustManagerService.updateTrust(mUserId, false);
1887861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos                    break;
18982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            }
19082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        }
19182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    };
19282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
19382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private ITrustAgentServiceCallback mCallback = new ITrustAgentServiceCallback.Stub() {
19482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
1957e03dfcb796ef1a6000a5fd5fda03c9e15ea62e1Adrian Roos        @Override
1967e03dfcb796ef1a6000a5fd5fda03c9e15ea62e1Adrian Roos        public void grantTrust(CharSequence userMessage, long durationMs, boolean initiatedByUser) {
19782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            if (DEBUG) Slog.v(TAG, "enableTrust(" + userMessage + ", durationMs = " + durationMs
19882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                        + ", initiatedByUser = " + initiatedByUser + ")");
19982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
2007a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            Message msg = mHandler.obtainMessage(
2017a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos                    MSG_GRANT_TRUST, initiatedByUser ? 1 : 0, 0, userMessage);
2027a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            msg.getData().putLong(DATA_DURATION, durationMs);
2037a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            msg.sendToTarget();
20482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        }
20582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
2067e03dfcb796ef1a6000a5fd5fda03c9e15ea62e1Adrian Roos        @Override
20782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        public void revokeTrust() {
20882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            if (DEBUG) Slog.v(TAG, "revokeTrust()");
20982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            mHandler.sendEmptyMessage(MSG_REVOKE_TRUST);
21082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        }
2117861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos
2127861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos        @Override
2137861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos        public void setManagingTrust(boolean managingTrust) {
2147861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos            if (DEBUG) Slog.v(TAG, "managingTrust()");
2157861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos            mHandler.obtainMessage(MSG_MANAGING_TRUST, managingTrust ? 1 : 0, 0).sendToTarget();
2167861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos        }
2178f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos
2188f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos        @Override
219e303bf443532c2ad756260133f00747bcff11e69Jim Miller        public void onConfigureCompleted(boolean result, IBinder token) {
2208f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos            if (DEBUG) Slog.v(TAG, "onSetTrustAgentFeaturesEnabledCompleted(result=" + result);
2218f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos            mHandler.obtainMessage(MSG_SET_TRUST_AGENT_FEATURES_COMPLETED,
2228f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                    result ? 1 : 0, 0, token).sendToTarget();
2238f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos        }
22482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    };
22582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
22682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private final ServiceConnection mConnection = new ServiceConnection() {
22782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        @Override
22882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        public void onServiceConnected(ComponentName name, IBinder service) {
22982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            if (DEBUG) Log.v(TAG, "TrustAgent started : " + name.flattenToString());
230c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos            mHandler.removeMessages(MSG_RESTART_TIMEOUT);
23182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            mTrustAgentService = ITrustAgentService.Stub.asInterface(service);
2327d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos            mTrustManagerService.mArchive.logAgentConnected(mUserId, name);
23382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            setCallback(mCallback);
2348f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos            updateDevicePolicyFeatures();
235481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos
236481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos            if (mTrustManagerService.isDeviceLockedInner(mUserId)) {
237481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos                onDeviceLocked();
238481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos            } else {
239481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos                onDeviceUnlocked();
240481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos            }
24182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        }
24282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
24382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        @Override
24482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        public void onServiceDisconnected(ComponentName name) {
24582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            if (DEBUG) Log.v(TAG, "TrustAgent disconnected : " + name.flattenToShortString());
24682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            mTrustAgentService = null;
2477861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos            mManagingTrust = false;
2488f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos            mSetTrustAgentFeaturesToken = null;
2497a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos            mTrustManagerService.mArchive.logAgentDied(mUserId, name);
25082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            mHandler.sendEmptyMessage(MSG_REVOKE_TRUST);
251c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos            if (mBound) {
252c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos                scheduleRestart();
253c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos            }
254604e7558ef32098644b2f9456d7743a07ae789dcJim Miller            // mTrustDisabledByDpm maintains state
255604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        }
256604e7558ef32098644b2f9456d7743a07ae789dcJim Miller    };
25782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
25882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    public TrustAgentWrapper(Context context, TrustManagerService trustManagerService,
25982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            Intent intent, UserHandle user) {
26082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        mContext = context;
26182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        mTrustManagerService = trustManagerService;
262d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
26382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        mUserId = user.getIdentifier();
26482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        mName = intent.getComponent();
265d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller
266d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        mAlarmIntent = new Intent(TRUST_EXPIRED_ACTION).putExtra(EXTRA_COMPONENT_NAME, mName);
267d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        mAlarmIntent.setData(Uri.parse(mAlarmIntent.toUri(Intent.URI_INTENT_SCHEME)));
26876b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller        mAlarmIntent.setPackage(context.getPackageName());
269d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller
270d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        final IntentFilter alarmFilter = new IntentFilter(TRUST_EXPIRED_ACTION);
271d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        alarmFilter.addDataScheme(mAlarmIntent.getScheme());
272d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        final String pathUri = mAlarmIntent.toUri(Intent.URI_INTENT_SCHEME);
273d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        alarmFilter.addDataPath(pathUri, PatternMatcher.PATTERN_LITERAL);
27476b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller        mContext.registerReceiver(mBroadcastReceiver, alarmFilter, PERMISSION, null);
275d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller
276c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        // Schedules a restart for when connecting times out. If the connection succeeds,
277c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        // the restart is canceled in mCallback's onConnected.
278c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        scheduleRestart();
279c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        mBound = context.bindServiceAsUser(intent, mConnection, Context.BIND_AUTO_CREATE, user);
280c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        if (!mBound) {
281c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos            Log.e(TAG, "Can't bind to TrustAgent " + mName.flattenToShortString());
28282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        }
28382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    }
28482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
28582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private void onError(Exception e) {
28682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        Slog.w(TAG , "Remote Exception", e);
28782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    }
28882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
289d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    private void onTrustTimeout() {
290d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        try {
291d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller            if (mTrustAgentService != null) mTrustAgentService.onTrustTimeout();
292d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        } catch (RemoteException e) {
293d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller            onError(e);
294d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller        }
295d4efaac5d54cdb3735b032bb76a5639949f33216Jim Miller    }
296481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos
29782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    /**
29882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos     * @see android.service.trust.TrustAgentService#onUnlockAttempt(boolean)
29982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos     */
30082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    public void onUnlockAttempt(boolean successful) {
30182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        try {
30282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            if (mTrustAgentService != null) mTrustAgentService.onUnlockAttempt(successful);
30382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        } catch (RemoteException e) {
30482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            onError(e);
30582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        }
30682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    }
30782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
308481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos    /**
309481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos     * @see android.service.trust.TrustAgentService#onDeviceLocked()
310481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos     */
311481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos    public void onDeviceLocked() {
312481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos        try {
313481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos            if (mTrustAgentService != null) mTrustAgentService.onDeviceLocked();
314481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos        } catch (RemoteException e) {
315481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos            onError(e);
316481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos        }
317481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos    }
318481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos
319481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos    /**
320481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos     * @see android.service.trust.TrustAgentService#onDeviceUnlocked()
321481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos     */
322481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos    public void onDeviceUnlocked() {
323481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos        try {
324481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos            if (mTrustAgentService != null) mTrustAgentService.onDeviceUnlocked();
325481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos        } catch (RemoteException e) {
326481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos            onError(e);
327481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos        }
328481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos    }
329481a6df99fea124bc4354da34ff668750cdc9041Adrian Roos
33082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    private void setCallback(ITrustAgentServiceCallback callback) {
33182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        try {
33282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            if (mTrustAgentService != null) {
33382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos                mTrustAgentService.setCallback(callback);
33482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            }
33582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        } catch (RemoteException e) {
33682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos            onError(e);
33782142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        }
33882142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    }
33982142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
3408f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos    boolean updateDevicePolicyFeatures() {
341604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        boolean trustDisabled = false;
3428f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos        if (DEBUG) Slog.v(TAG, "updateDevicePolicyFeatures(" + mName + ")");
343604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        try {
344604e7558ef32098644b2f9456d7743a07ae789dcJim Miller            if (mTrustAgentService != null) {
345604e7558ef32098644b2f9456d7743a07ae789dcJim Miller                DevicePolicyManager dpm =
346604e7558ef32098644b2f9456d7743a07ae789dcJim Miller                    (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
3478f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos
348e303bf443532c2ad756260133f00747bcff11e69Jim Miller                if ((dpm.getKeyguardDisabledFeatures(null, mUserId)
3498f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                        & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0) {
350e303bf443532c2ad756260133f00747bcff11e69Jim Miller                    List<PersistableBundle> config = dpm.getTrustAgentConfiguration(
351e303bf443532c2ad756260133f00747bcff11e69Jim Miller                            null, mName, mUserId);
3528f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                    trustDisabled = true;
353e303bf443532c2ad756260133f00747bcff11e69Jim Miller                    if (DEBUG) Slog.v(TAG, "Detected trust agents disabled. Config = " + config);
354e303bf443532c2ad756260133f00747bcff11e69Jim Miller                    if (config != null && config.size() > 0) {
3558f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                        if (DEBUG) {
3568f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                            Slog.v(TAG, "TrustAgent " + mName.flattenToShortString()
357e303bf443532c2ad756260133f00747bcff11e69Jim Miller                                    + " disabled until it acknowledges "+ config);
358604e7558ef32098644b2f9456d7743a07ae789dcJim Miller                        }
3598f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos                        mSetTrustAgentFeaturesToken = new Binder();
360e303bf443532c2ad756260133f00747bcff11e69Jim Miller                        mTrustAgentService.onConfigure(config, mSetTrustAgentFeaturesToken);
361604e7558ef32098644b2f9456d7743a07ae789dcJim Miller                    }
362604e7558ef32098644b2f9456d7743a07ae789dcJim Miller                }
36376b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                final long maxTimeToLock = dpm.getMaximumTimeToLock(null);
36476b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                if (maxTimeToLock != mMaximumTimeToLock) {
36576b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                    // If the timeout changes, cancel the alarm and send a timeout event to have
36676b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                    // the agent re-evaluate trust.
36776b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                    mMaximumTimeToLock = maxTimeToLock;
36876b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                    if (mAlarmPendingIntent != null) {
36976b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        mAlarmManager.cancel(mAlarmPendingIntent);
37076b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        mAlarmPendingIntent = null;
37176b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                        mHandler.sendEmptyMessage(MSG_TRUST_TIMEOUT);
37276b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                    }
37376b9b8b0ca537bad6c4da388d77a9e5dee023856Jim Miller                }
374604e7558ef32098644b2f9456d7743a07ae789dcJim Miller            }
375604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        } catch (RemoteException e) {
376604e7558ef32098644b2f9456d7743a07ae789dcJim Miller            onError(e);
377604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        }
378604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        if (mTrustDisabledByDpm != trustDisabled) {
379604e7558ef32098644b2f9456d7743a07ae789dcJim Miller            mTrustDisabledByDpm = trustDisabled;
3803c9a3501651aa8ad4f289e89119a6c0b4bdaf78aAdrian Roos            mTrustManagerService.updateTrust(mUserId, false);
381604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        }
382604e7558ef32098644b2f9456d7743a07ae789dcJim Miller        return trustDisabled;
383604e7558ef32098644b2f9456d7743a07ae789dcJim Miller    }
384604e7558ef32098644b2f9456d7743a07ae789dcJim Miller
38582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    public boolean isTrusted() {
3867861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos        return mTrusted && mManagingTrust && !mTrustDisabledByDpm;
3877861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos    }
3887861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos
3897861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos    public boolean isManagingTrust() {
3907861c663fd64af33ec2a4c5ad653c806dc8bd994Adrian Roos        return mManagingTrust && !mTrustDisabledByDpm;
39182142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    }
39282142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
3937e03dfcb796ef1a6000a5fd5fda03c9e15ea62e1Adrian Roos    public CharSequence getMessage() {
39482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        return mMessage;
39582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    }
39682142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos
397fc29e0b5829034d9c0a60882d2a21606b2f513b1Adrian Roos    public void destroy() {
398fc29e0b5829034d9c0a60882d2a21606b2f513b1Adrian Roos        mHandler.removeMessages(MSG_RESTART_TIMEOUT);
399fc29e0b5829034d9c0a60882d2a21606b2f513b1Adrian Roos
400c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        if (!mBound) {
401c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos            return;
402c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        }
40382142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        if (DEBUG) Log.v(TAG, "TrustAgent unbound : " + mName.flattenToShortString());
4047d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos        mTrustManagerService.mArchive.logAgentStopped(mUserId, mName);
40582142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos        mContext.unbindService(mConnection);
406c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        mBound = false;
4077d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos        mTrustAgentService = null;
4088f21158fe64eb93ff005dc1b831b282b95531023Adrian Roos        mSetTrustAgentFeaturesToken = null;
4097d59b4f981e24a4a446522e9b8d3d6a7115c1459Adrian Roos        mHandler.sendEmptyMessage(MSG_REVOKE_TRUST);
41082142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos    }
4117a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos
4127a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    public boolean isConnected() {
4137a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos        return mTrustAgentService != null;
4147a4f3d448b17b4bea190c906d7ecc7f8bec9ff80Adrian Roos    }
415c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos
416c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    public boolean isBound() {
417c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        return mBound;
418c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    }
419c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos
420c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    /**
421c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos     * If not connected, returns the time at which the agent is restarted.
422c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos     *
423c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos     * @return restart time in uptime millis.
424c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos     */
425c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    public long getScheduledRestartUptimeMillis() {
426c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        return mScheduledRestartUptimeMillis;
427c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    }
428c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos
429c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    private void scheduleRestart() {
430c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        mHandler.removeMessages(MSG_RESTART_TIMEOUT);
431c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        mScheduledRestartUptimeMillis = SystemClock.uptimeMillis() + RESTART_TIMEOUT_MILLIS;
432c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos        mHandler.sendEmptyMessageAtTime(MSG_RESTART_TIMEOUT, mScheduledRestartUptimeMillis);
433c5f95cea2639b698594a85acbde6a5519941d7b1Adrian Roos    }
43482142c21dd333307682d5f4bb09de3ab3ccfa06cAdrian Roos}
435