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