Loading src/com/android/server/telecom/Call.java +3 −3 Original line number Diff line number Diff line Loading @@ -804,10 +804,10 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, } public void initAnalytics() { initAnalytics(null); initAnalytics(null, null); } public void initAnalytics(String callingPackage) { public void initAnalytics(String callingPackage, String extraCreationLogs) { int analyticsDirection; switch (mCallDirection) { case CALL_DIRECTION_OUTGOING: Loading @@ -823,7 +823,7 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, } mAnalytics = Analytics.initiateCallAnalytics(mId, analyticsDirection); mAnalytics.setCallIsEmergency(mIsEmergencyCall); Log.addEvent(this, LogUtils.Events.CREATED, callingPackage); Log.addEvent(this, LogUtils.Events.CREATED, callingPackage + ";" + extraCreationLogs); } public Analytics.CallInfo getAnalytics() { Loading src/com/android/server/telecom/CallsManager.java +17 −2 Original line number Diff line number Diff line Loading @@ -1488,6 +1488,16 @@ public class CallsManager extends Call.ListenerBase Bundle phoneAccountExtra = account != null ? account.getExtras() : null; boolean isSelfManaged = account != null && account.isSelfManaged(); StringBuffer creationLogs = new StringBuffer(); creationLogs.append("requestedAcct:"); if (requestedAccountHandle == null) { creationLogs.append("none"); } else { creationLogs.append(requestedAccountHandle); } creationLogs.append(", selfMgd:"); creationLogs.append(isSelfManaged); // Create a call with original handle. The handle may be changed when the call is attached // to a connection service, but in most cases will remain the same. if (call == null) { Loading @@ -1506,7 +1516,7 @@ public class CallsManager extends Call.ListenerBase isConference, /* isConference */ mClockProxy, mToastFactory); call.initAnalytics(callingPackage); call.initAnalytics(callingPackage, creationLogs.toString()); // Ensure new calls related to self-managed calls/connections are set as such. This // will be overridden when the actual connection is returned in startCreateConnection, Loading Loading @@ -1578,7 +1588,8 @@ public class CallsManager extends Call.ListenerBase // retrieved. CompletableFuture<List<PhoneAccountHandle>> setAccountHandle = accountsForCall.whenCompleteAsync((potentialPhoneAccounts, exception) -> { Log.i(CallsManager.this, "set outgoing call phone acct stage"); Log.i(CallsManager.this, "set outgoing call phone acct; potentialAccts=%s", potentialPhoneAccounts); PhoneAccountHandle phoneAccountHandle; if (potentialPhoneAccounts.size() == 1) { phoneAccountHandle = potentialPhoneAccounts.get(0); Loading Loading @@ -1979,6 +1990,8 @@ public class CallsManager extends Call.ListenerBase return userPreferredAccountForContact.thenApply(phoneAccountHandle -> { if (phoneAccountHandle != null) { Log.i(CallsManager.this, "findOutgoingCallPhoneAccount; contactPrefAcct=%s", phoneAccountHandle); return Collections.singletonList(phoneAccountHandle); } // No preset account, check if default exists that supports the URI scheme for the Loading @@ -1988,6 +2001,8 @@ public class CallsManager extends Call.ListenerBase handle.getScheme(), initiatingUser); if (defaultPhoneAccountHandle != null && possibleAccounts.contains(defaultPhoneAccountHandle)) { Log.i(CallsManager.this, "findOutgoingCallPhoneAccount; defaultAcctForScheme=%s", defaultPhoneAccountHandle); return Collections.singletonList(defaultPhoneAccountHandle); } return possibleAccounts; Loading src/com/android/server/telecom/PhoneAccountRegistrar.java +8 −0 Original line number Diff line number Diff line Loading @@ -1226,6 +1226,14 @@ public class PhoneAccountRegistrar { = mState.defaultOutgoingAccountHandles.get(Process.myUserHandle()); pw.println("defaultOutgoing: " + (defaultPhoneAccountHandle == null ? "none" : defaultPhoneAccountHandle.phoneAccountHandle)); PhoneAccountHandle defaultOutgoing = getOutgoingPhoneAccountForScheme(PhoneAccount.SCHEME_TEL, mCurrentUserHandle); pw.print("outgoingPhoneAccountForTelScheme: "); if (defaultOutgoing == null) { pw.println("none"); } else { pw.println(defaultOutgoing); } pw.println("simCallManager: " + getSimCallManager(mCurrentUserHandle)); pw.println("phoneAccounts:"); pw.increaseIndent(); Loading src/com/android/server/telecom/TelecomServiceImpl.java +17 −17 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ public class TelecomServiceImpl { public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gDOPA"); Log.startSession("TSI.gDOPA", Log.getPackageAbbreviation(callingPackage)); synchronized (mLock) { PhoneAccountHandle phoneAccountHandle = null; final UserHandle callingUserHandle = Binder.getCallingUserHandle(); Loading Loading @@ -147,7 +147,7 @@ public class TelecomServiceImpl { public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount(String callingPackage) { synchronized (mLock) { try { Log.startSession("TSI.gUSOPA"); Log.startSession("TSI.gUSOPA", Log.getPackageAbbreviation(callingPackage)); if (!isDialerOrPrivileged(callingPackage, "getDefaultOutgoingPhoneAccount")) { throw new SecurityException("Only the default dialer, or caller with " + "READ_PRIVILEGED_PHONE_STATE can call this method."); Loading Loading @@ -191,7 +191,7 @@ public class TelecomServiceImpl { public List<PhoneAccountHandle> getCallCapablePhoneAccounts( boolean includeDisabledAccounts, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gCCPA"); Log.startSession("TSI.gCCPA", Log.getPackageAbbreviation(callingPackage)); if (includeDisabledAccounts && !canReadPrivilegedPhoneState( callingPackage, "getCallCapablePhoneAccounts")) { Loading Loading @@ -223,7 +223,7 @@ public class TelecomServiceImpl { public List<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gSMPA"); Log.startSession("TSI.gSMPA", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "Requires READ_PHONE_STATE permission.")) { throw new SecurityException("Requires READ_PHONE_STATE permission."); Loading @@ -250,7 +250,7 @@ public class TelecomServiceImpl { public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme, String callingPackage) { try { Log.startSession("TSI.gPASS"); Log.startSession("TSI.gPASS", Log.getPackageAbbreviation(callingPackage)); try { enforceModifyPermission( "getPhoneAccountsSupportingScheme requires MODIFY_PHONE_STATE"); Loading Loading @@ -918,7 +918,7 @@ public class TelecomServiceImpl { @Override public boolean endCall(String callingPackage) { try { Log.startSession("TSI.eC"); Log.startSession("TSI.eC", Log.getPackageAbbreviation(callingPackage)); synchronized (mLock) { if (!enforceAnswerCallPermission(callingPackage, Binder.getCallingUid())) { throw new SecurityException("requires ANSWER_PHONE_CALLS permission"); Loading @@ -942,7 +942,7 @@ public class TelecomServiceImpl { @Override public void acceptRingingCall(String packageName) { try { Log.startSession("TSI.aRC"); Log.startSession("TSI.aRC", Log.getPackageAbbreviation(packageName)); synchronized (mLock) { if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return; Loading @@ -965,7 +965,7 @@ public class TelecomServiceImpl { @Override public void acceptRingingCallWithVideoState(String packageName, int videoState) { try { Log.startSession("TSI.aRCWVS"); Log.startSession("TSI.aRCWVS", Log.getPackageAbbreviation(packageName)); synchronized (mLock) { if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return; Loading @@ -988,7 +988,7 @@ public class TelecomServiceImpl { public void showInCallScreen(boolean showDialpad, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.sICS"); Log.startSession("TSI.sICS", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "showInCallScreen")) { return; } Loading @@ -1013,7 +1013,7 @@ public class TelecomServiceImpl { @Override public void cancelMissedCallsNotification(String callingPackage) { try { Log.startSession("TSI.cMCN"); Log.startSession("TSI.cMCN", Log.getPackageAbbreviation(callingPackage)); synchronized (mLock) { enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); UserHandle userHandle = Binder.getCallingUserHandle(); Loading @@ -1034,7 +1034,7 @@ public class TelecomServiceImpl { @Override public boolean handlePinMmi(String dialString, String callingPackage) { try { Log.startSession("TSI.hPM"); Log.startSession("TSI.hPM", Log.getPackageAbbreviation(callingPackage)); enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); // Switch identity so that TelephonyManager checks Telecom's permissions Loading Loading @@ -1062,7 +1062,7 @@ public class TelecomServiceImpl { public boolean handlePinMmiForPhoneAccount(PhoneAccountHandle accountHandle, String dialString, String callingPackage) { try { Log.startSession("TSI.hPMFPA"); Log.startSession("TSI.hPMFPA", Log.getPackageAbbreviation(callingPackage)); enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); UserHandle callingUserHandle = Binder.getCallingUserHandle(); Loading Loading @@ -1103,7 +1103,7 @@ public class TelecomServiceImpl { public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle, String callingPackage) { try { Log.startSession("TSI.aAUFPA"); Log.startSession("TSI.aAUFPA", Log.getPackageAbbreviation(callingPackage)); enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); synchronized (mLock) { if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle, Loading Loading @@ -1137,7 +1137,7 @@ public class TelecomServiceImpl { @Override public boolean isTtySupported(String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.iTS"); Log.startSession("TSI.iTS", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "isTtySupported")) { throw new SecurityException("Only default dialer or an app with" + "READ_PRIVILEGED_PHONE_STATE or READ_PHONE_STATE can call this api"); Loading @@ -1157,7 +1157,7 @@ public class TelecomServiceImpl { @Override public int getCurrentTtyMode(String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gCTM"); Log.startSession("TSI.gCTM", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "getCurrentTtyMode")) { return TelecomManager.TTY_MODE_OFF; } Loading Loading @@ -1389,7 +1389,7 @@ public class TelecomServiceImpl { public void startConference(List<Uri> participants, Bundle extras, String callingPackage) { try { Log.startSession("TSI.sC"); Log.startSession("TSI.sC", Log.getPackageAbbreviation(callingPackage)); if (!canCallPhone(callingPackage, "startConference")) { throw new SecurityException("Package " + callingPackage + " is not allowed" + " to start conference call"); Loading @@ -1408,7 +1408,7 @@ public class TelecomServiceImpl { public void placeCall(Uri handle, Bundle extras, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.pC"); Log.startSession("TSI.pC", Log.getPackageAbbreviation(callingPackage)); enforceCallingPackage(callingPackage); PhoneAccountHandle phoneAccountHandle = null; Loading Loading
src/com/android/server/telecom/Call.java +3 −3 Original line number Diff line number Diff line Loading @@ -804,10 +804,10 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, } public void initAnalytics() { initAnalytics(null); initAnalytics(null, null); } public void initAnalytics(String callingPackage) { public void initAnalytics(String callingPackage, String extraCreationLogs) { int analyticsDirection; switch (mCallDirection) { case CALL_DIRECTION_OUTGOING: Loading @@ -823,7 +823,7 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable, } mAnalytics = Analytics.initiateCallAnalytics(mId, analyticsDirection); mAnalytics.setCallIsEmergency(mIsEmergencyCall); Log.addEvent(this, LogUtils.Events.CREATED, callingPackage); Log.addEvent(this, LogUtils.Events.CREATED, callingPackage + ";" + extraCreationLogs); } public Analytics.CallInfo getAnalytics() { Loading
src/com/android/server/telecom/CallsManager.java +17 −2 Original line number Diff line number Diff line Loading @@ -1488,6 +1488,16 @@ public class CallsManager extends Call.ListenerBase Bundle phoneAccountExtra = account != null ? account.getExtras() : null; boolean isSelfManaged = account != null && account.isSelfManaged(); StringBuffer creationLogs = new StringBuffer(); creationLogs.append("requestedAcct:"); if (requestedAccountHandle == null) { creationLogs.append("none"); } else { creationLogs.append(requestedAccountHandle); } creationLogs.append(", selfMgd:"); creationLogs.append(isSelfManaged); // Create a call with original handle. The handle may be changed when the call is attached // to a connection service, but in most cases will remain the same. if (call == null) { Loading @@ -1506,7 +1516,7 @@ public class CallsManager extends Call.ListenerBase isConference, /* isConference */ mClockProxy, mToastFactory); call.initAnalytics(callingPackage); call.initAnalytics(callingPackage, creationLogs.toString()); // Ensure new calls related to self-managed calls/connections are set as such. This // will be overridden when the actual connection is returned in startCreateConnection, Loading Loading @@ -1578,7 +1588,8 @@ public class CallsManager extends Call.ListenerBase // retrieved. CompletableFuture<List<PhoneAccountHandle>> setAccountHandle = accountsForCall.whenCompleteAsync((potentialPhoneAccounts, exception) -> { Log.i(CallsManager.this, "set outgoing call phone acct stage"); Log.i(CallsManager.this, "set outgoing call phone acct; potentialAccts=%s", potentialPhoneAccounts); PhoneAccountHandle phoneAccountHandle; if (potentialPhoneAccounts.size() == 1) { phoneAccountHandle = potentialPhoneAccounts.get(0); Loading Loading @@ -1979,6 +1990,8 @@ public class CallsManager extends Call.ListenerBase return userPreferredAccountForContact.thenApply(phoneAccountHandle -> { if (phoneAccountHandle != null) { Log.i(CallsManager.this, "findOutgoingCallPhoneAccount; contactPrefAcct=%s", phoneAccountHandle); return Collections.singletonList(phoneAccountHandle); } // No preset account, check if default exists that supports the URI scheme for the Loading @@ -1988,6 +2001,8 @@ public class CallsManager extends Call.ListenerBase handle.getScheme(), initiatingUser); if (defaultPhoneAccountHandle != null && possibleAccounts.contains(defaultPhoneAccountHandle)) { Log.i(CallsManager.this, "findOutgoingCallPhoneAccount; defaultAcctForScheme=%s", defaultPhoneAccountHandle); return Collections.singletonList(defaultPhoneAccountHandle); } return possibleAccounts; Loading
src/com/android/server/telecom/PhoneAccountRegistrar.java +8 −0 Original line number Diff line number Diff line Loading @@ -1226,6 +1226,14 @@ public class PhoneAccountRegistrar { = mState.defaultOutgoingAccountHandles.get(Process.myUserHandle()); pw.println("defaultOutgoing: " + (defaultPhoneAccountHandle == null ? "none" : defaultPhoneAccountHandle.phoneAccountHandle)); PhoneAccountHandle defaultOutgoing = getOutgoingPhoneAccountForScheme(PhoneAccount.SCHEME_TEL, mCurrentUserHandle); pw.print("outgoingPhoneAccountForTelScheme: "); if (defaultOutgoing == null) { pw.println("none"); } else { pw.println(defaultOutgoing); } pw.println("simCallManager: " + getSimCallManager(mCurrentUserHandle)); pw.println("phoneAccounts:"); pw.increaseIndent(); Loading
src/com/android/server/telecom/TelecomServiceImpl.java +17 −17 Original line number Diff line number Diff line Loading @@ -115,7 +115,7 @@ public class TelecomServiceImpl { public PhoneAccountHandle getDefaultOutgoingPhoneAccount(String uriScheme, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gDOPA"); Log.startSession("TSI.gDOPA", Log.getPackageAbbreviation(callingPackage)); synchronized (mLock) { PhoneAccountHandle phoneAccountHandle = null; final UserHandle callingUserHandle = Binder.getCallingUserHandle(); Loading Loading @@ -147,7 +147,7 @@ public class TelecomServiceImpl { public PhoneAccountHandle getUserSelectedOutgoingPhoneAccount(String callingPackage) { synchronized (mLock) { try { Log.startSession("TSI.gUSOPA"); Log.startSession("TSI.gUSOPA", Log.getPackageAbbreviation(callingPackage)); if (!isDialerOrPrivileged(callingPackage, "getDefaultOutgoingPhoneAccount")) { throw new SecurityException("Only the default dialer, or caller with " + "READ_PRIVILEGED_PHONE_STATE can call this method."); Loading Loading @@ -191,7 +191,7 @@ public class TelecomServiceImpl { public List<PhoneAccountHandle> getCallCapablePhoneAccounts( boolean includeDisabledAccounts, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gCCPA"); Log.startSession("TSI.gCCPA", Log.getPackageAbbreviation(callingPackage)); if (includeDisabledAccounts && !canReadPrivilegedPhoneState( callingPackage, "getCallCapablePhoneAccounts")) { Loading Loading @@ -223,7 +223,7 @@ public class TelecomServiceImpl { public List<PhoneAccountHandle> getSelfManagedPhoneAccounts(String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gSMPA"); Log.startSession("TSI.gSMPA", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "Requires READ_PHONE_STATE permission.")) { throw new SecurityException("Requires READ_PHONE_STATE permission."); Loading @@ -250,7 +250,7 @@ public class TelecomServiceImpl { public List<PhoneAccountHandle> getPhoneAccountsSupportingScheme(String uriScheme, String callingPackage) { try { Log.startSession("TSI.gPASS"); Log.startSession("TSI.gPASS", Log.getPackageAbbreviation(callingPackage)); try { enforceModifyPermission( "getPhoneAccountsSupportingScheme requires MODIFY_PHONE_STATE"); Loading Loading @@ -918,7 +918,7 @@ public class TelecomServiceImpl { @Override public boolean endCall(String callingPackage) { try { Log.startSession("TSI.eC"); Log.startSession("TSI.eC", Log.getPackageAbbreviation(callingPackage)); synchronized (mLock) { if (!enforceAnswerCallPermission(callingPackage, Binder.getCallingUid())) { throw new SecurityException("requires ANSWER_PHONE_CALLS permission"); Loading @@ -942,7 +942,7 @@ public class TelecomServiceImpl { @Override public void acceptRingingCall(String packageName) { try { Log.startSession("TSI.aRC"); Log.startSession("TSI.aRC", Log.getPackageAbbreviation(packageName)); synchronized (mLock) { if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return; Loading @@ -965,7 +965,7 @@ public class TelecomServiceImpl { @Override public void acceptRingingCallWithVideoState(String packageName, int videoState) { try { Log.startSession("TSI.aRCWVS"); Log.startSession("TSI.aRCWVS", Log.getPackageAbbreviation(packageName)); synchronized (mLock) { if (!enforceAnswerCallPermission(packageName, Binder.getCallingUid())) return; Loading @@ -988,7 +988,7 @@ public class TelecomServiceImpl { public void showInCallScreen(boolean showDialpad, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.sICS"); Log.startSession("TSI.sICS", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "showInCallScreen")) { return; } Loading @@ -1013,7 +1013,7 @@ public class TelecomServiceImpl { @Override public void cancelMissedCallsNotification(String callingPackage) { try { Log.startSession("TSI.cMCN"); Log.startSession("TSI.cMCN", Log.getPackageAbbreviation(callingPackage)); synchronized (mLock) { enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); UserHandle userHandle = Binder.getCallingUserHandle(); Loading @@ -1034,7 +1034,7 @@ public class TelecomServiceImpl { @Override public boolean handlePinMmi(String dialString, String callingPackage) { try { Log.startSession("TSI.hPM"); Log.startSession("TSI.hPM", Log.getPackageAbbreviation(callingPackage)); enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); // Switch identity so that TelephonyManager checks Telecom's permissions Loading Loading @@ -1062,7 +1062,7 @@ public class TelecomServiceImpl { public boolean handlePinMmiForPhoneAccount(PhoneAccountHandle accountHandle, String dialString, String callingPackage) { try { Log.startSession("TSI.hPMFPA"); Log.startSession("TSI.hPMFPA", Log.getPackageAbbreviation(callingPackage)); enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); UserHandle callingUserHandle = Binder.getCallingUserHandle(); Loading Loading @@ -1103,7 +1103,7 @@ public class TelecomServiceImpl { public Uri getAdnUriForPhoneAccount(PhoneAccountHandle accountHandle, String callingPackage) { try { Log.startSession("TSI.aAUFPA"); Log.startSession("TSI.aAUFPA", Log.getPackageAbbreviation(callingPackage)); enforcePermissionOrPrivilegedDialer(MODIFY_PHONE_STATE, callingPackage); synchronized (mLock) { if (!isPhoneAccountHandleVisibleToCallingUser(accountHandle, Loading Loading @@ -1137,7 +1137,7 @@ public class TelecomServiceImpl { @Override public boolean isTtySupported(String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.iTS"); Log.startSession("TSI.iTS", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "isTtySupported")) { throw new SecurityException("Only default dialer or an app with" + "READ_PRIVILEGED_PHONE_STATE or READ_PHONE_STATE can call this api"); Loading @@ -1157,7 +1157,7 @@ public class TelecomServiceImpl { @Override public int getCurrentTtyMode(String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.gCTM"); Log.startSession("TSI.gCTM", Log.getPackageAbbreviation(callingPackage)); if (!canReadPhoneState(callingPackage, callingFeatureId, "getCurrentTtyMode")) { return TelecomManager.TTY_MODE_OFF; } Loading Loading @@ -1389,7 +1389,7 @@ public class TelecomServiceImpl { public void startConference(List<Uri> participants, Bundle extras, String callingPackage) { try { Log.startSession("TSI.sC"); Log.startSession("TSI.sC", Log.getPackageAbbreviation(callingPackage)); if (!canCallPhone(callingPackage, "startConference")) { throw new SecurityException("Package " + callingPackage + " is not allowed" + " to start conference call"); Loading @@ -1408,7 +1408,7 @@ public class TelecomServiceImpl { public void placeCall(Uri handle, Bundle extras, String callingPackage, String callingFeatureId) { try { Log.startSession("TSI.pC"); Log.startSession("TSI.pC", Log.getPackageAbbreviation(callingPackage)); enforceCallingPackage(callingPackage); PhoneAccountHandle phoneAccountHandle = null; Loading