diff options
author | Jeff Davidson <jpd@google.com> | 2018-02-08 15:30:06 -0800 |
---|---|---|
committer | Jeff Davidson <jpd@google.com> | 2018-02-08 15:30:06 -0800 |
commit | a192cc2a132cb0ee8588e2df755563ec7008c179 (patch) | |
tree | 380e4db22df19c819bd37df34bf06e7568916a50 /android/telecom | |
parent | 98fe7819c6d14f4f464a5cac047f9e82dee5da58 (diff) | |
download | android-28-a192cc2a132cb0ee8588e2df755563ec7008c179.tar.gz |
Update fullsdk to 4575844
/google/data/ro/projects/android/fetch_artifact \
--bid 4575844 \
--target sdk_phone_x86_64-sdk \
sdk-repo-linux-sources-4575844.zip
Test: TreeHugger
Change-Id: I81e0eb157b4ac3b38408d0ef86f9d6286471f87a
Diffstat (limited to 'android/telecom')
-rw-r--r-- | android/telecom/Call.java | 12 | ||||
-rw-r--r-- | android/telecom/Connection.java | 24 | ||||
-rw-r--r-- | android/telecom/ConnectionService.java | 62 | ||||
-rw-r--r-- | android/telecom/InCallAdapter.java | 5 | ||||
-rw-r--r-- | android/telecom/InCallService.java | 11 | ||||
-rw-r--r-- | android/telecom/Log.java | 53 | ||||
-rw-r--r-- | android/telecom/Phone.java | 7 | ||||
-rw-r--r-- | android/telecom/TelecomManager.java | 42 | ||||
-rw-r--r-- | android/telecom/TransformationInfo.java | 127 |
9 files changed, 277 insertions, 66 deletions
diff --git a/android/telecom/Call.java b/android/telecom/Call.java index 20911012..67994179 100644 --- a/android/telecom/Call.java +++ b/android/telecom/Call.java @@ -419,7 +419,6 @@ public final class Call { /** * Indicates the call used Assisted Dialing. * See also {@link Connection#PROPERTY_ASSISTED_DIALING_USED} - * @hide */ public static final int PROPERTY_ASSISTED_DIALING_USED = 0x00000200; @@ -1408,7 +1407,7 @@ public final class Call { * @param extras Bundle containing extra information associated with the event. */ public void sendCallEvent(String event, Bundle extras) { - mInCallAdapter.sendCallEvent(mTelecomCallId, event, extras); + mInCallAdapter.sendCallEvent(mTelecomCallId, event, mTargetSdkVersion, extras); } /** @@ -1961,6 +1960,15 @@ public final class Call { } } + /** {@hide} */ + final void internalOnHandoverComplete() { + for (CallbackRecord<Callback> record : mCallbackRecords) { + final Call call = this; + final Callback callback = record.getCallback(); + record.getHandler().post(() -> callback.onHandoverComplete(call)); + } + } + private void fireStateChanged(final int newState) { for (CallbackRecord<Callback> record : mCallbackRecords) { final Call call = this; diff --git a/android/telecom/Connection.java b/android/telecom/Connection.java index aaef8d3d..63f970a4 100644 --- a/android/telecom/Connection.java +++ b/android/telecom/Connection.java @@ -35,6 +35,7 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; +import android.os.Parcelable; import android.os.RemoteException; import android.os.SystemClock; import android.util.ArraySet; @@ -401,7 +402,6 @@ public abstract class Connection extends Conferenceable { /** * Set by the framework to indicate that a connection is using assisted dialing. - * @hide */ public static final int PROPERTY_ASSISTED_DIALING_USED = 1 << 9; @@ -2538,6 +2538,19 @@ public abstract class Connection extends Conferenceable { } /** + * Adds a parcelable extra to this {@code Connection}. + * + * @param key The extra key. + * @param value The value. + * @hide + */ + public final void putExtra(@NonNull String key, @NonNull Parcelable value) { + Bundle newExtras = new Bundle(); + newExtras.putParcelable(key, value); + putExtras(newExtras); + } + + /** * Removes extras from this {@code Connection}. * * @param keys The keys of the extras to remove. @@ -2788,6 +2801,15 @@ public abstract class Connection extends Conferenceable { public void onCallEvent(String event, Bundle extras) {} /** + * Notifies this {@link Connection} that a handover has completed. + * <p> + * A handover is initiated with {@link android.telecom.Call#handoverTo(PhoneAccountHandle, int, + * Bundle)} on the initiating side of the handover, and + * {@link TelecomManager#acceptHandover(Uri, int, PhoneAccountHandle)}. + */ + public void onHandoverComplete() {} + + /** * Notifies this {@link Connection} of a change to the extras made outside the * {@link ConnectionService}. * <p> diff --git a/android/telecom/ConnectionService.java b/android/telecom/ConnectionService.java index 6af01aee..c1040adc 100644 --- a/android/telecom/ConnectionService.java +++ b/android/telecom/ConnectionService.java @@ -140,6 +140,7 @@ public abstract class ConnectionService extends Service { private static final String SESSION_POST_DIAL_CONT = "CS.oPDC"; private static final String SESSION_PULL_EXTERNAL_CALL = "CS.pEC"; private static final String SESSION_SEND_CALL_EVENT = "CS.sCE"; + private static final String SESSION_HANDOVER_COMPLETE = "CS.hC"; private static final String SESSION_EXTRAS_CHANGED = "CS.oEC"; private static final String SESSION_START_RTT = "CS.+RTT"; private static final String SESSION_STOP_RTT = "CS.-RTT"; @@ -179,6 +180,7 @@ public abstract class ConnectionService extends Service { private static final int MSG_CONNECTION_SERVICE_FOCUS_LOST = 30; private static final int MSG_CONNECTION_SERVICE_FOCUS_GAINED = 31; private static final int MSG_HANDOVER_FAILED = 32; + private static final int MSG_HANDOVER_COMPLETE = 33; private static Connection sNullConnection; @@ -298,6 +300,19 @@ public abstract class ConnectionService extends Service { } @Override + public void handoverComplete(String callId, Session.Info sessionInfo) { + Log.startSession(sessionInfo, SESSION_HANDOVER_COMPLETE); + try { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = callId; + args.arg2 = Log.createSubsession(); + mHandler.obtainMessage(MSG_HANDOVER_COMPLETE, args).sendToTarget(); + } finally { + Log.endSession(); + } + } + + @Override public void abort(String callId, Session.Info sessionInfo) { Log.startSession(sessionInfo, SESSION_ABORT); try { @@ -1028,6 +1043,19 @@ public abstract class ConnectionService extends Service { } break; } + case MSG_HANDOVER_COMPLETE: { + SomeArgs args = (SomeArgs) msg.obj; + try { + Log.continueSession((Session) args.arg2, + SESSION_HANDLER + SESSION_HANDOVER_COMPLETE); + String callId = (String) args.arg1; + notifyHandoverComplete(callId); + } finally { + args.recycle(); + Log.endSession(); + } + break; + } case MSG_ON_EXTRAS_CHANGED: { SomeArgs args = (SomeArgs) msg.obj; try { @@ -1445,19 +1473,24 @@ public abstract class ConnectionService extends Service { final ConnectionRequest request, boolean isIncoming, boolean isUnknown) { + boolean isLegacyHandover = request.getExtras() != null && + request.getExtras().getBoolean(TelecomManager.EXTRA_IS_HANDOVER, false); + boolean isHandover = request.getExtras() != null && request.getExtras().getBoolean( + TelecomManager.EXTRA_IS_HANDOVER_CONNECTION, false); Log.d(this, "createConnection, callManagerAccount: %s, callId: %s, request: %s, " + - "isIncoming: %b, isUnknown: %b", callManagerAccount, callId, request, - isIncoming, - isUnknown); + "isIncoming: %b, isUnknown: %b, isLegacyHandover: %b, isHandover: %b", + callManagerAccount, callId, request, isIncoming, isUnknown, isLegacyHandover, + isHandover); Connection connection = null; - if (getApplicationContext().getApplicationInfo().targetSdkVersion > - Build.VERSION_CODES.O_MR1 && request.getExtras() != null && - request.getExtras().getBoolean(TelecomManager.EXTRA_IS_HANDOVER,false)) { + if (isHandover) { + PhoneAccountHandle fromPhoneAccountHandle = request.getExtras() != null + ? (PhoneAccountHandle) request.getExtras().getParcelable( + TelecomManager.EXTRA_HANDOVER_FROM_PHONE_ACCOUNT) : null; if (!isIncoming) { - connection = onCreateOutgoingHandoverConnection(callManagerAccount, request); + connection = onCreateOutgoingHandoverConnection(fromPhoneAccountHandle, request); } else { - connection = onCreateIncomingHandoverConnection(callManagerAccount, request); + connection = onCreateIncomingHandoverConnection(fromPhoneAccountHandle, request); } } else { connection = isUnknown ? onCreateUnknownConnection(callManagerAccount, request) @@ -1754,6 +1787,19 @@ public abstract class ConnectionService extends Service { } /** + * Notifies a {@link Connection} that a handover has completed. + * + * @param callId The ID of the call which completed handover. + */ + private void notifyHandoverComplete(String callId) { + Log.d(this, "notifyHandoverComplete(%s)", callId); + Connection connection = findConnectionForAction(callId, "notifyHandoverComplete"); + if (connection != null) { + connection.onHandoverComplete(); + } + } + + /** * Notifies a {@link Connection} or {@link Conference} of a change to the extras from Telecom. * <p> * These extra changes can originate from Telecom itself, or from an {@link InCallService} via diff --git a/android/telecom/InCallAdapter.java b/android/telecom/InCallAdapter.java index 4bc2a9b1..658685fe 100644 --- a/android/telecom/InCallAdapter.java +++ b/android/telecom/InCallAdapter.java @@ -286,11 +286,12 @@ public final class InCallAdapter { * * @param callId The callId to send the event for. * @param event The event. + * @param targetSdkVer Target sdk version of the app calling this api * @param extras Extras associated with the event. */ - public void sendCallEvent(String callId, String event, Bundle extras) { + public void sendCallEvent(String callId, String event, int targetSdkVer, Bundle extras) { try { - mAdapter.sendCallEvent(callId, event, extras); + mAdapter.sendCallEvent(callId, event, targetSdkVer, extras); } catch (RemoteException ignored) { } } diff --git a/android/telecom/InCallService.java b/android/telecom/InCallService.java index 74fa62d6..fcf04c9a 100644 --- a/android/telecom/InCallService.java +++ b/android/telecom/InCallService.java @@ -81,6 +81,7 @@ public abstract class InCallService extends Service { private static final int MSG_ON_RTT_UPGRADE_REQUEST = 10; private static final int MSG_ON_RTT_INITIATION_FAILURE = 11; private static final int MSG_ON_HANDOVER_FAILED = 12; + private static final int MSG_ON_HANDOVER_COMPLETE = 13; /** Default Handler used to consolidate binder method calls onto a single thread. */ private final Handler mHandler = new Handler(Looper.getMainLooper()) { @@ -157,6 +158,11 @@ public abstract class InCallService extends Service { mPhone.internalOnHandoverFailed(callId, error); break; } + case MSG_ON_HANDOVER_COMPLETE: { + String callId = (String) msg.obj; + mPhone.internalOnHandoverComplete(callId); + break; + } default: break; } @@ -237,6 +243,11 @@ public abstract class InCallService extends Service { public void onHandoverFailed(String callId, int error) { mHandler.obtainMessage(MSG_ON_HANDOVER_FAILED, error, 0, callId).sendToTarget(); } + + @Override + public void onHandoverComplete(String callId) { + mHandler.obtainMessage(MSG_ON_HANDOVER_COMPLETE, callId).sendToTarget(); + } } private Phone.Listener mPhoneListener = new Phone.Listener() { diff --git a/android/telecom/Log.java b/android/telecom/Log.java index 3361b5b6..83ca4702 100644 --- a/android/telecom/Log.java +++ b/android/telecom/Log.java @@ -340,24 +340,6 @@ public class Log { return sSessionManager; } - private static MessageDigest sMessageDigest; - - public static void initMd5Sum() { - new AsyncTask<Void, Void, Void>() { - @Override - public Void doInBackground(Void... args) { - MessageDigest md; - try { - md = MessageDigest.getInstance("SHA-1"); - } catch (NoSuchAlgorithmException e) { - md = null; - } - sMessageDigest = md; - return null; - } - }.execute(); - } - public static void setTag(String tag) { TAG = tag; DEBUG = isLoggable(android.util.Log.DEBUG); @@ -425,44 +407,13 @@ public class Log { /** * Redact personally identifiable information for production users. * If we are running in verbose mode, return the original string, - * and return "****" if we are running on the user build, otherwise - * return a SHA-1 hash of the input string. + * and return "***" otherwise. */ public static String pii(Object pii) { if (pii == null || VERBOSE) { return String.valueOf(pii); } - return "[" + secureHash(String.valueOf(pii).getBytes()) + "]"; - } - - private static String secureHash(byte[] input) { - // Refrain from logging user personal information in user build. - if (USER_BUILD) { - return "****"; - } - - if (sMessageDigest != null) { - sMessageDigest.reset(); - sMessageDigest.update(input); - byte[] result = sMessageDigest.digest(); - return encodeHex(result); - } else { - return "Uninitialized SHA1"; - } - } - - private static String encodeHex(byte[] bytes) { - StringBuffer hex = new StringBuffer(bytes.length * 2); - - for (int i = 0; i < bytes.length; i++) { - int byteIntValue = bytes[i] & 0xff; - if (byteIntValue < 0x10) { - hex.append("0"); - } - hex.append(Integer.toString(byteIntValue, 16)); - } - - return hex.toString(); + return "***"; } private static String getPrefixFromObject(Object obj) { diff --git a/android/telecom/Phone.java b/android/telecom/Phone.java index b5394b9b..99f94f28 100644 --- a/android/telecom/Phone.java +++ b/android/telecom/Phone.java @@ -230,6 +230,13 @@ public final class Phone { } } + final void internalOnHandoverComplete(String callId) { + Call call = mCallByTelecomCallId.get(callId); + if (call != null) { + call.internalOnHandoverComplete(); + } + } + /** * Called to destroy the phone and cleanup any lingering calls. */ diff --git a/android/telecom/TelecomManager.java b/android/telecom/TelecomManager.java index 15355ac7..1fe5db5d 100644 --- a/android/telecom/TelecomManager.java +++ b/android/telecom/TelecomManager.java @@ -24,6 +24,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.RemoteException; import android.os.ServiceManager; @@ -110,6 +111,12 @@ public class TelecomManager { "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS"; /** + * The {@link android.content.Intent} action used to show the assisted dialing settings. + */ + public static final String ACTION_SHOW_ASSISTED_DIALING_SETTINGS = + "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS"; + + /** * The {@link android.content.Intent} action used to show the settings page used to configure * {@link PhoneAccount} preferences. */ @@ -236,6 +243,15 @@ public class TelecomManager { "android.telecom.extra.INCOMING_CALL_EXTRAS"; /** + * Optional extra for {@link #ACTION_INCOMING_CALL} containing a boolean to indicate that the + * call has an externally generated ringer. Used by the HfpClientConnectionService when In Band + * Ringtone is enabled to prevent two ringers from being generated. + * @hide + */ + public static final String EXTRA_CALL_EXTERNAL_RINGER = + "android.telecom.extra.CALL_EXTERNAL_RINGER"; + + /** * Optional extra for {@link android.content.Intent#ACTION_CALL} and * {@link android.content.Intent#ACTION_DIAL} {@code Intent} containing a {@link Bundle} * which contains metadata about the call. This {@link Bundle} will be saved into @@ -369,6 +385,17 @@ public class TelecomManager { public static final String EXTRA_IS_HANDOVER = "android.telecom.extra.IS_HANDOVER"; /** + * When {@code true} indicates that a request to create a new connection is for the purpose of + * a handover. Note: This is used with the + * {@link android.telecom.Call#handoverTo(PhoneAccountHandle, int, Bundle)} API as part of the + * internal communication mechanism with the {@link android.telecom.ConnectionService}. It is + * not the same as the legacy {@link #EXTRA_IS_HANDOVER} extra. + * @hide + */ + public static final String EXTRA_IS_HANDOVER_CONNECTION = + "android.telecom.extra.IS_HANDOVER_CONNECTION"; + + /** * Parcelable extra used with {@link #EXTRA_IS_HANDOVER} to indicate the source * {@link PhoneAccountHandle} when initiating a handover which {@link ConnectionService} * the handover is from. @@ -592,12 +619,17 @@ public class TelecomManager { /** * The boolean indicated by this extra controls whether or not a call is eligible to undergo * assisted dialing. This extra is stored under {@link #EXTRA_OUTGOING_CALL_EXTRAS}. - * @hide */ public static final String EXTRA_USE_ASSISTED_DIALING = "android.telecom.extra.USE_ASSISTED_DIALING"; /** + * The bundle indicated by this extra store information related to the assisted dialing action. + */ + public static final String EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO = + "android.telecom.extra.ASSISTED_DIALING_TRANSFORMATION_INFO"; + + /** * The following 4 constants define how properties such as phone numbers and names are * displayed to the user. */ @@ -653,7 +685,6 @@ public class TelecomManager { mContext = context; } mTelecomServiceOverride = telecomServiceImpl; - android.telecom.Log.initMd5Sum(); } /** @@ -1432,6 +1463,13 @@ public class TelecomManager { public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) { try { if (isServiceConnected()) { + if (extras != null && extras.getBoolean(EXTRA_IS_HANDOVER) && + mContext.getApplicationContext().getApplicationInfo().targetSdkVersion > + Build.VERSION_CODES.O_MR1) { + Log.e("TAG", "addNewIncomingCall failed. Use public api " + + "acceptHandover for API > O-MR1"); + // TODO add "return" after DUO team adds support for new handover API + } getTelecomService().addNewIncomingCall( phoneAccount, extras == null ? new Bundle() : extras); } diff --git a/android/telecom/TransformationInfo.java b/android/telecom/TransformationInfo.java new file mode 100644 index 00000000..3e848c6f --- /dev/null +++ b/android/telecom/TransformationInfo.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.telecom; + +import android.os.Parcelable; +import android.os.Parcel; + +/** + * A container class to hold information related to the Assisted Dialing operation. All member + * variables must be set when constructing a new instance of this class. + */ +public final class TransformationInfo implements Parcelable { + private String mOriginalNumber; + private String mTransformedNumber; + private String mUserHomeCountryCode; + private String mUserRoamingCountryCode; + private int mTransformedNumberCountryCallingCode; + + public TransformationInfo(String originalNumber, + String transformedNumber, + String userHomeCountryCode, + String userRoamingCountryCode, + int transformedNumberCountryCallingCode) { + String missing = ""; + if (originalNumber == null) { + missing += " mOriginalNumber"; + } + if (transformedNumber == null) { + missing += " mTransformedNumber"; + } + if (userHomeCountryCode == null) { + missing += " mUserHomeCountryCode"; + } + if (userRoamingCountryCode == null) { + missing += " mUserRoamingCountryCode"; + } + + if (!missing.isEmpty()) { + throw new IllegalStateException("Missing required properties:" + missing); + } + this.mOriginalNumber = originalNumber; + this.mTransformedNumber = transformedNumber; + this.mUserHomeCountryCode = userHomeCountryCode; + this.mUserRoamingCountryCode = userRoamingCountryCode; + this.mTransformedNumberCountryCallingCode = transformedNumberCountryCallingCode; + } + + public int describeContents() { + return 0; + } + + public void writeToParcel(Parcel out, int flags) { + out.writeString(mOriginalNumber); + out.writeString(mTransformedNumber); + out.writeString(mUserHomeCountryCode); + out.writeString(mUserRoamingCountryCode); + out.writeInt(mTransformedNumberCountryCallingCode); + } + + public static final Parcelable.Creator<TransformationInfo> CREATOR + = new Parcelable.Creator<TransformationInfo>() { + public TransformationInfo createFromParcel(Parcel in) { + return new TransformationInfo(in); + } + + public TransformationInfo[] newArray(int size) { + return new TransformationInfo[size]; + } + }; + + private TransformationInfo(Parcel in) { + mOriginalNumber = in.readString(); + mTransformedNumber = in.readString(); + mUserHomeCountryCode = in.readString(); + mUserRoamingCountryCode = in.readString(); + mTransformedNumberCountryCallingCode = in.readInt(); + } + + /** + * The original number that underwent Assisted Dialing. + */ + public String getOriginalNumber() { + return mOriginalNumber; + } + + /** + * The number after it underwent Assisted Dialing. + */ + public String getTransformedNumber() { + return mTransformedNumber; + } + + /** + * The user's home country code that was used when attempting to transform the number. + */ + public String getUserHomeCountryCode() { + return mUserHomeCountryCode; + } + + /** + * The users's roaming country code that was used when attempting to transform the number. + */ + public String getUserRoamingCountryCode() { + return mUserRoamingCountryCode; + } + + /** + * The country calling code that was used in the transformation. + */ + public int getTransformedNumberCountryCallingCode() { + return mTransformedNumberCountryCallingCode; + } +} |