Loading src/java/com/android/internal/telephony/CallManager.java +6 −2 Original line number Diff line number Diff line Loading @@ -964,7 +964,8 @@ public class CallManager { // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. //mIsEccDialing = PhoneNumberUtils.isEmergencyNumber(dialString); result = phone.dial(dialString, videoState); result = phone.dial(dialString, new PhoneInternalInterface.DialArgs.Builder<>() .setVideoState(videoState).build()); if (VDBG) { Rlog.d(LOG_TAG, "End dial(" + phone + ", "+ dialString + ")"); Loading @@ -986,7 +987,10 @@ public class CallManager { */ public Connection dial(Phone phone, String dialString, UUSInfo uusInfo, int videoState) throws CallStateException { return phone.dial(dialString, uusInfo, videoState, null); return phone.dial(dialString, new PhoneInternalInterface.DialArgs.Builder<>() .setUusInfo(uusInfo) .setVideoState(videoState).build()); } /** Loading src/java/com/android/internal/telephony/Connection.java +17 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ public abstract class Connection { public void onRttModifyRequestReceived(); public void onRttModifyResponseReceived(int status); public void onDisconnect(int cause); public void onRttInitiated(); public void onRttTerminated(); } /** Loading Loading @@ -146,6 +148,10 @@ public abstract class Connection { public void onRttModifyResponseReceived(int status) {} @Override public void onDisconnect(int cause) {} @Override public void onRttInitiated() {} @Override public void onRttTerminated() {} } public static final int AUDIO_QUALITY_STANDARD = 1; Loading Loading @@ -1062,6 +1068,17 @@ public abstract class Connection { } } public void onRttInitiated() { for (Listener l : mListeners) { l.onRttInitiated(); } } public void onRttTerminated() { for (Listener l : mListeners) { l.onRttTerminated(); } } /** * Notify interested parties that this connection disconnected. * {@code TelephonyConnection}, for example, uses this. Loading src/java/com/android/internal/telephony/GsmCdmaPhone.java +19 −22 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPL import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL; import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; import android.annotation.NonNull; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ContentValues; Loading Loading @@ -1034,14 +1035,9 @@ public class GsmCdmaPhone extends Phone { } @Override public Connection dial(String dialString, int videoState) throws CallStateException { return dial(dialString, null, videoState, null); } @Override public Connection dial(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) public Connection dial(String dialString, @NonNull DialArgs dialArgs) throws CallStateException { if (!isPhoneTypeGsm() && uusInfo != null) { if (!isPhoneTypeGsm() && dialArgs.uusInfo != null) { throw new CallStateException("Sending UUS information NOT supported in CDMA!"); } Loading @@ -1056,7 +1052,7 @@ public class GsmCdmaPhone extends Phone { boolean useImsForCall = isImsUseEnabled() && imsPhone != null && (imsPhone.isVolteEnabled() || imsPhone.isWifiCallingEnabled() || (imsPhone.isVideoEnabled() && VideoProfile.isVideo(videoState))) (imsPhone.isVideoEnabled() && VideoProfile.isVideo(dialArgs.videoState))) && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE); boolean useImsForEmergency = imsPhone != null Loading Loading @@ -1093,7 +1089,7 @@ public class GsmCdmaPhone extends Phone { if ((useImsForCall && !isUt) || (isUt && useImsForUt) || useImsForEmergency) { try { if (DBG) logd("Trying IMS PS call"); return imsPhone.dial(dialString, uusInfo, videoState, intentExtras); return imsPhone.dial(dialString, dialArgs); } catch (CallStateException e) { if (DBG) logd("IMS PS call exception " + e + "useImsForCall =" + useImsForCall + ", imsPhone =" + imsPhone); Loading @@ -1116,7 +1112,7 @@ public class GsmCdmaPhone extends Phone { } // Check non-emergency voice CS call - shouldn't dial when POWER_OFF if (mSST != null && mSST.mSS.getState() == ServiceState.STATE_POWER_OFF /* CS POWER_OFF */ && !VideoProfile.isVideo(videoState) /* voice call */ && !VideoProfile.isVideo(dialArgs.videoState) /* voice call */ && !isEmergency /* non-emergency call */) { throw new CallStateException( CallStateException.ERROR_POWER_OFF, Loading @@ -1128,7 +1124,7 @@ public class GsmCdmaPhone extends Phone { && mSST.mSS.getState() == ServiceState.STATE_OUT_OF_SERVICE /* CS out of service */ && !(mSST.mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE && ServiceState.isLte(mSST.mSS.getRilDataRadioTechnology())) /* PS not in LTE */ && !VideoProfile.isVideo(videoState) /* voice call */ && !VideoProfile.isVideo(dialArgs.videoState) /* voice call */ && !isEmergency /* non-emergency call */) { throw new CallStateException( CallStateException.ERROR_OUT_OF_SERVICE, Loading @@ -1137,9 +1133,11 @@ public class GsmCdmaPhone extends Phone { if (DBG) logd("Trying (non-IMS) CS call"); if (isPhoneTypeGsm()) { return dialInternal(dialString, null, VideoProfile.STATE_AUDIO_ONLY, intentExtras); return dialInternal(dialString, new DialArgs.Builder<>() .setIntentExtras(dialArgs.intentExtras) .build()); } else { return dialInternal(dialString, null, videoState, intentExtras); return dialInternal(dialString, dialArgs); } } Loading Loading @@ -1180,14 +1178,13 @@ public class GsmCdmaPhone extends Phone { } @Override protected Connection dialInternal(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) protected Connection dialInternal(String dialString, DialArgs dialArgs) throws CallStateException { return dialInternal(dialString, uusInfo, videoState, intentExtras, null); return dialInternal(dialString, dialArgs, null); } protected Connection dialInternal(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras, ResultReceiver wrappedCallback) protected Connection dialInternal(String dialString, DialArgs dialArgs, ResultReceiver wrappedCallback) throws CallStateException { // Need to make sure dialString gets parsed properly Loading @@ -1206,9 +1203,10 @@ public class GsmCdmaPhone extends Phone { if (DBG) logd("dialInternal: dialing w/ mmi '" + mmi + "'..."); if (mmi == null) { return mCT.dial(newDialString, uusInfo, intentExtras); return mCT.dial(newDialString, dialArgs.uusInfo, dialArgs.intentExtras); } else if (mmi.isTemporaryModeCLIR()) { return mCT.dial(mmi.mDialingNumber, mmi.getCLIRMode(), uusInfo, intentExtras); return mCT.dial(mmi.mDialingNumber, mmi.getCLIRMode(), dialArgs.uusInfo, dialArgs.intentExtras); } else { mPendingMMIs.add(mmi); mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); Loading Loading @@ -1281,8 +1279,7 @@ public class GsmCdmaPhone extends Phone { // Try USSD over GSM. try { dialInternal(ussdRequest, null, VideoProfile.STATE_AUDIO_ONLY, null, wrappedCallback); dialInternal(ussdRequest, new DialArgs.Builder<>().build(), wrappedCallback); } catch (Exception e) { logd("handleUssdRequest: exception" + e); return false; Loading src/java/com/android/internal/telephony/Phone.java +3 −6 Original line number Diff line number Diff line Loading @@ -665,7 +665,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { String dialString = (String) ar.result; if (TextUtils.isEmpty(dialString)) return; try { dialInternal(dialString, null, VideoProfile.STATE_AUDIO_ONLY, null); dialInternal(dialString, new DialArgs.Builder().build()); } catch (CallStateException e) { Rlog.e(LOG_TAG, "silent redial failed: " + e); } Loading Loading @@ -3049,14 +3049,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * Dials a number. * * @param dialString The number to dial. * @param uusInfo The UUSInfo. * @param videoState The video state for the call. * @param intentExtras Extras from the original CALL intent. * @param dialArgs Parameters to dial with. * @return The Connection. * @throws CallStateException */ protected Connection dialInternal( String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) protected Connection dialInternal(String dialString, DialArgs dialArgs) throws CallStateException { // dialInternal shall be overriden by GsmCdmaPhone return null; Loading src/java/com/android/internal/telephony/PhoneInternalInterface.java +49 −23 Original line number Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.internal.telephony; import android.annotation.NonNull; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.ResultReceiver; import android.os.WorkSource; import android.telephony.CarrierConfigManager; import android.telecom.VideoProfile; import android.telephony.CellLocation; import android.telephony.ImsiEncryptionInfo; import android.telephony.NetworkScanRequest; Loading Loading @@ -62,6 +64,51 @@ public interface PhoneInternalInterface { UNKNOWN, SWITCH, SEPARATE, TRANSFER, CONFERENCE, REJECT, HANGUP, RESUME, HOLD; } /** * Arguments that control behavior of dialing a call. */ public static class DialArgs { public static class Builder<T extends Builder<T>> { protected UUSInfo mUusInfo; protected int mVideoState = VideoProfile.STATE_AUDIO_ONLY; protected Bundle mIntentExtras; public T setUusInfo(UUSInfo uusInfo) { mUusInfo = uusInfo; return (T) this; } public T setVideoState(int videoState) { mVideoState = videoState; return (T) this; } public T setIntentExtras(Bundle intentExtras) { this.mIntentExtras = intentExtras; return (T) this; } public PhoneInternalInterface.DialArgs build() { return new DialArgs(this); } } /** The UUSInfo */ public final UUSInfo uusInfo; /** The desired video state for the connection. */ public final int videoState; /** The extras from the original CALL intent. */ public final Bundle intentExtras; protected DialArgs(Builder b) { this.uusInfo = b.mUusInfo; this.videoState = b.mVideoState; this.intentExtras = b.mIntentExtras; } } // "Features" accessible through the connectivity manager static final String FEATURE_ENABLE_MMS = "enableMMS"; static final String FEATURE_ENABLE_SUPL = "enableSUPL"; Loading Loading @@ -401,34 +448,13 @@ public interface PhoneInternalInterface { * assigned) until PhoneStateChanged notification has occurred. * * @param dialString The dial string. * @param videoState The desired video state for the connection. * @exception CallStateException if a new outgoing call is not currently * possible because no more call slots exist or a call exists that is * dialing, alerting, ringing, or waiting. Other errors are * handled asynchronously. */ Connection dial(String dialString, int videoState) throws CallStateException; /** * Initiate a new voice connection with supplementary User to User * Information. This happens asynchronously, so you cannot assume the audio * path is connected (or a call index has been assigned) until * PhoneStateChanged notification has occurred. * * NOTE: If adding another parameter, consider creating a DialArgs parameter instead to * encapsulate all dial arguments and decrease scaffolding headache. * * @param dialString The dial string. * @param uusInfo The UUSInfo. * @param videoState The desired video state for the connection. * @param intentExtras The extras from the original CALL intent. * @param dialArgs Parameters to perform the dial with. * @exception CallStateException if a new outgoing call is not currently * possible because no more call slots exist or a call exists * that is dialing, alerting, ringing, or waiting. Other * errors are handled asynchronously. */ Connection dial(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) throws CallStateException; Connection dial(String dialString, @NonNull DialArgs dialArgs) throws CallStateException; /** * Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated Loading Loading
src/java/com/android/internal/telephony/CallManager.java +6 −2 Original line number Diff line number Diff line Loading @@ -964,7 +964,8 @@ public class CallManager { // FIXME Taken from klp-sprout-dev but setAudioMode was removed in L. //mIsEccDialing = PhoneNumberUtils.isEmergencyNumber(dialString); result = phone.dial(dialString, videoState); result = phone.dial(dialString, new PhoneInternalInterface.DialArgs.Builder<>() .setVideoState(videoState).build()); if (VDBG) { Rlog.d(LOG_TAG, "End dial(" + phone + ", "+ dialString + ")"); Loading @@ -986,7 +987,10 @@ public class CallManager { */ public Connection dial(Phone phone, String dialString, UUSInfo uusInfo, int videoState) throws CallStateException { return phone.dial(dialString, uusInfo, videoState, null); return phone.dial(dialString, new PhoneInternalInterface.DialArgs.Builder<>() .setUusInfo(uusInfo) .setVideoState(videoState).build()); } /** Loading
src/java/com/android/internal/telephony/Connection.java +17 −0 Original line number Diff line number Diff line Loading @@ -105,6 +105,8 @@ public abstract class Connection { public void onRttModifyRequestReceived(); public void onRttModifyResponseReceived(int status); public void onDisconnect(int cause); public void onRttInitiated(); public void onRttTerminated(); } /** Loading Loading @@ -146,6 +148,10 @@ public abstract class Connection { public void onRttModifyResponseReceived(int status) {} @Override public void onDisconnect(int cause) {} @Override public void onRttInitiated() {} @Override public void onRttTerminated() {} } public static final int AUDIO_QUALITY_STANDARD = 1; Loading Loading @@ -1062,6 +1068,17 @@ public abstract class Connection { } } public void onRttInitiated() { for (Listener l : mListeners) { l.onRttInitiated(); } } public void onRttTerminated() { for (Listener l : mListeners) { l.onRttTerminated(); } } /** * Notify interested parties that this connection disconnected. * {@code TelephonyConnection}, for example, uses this. Loading
src/java/com/android/internal/telephony/GsmCdmaPhone.java +19 −22 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static com.android.internal.telephony.CommandsInterface.CF_REASON_NO_REPL import static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL; import static com.android.internal.telephony.CommandsInterface.SERVICE_CLASS_VOICE; import android.annotation.NonNull; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ContentValues; Loading Loading @@ -1034,14 +1035,9 @@ public class GsmCdmaPhone extends Phone { } @Override public Connection dial(String dialString, int videoState) throws CallStateException { return dial(dialString, null, videoState, null); } @Override public Connection dial(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) public Connection dial(String dialString, @NonNull DialArgs dialArgs) throws CallStateException { if (!isPhoneTypeGsm() && uusInfo != null) { if (!isPhoneTypeGsm() && dialArgs.uusInfo != null) { throw new CallStateException("Sending UUS information NOT supported in CDMA!"); } Loading @@ -1056,7 +1052,7 @@ public class GsmCdmaPhone extends Phone { boolean useImsForCall = isImsUseEnabled() && imsPhone != null && (imsPhone.isVolteEnabled() || imsPhone.isWifiCallingEnabled() || (imsPhone.isVideoEnabled() && VideoProfile.isVideo(videoState))) (imsPhone.isVideoEnabled() && VideoProfile.isVideo(dialArgs.videoState))) && (imsPhone.getServiceState().getState() == ServiceState.STATE_IN_SERVICE); boolean useImsForEmergency = imsPhone != null Loading Loading @@ -1093,7 +1089,7 @@ public class GsmCdmaPhone extends Phone { if ((useImsForCall && !isUt) || (isUt && useImsForUt) || useImsForEmergency) { try { if (DBG) logd("Trying IMS PS call"); return imsPhone.dial(dialString, uusInfo, videoState, intentExtras); return imsPhone.dial(dialString, dialArgs); } catch (CallStateException e) { if (DBG) logd("IMS PS call exception " + e + "useImsForCall =" + useImsForCall + ", imsPhone =" + imsPhone); Loading @@ -1116,7 +1112,7 @@ public class GsmCdmaPhone extends Phone { } // Check non-emergency voice CS call - shouldn't dial when POWER_OFF if (mSST != null && mSST.mSS.getState() == ServiceState.STATE_POWER_OFF /* CS POWER_OFF */ && !VideoProfile.isVideo(videoState) /* voice call */ && !VideoProfile.isVideo(dialArgs.videoState) /* voice call */ && !isEmergency /* non-emergency call */) { throw new CallStateException( CallStateException.ERROR_POWER_OFF, Loading @@ -1128,7 +1124,7 @@ public class GsmCdmaPhone extends Phone { && mSST.mSS.getState() == ServiceState.STATE_OUT_OF_SERVICE /* CS out of service */ && !(mSST.mSS.getDataRegState() == ServiceState.STATE_IN_SERVICE && ServiceState.isLte(mSST.mSS.getRilDataRadioTechnology())) /* PS not in LTE */ && !VideoProfile.isVideo(videoState) /* voice call */ && !VideoProfile.isVideo(dialArgs.videoState) /* voice call */ && !isEmergency /* non-emergency call */) { throw new CallStateException( CallStateException.ERROR_OUT_OF_SERVICE, Loading @@ -1137,9 +1133,11 @@ public class GsmCdmaPhone extends Phone { if (DBG) logd("Trying (non-IMS) CS call"); if (isPhoneTypeGsm()) { return dialInternal(dialString, null, VideoProfile.STATE_AUDIO_ONLY, intentExtras); return dialInternal(dialString, new DialArgs.Builder<>() .setIntentExtras(dialArgs.intentExtras) .build()); } else { return dialInternal(dialString, null, videoState, intentExtras); return dialInternal(dialString, dialArgs); } } Loading Loading @@ -1180,14 +1178,13 @@ public class GsmCdmaPhone extends Phone { } @Override protected Connection dialInternal(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) protected Connection dialInternal(String dialString, DialArgs dialArgs) throws CallStateException { return dialInternal(dialString, uusInfo, videoState, intentExtras, null); return dialInternal(dialString, dialArgs, null); } protected Connection dialInternal(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras, ResultReceiver wrappedCallback) protected Connection dialInternal(String dialString, DialArgs dialArgs, ResultReceiver wrappedCallback) throws CallStateException { // Need to make sure dialString gets parsed properly Loading @@ -1206,9 +1203,10 @@ public class GsmCdmaPhone extends Phone { if (DBG) logd("dialInternal: dialing w/ mmi '" + mmi + "'..."); if (mmi == null) { return mCT.dial(newDialString, uusInfo, intentExtras); return mCT.dial(newDialString, dialArgs.uusInfo, dialArgs.intentExtras); } else if (mmi.isTemporaryModeCLIR()) { return mCT.dial(mmi.mDialingNumber, mmi.getCLIRMode(), uusInfo, intentExtras); return mCT.dial(mmi.mDialingNumber, mmi.getCLIRMode(), dialArgs.uusInfo, dialArgs.intentExtras); } else { mPendingMMIs.add(mmi); mMmiRegistrants.notifyRegistrants(new AsyncResult(null, mmi, null)); Loading Loading @@ -1281,8 +1279,7 @@ public class GsmCdmaPhone extends Phone { // Try USSD over GSM. try { dialInternal(ussdRequest, null, VideoProfile.STATE_AUDIO_ONLY, null, wrappedCallback); dialInternal(ussdRequest, new DialArgs.Builder<>().build(), wrappedCallback); } catch (Exception e) { logd("handleUssdRequest: exception" + e); return false; Loading
src/java/com/android/internal/telephony/Phone.java +3 −6 Original line number Diff line number Diff line Loading @@ -665,7 +665,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { String dialString = (String) ar.result; if (TextUtils.isEmpty(dialString)) return; try { dialInternal(dialString, null, VideoProfile.STATE_AUDIO_ONLY, null); dialInternal(dialString, new DialArgs.Builder().build()); } catch (CallStateException e) { Rlog.e(LOG_TAG, "silent redial failed: " + e); } Loading Loading @@ -3049,14 +3049,11 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { * Dials a number. * * @param dialString The number to dial. * @param uusInfo The UUSInfo. * @param videoState The video state for the call. * @param intentExtras Extras from the original CALL intent. * @param dialArgs Parameters to dial with. * @return The Connection. * @throws CallStateException */ protected Connection dialInternal( String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) protected Connection dialInternal(String dialString, DialArgs dialArgs) throws CallStateException { // dialInternal shall be overriden by GsmCdmaPhone return null; Loading
src/java/com/android/internal/telephony/PhoneInternalInterface.java +49 −23 Original line number Diff line number Diff line Loading @@ -16,12 +16,14 @@ package com.android.internal.telephony; import android.annotation.NonNull; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.ResultReceiver; import android.os.WorkSource; import android.telephony.CarrierConfigManager; import android.telecom.VideoProfile; import android.telephony.CellLocation; import android.telephony.ImsiEncryptionInfo; import android.telephony.NetworkScanRequest; Loading Loading @@ -62,6 +64,51 @@ public interface PhoneInternalInterface { UNKNOWN, SWITCH, SEPARATE, TRANSFER, CONFERENCE, REJECT, HANGUP, RESUME, HOLD; } /** * Arguments that control behavior of dialing a call. */ public static class DialArgs { public static class Builder<T extends Builder<T>> { protected UUSInfo mUusInfo; protected int mVideoState = VideoProfile.STATE_AUDIO_ONLY; protected Bundle mIntentExtras; public T setUusInfo(UUSInfo uusInfo) { mUusInfo = uusInfo; return (T) this; } public T setVideoState(int videoState) { mVideoState = videoState; return (T) this; } public T setIntentExtras(Bundle intentExtras) { this.mIntentExtras = intentExtras; return (T) this; } public PhoneInternalInterface.DialArgs build() { return new DialArgs(this); } } /** The UUSInfo */ public final UUSInfo uusInfo; /** The desired video state for the connection. */ public final int videoState; /** The extras from the original CALL intent. */ public final Bundle intentExtras; protected DialArgs(Builder b) { this.uusInfo = b.mUusInfo; this.videoState = b.mVideoState; this.intentExtras = b.mIntentExtras; } } // "Features" accessible through the connectivity manager static final String FEATURE_ENABLE_MMS = "enableMMS"; static final String FEATURE_ENABLE_SUPL = "enableSUPL"; Loading Loading @@ -401,34 +448,13 @@ public interface PhoneInternalInterface { * assigned) until PhoneStateChanged notification has occurred. * * @param dialString The dial string. * @param videoState The desired video state for the connection. * @exception CallStateException if a new outgoing call is not currently * possible because no more call slots exist or a call exists that is * dialing, alerting, ringing, or waiting. Other errors are * handled asynchronously. */ Connection dial(String dialString, int videoState) throws CallStateException; /** * Initiate a new voice connection with supplementary User to User * Information. This happens asynchronously, so you cannot assume the audio * path is connected (or a call index has been assigned) until * PhoneStateChanged notification has occurred. * * NOTE: If adding another parameter, consider creating a DialArgs parameter instead to * encapsulate all dial arguments and decrease scaffolding headache. * * @param dialString The dial string. * @param uusInfo The UUSInfo. * @param videoState The desired video state for the connection. * @param intentExtras The extras from the original CALL intent. * @param dialArgs Parameters to perform the dial with. * @exception CallStateException if a new outgoing call is not currently * possible because no more call slots exist or a call exists * that is dialing, alerting, ringing, or waiting. Other * errors are handled asynchronously. */ Connection dial(String dialString, UUSInfo uusInfo, int videoState, Bundle intentExtras) throws CallStateException; Connection dial(String dialString, @NonNull DialArgs dialArgs) throws CallStateException; /** * Handles PIN MMI commands (PIN/PIN2/PUK/PUK2), which are initiated Loading