diff options
-rw-r--r-- | core/java/android/hardware/usb/OWNERS | 6 | ||||
-rw-r--r-- | media/java/android/media/flags/editing.aconfig | 7 | ||||
-rw-r--r-- | media/java/android/mtp/OWNERS | 7 | ||||
-rw-r--r-- | media/tests/MtpTests/OWNERS | 7 | ||||
-rw-r--r-- | nfc/api/current.txt | 9 | ||||
-rw-r--r-- | nfc/api/system-current.txt | 2 | ||||
-rw-r--r-- | nfc/java/android/nfc/ComponentNameAndUser.aidl | 19 | ||||
-rw-r--r-- | nfc/java/android/nfc/ComponentNameAndUser.java | 100 | ||||
-rw-r--r-- | nfc/java/android/nfc/INfcCardEmulation.aidl | 5 | ||||
-rw-r--r-- | nfc/java/android/nfc/INfcEventListener.aidl | 11 | ||||
-rw-r--r-- | nfc/java/android/nfc/INfcOemExtensionCallback.aidl | 2 | ||||
-rw-r--r-- | nfc/java/android/nfc/NfcOemExtension.java | 7 | ||||
-rw-r--r-- | nfc/java/android/nfc/cardemulation/CardEmulation.java | 109 | ||||
-rw-r--r-- | nfc/java/android/nfc/cardemulation/HostApduService.java | 40 | ||||
-rwxr-xr-x | ravenwood/scripts/run-ravenwood-tests.sh | 85 | ||||
-rw-r--r-- | services/core/java/com/android/server/appbinding/AppBindingService.java | 3 | ||||
-rw-r--r-- | services/usb/OWNERS | 8 |
17 files changed, 347 insertions, 80 deletions
diff --git a/core/java/android/hardware/usb/OWNERS b/core/java/android/hardware/usb/OWNERS index a753f9634d0d..37604bc2eb65 100644 --- a/core/java/android/hardware/usb/OWNERS +++ b/core/java/android/hardware/usb/OWNERS @@ -1,7 +1,7 @@ # Bug component: 175220 -aprasath@google.com -kumarashishg@google.com -sarup@google.com anothermark@google.com +febinthattil@google.com +aprasath@google.com badhri@google.com +kumarashishg@google.com
\ No newline at end of file diff --git a/media/java/android/media/flags/editing.aconfig b/media/java/android/media/flags/editing.aconfig index 185f579df4b9..0adc4783445a 100644 --- a/media/java/android/media/flags/editing.aconfig +++ b/media/java/android/media/flags/editing.aconfig @@ -15,3 +15,10 @@ flag { description: "Enable B frames for Stagefright recorder." bug: "341121900" } + +flag { + name: "muxer_mp4_enable_apv" + namespace: "media_solutions" + description: "Enable APV support in mp4 writer." + bug: "370061501" +} diff --git a/media/java/android/mtp/OWNERS b/media/java/android/mtp/OWNERS index 6b5336e83bdc..77ed08b1f9a5 100644 --- a/media/java/android/mtp/OWNERS +++ b/media/java/android/mtp/OWNERS @@ -1,10 +1,9 @@ set noparent -aprasath@google.com anothermark@google.com -kumarashishg@google.com -sarup@google.com +febinthattil@google.com +aprasath@google.com jsharkey@android.com jameswei@google.com rmojumder@google.com - +kumarashishg@google.com diff --git a/media/tests/MtpTests/OWNERS b/media/tests/MtpTests/OWNERS index 6b5336e83bdc..bdb6cdbea332 100644 --- a/media/tests/MtpTests/OWNERS +++ b/media/tests/MtpTests/OWNERS @@ -1,10 +1,9 @@ set noparent -aprasath@google.com anothermark@google.com -kumarashishg@google.com -sarup@google.com +febinthattil@google.com +aprasath@google.com jsharkey@android.com jameswei@google.com rmojumder@google.com - +kumarashishg@google.com
\ No newline at end of file diff --git a/nfc/api/current.txt b/nfc/api/current.txt index 96b7c1339190..008120429c40 100644 --- a/nfc/api/current.txt +++ b/nfc/api/current.txt @@ -207,6 +207,7 @@ package android.nfc.cardemulation { method public boolean isDefaultServiceForCategory(android.content.ComponentName, String); method @FlaggedApi("android.nfc.enable_card_emulation_euicc") public boolean isEuiccSupported(); method public boolean registerAidsForService(android.content.ComponentName, String, java.util.List<java.lang.String>); + method @FlaggedApi("android.nfc.nfc_event_listener") public void registerNfcEventListener(@NonNull java.util.concurrent.Executor, @NonNull android.nfc.cardemulation.CardEmulation.NfcEventListener); method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean registerPollingLoopFilterForService(@NonNull android.content.ComponentName, @NonNull String, boolean); method @FlaggedApi("android.nfc.nfc_read_polling_loop") public boolean registerPollingLoopPatternFilterForService(@NonNull android.content.ComponentName, @NonNull String, boolean); method public boolean removeAidsForService(android.content.ComponentName, String); @@ -216,6 +217,7 @@ package android.nfc.cardemulation { method public boolean setPreferredService(android.app.Activity, android.content.ComponentName); method @FlaggedApi("android.nfc.nfc_observe_mode") public boolean setShouldDefaultToObserveModeForService(@NonNull android.content.ComponentName, boolean); method public boolean supportsAidPrefixRegistration(); + method @FlaggedApi("android.nfc.nfc_event_listener") public void unregisterNfcEventListener(@NonNull android.nfc.cardemulation.CardEmulation.NfcEventListener); method @NonNull @RequiresPermission(android.Manifest.permission.NFC) public boolean unsetOffHostForService(@NonNull android.content.ComponentName); method public boolean unsetPreferredService(android.app.Activity); field @Deprecated public static final String ACTION_CHANGE_DEFAULT = "android.nfc.cardemulation.action.ACTION_CHANGE_DEFAULT"; @@ -233,13 +235,16 @@ package android.nfc.cardemulation { field public static final int SELECTION_MODE_PREFER_DEFAULT = 0; // 0x0 } + @FlaggedApi("android.nfc.nfc_event_listener") public static interface CardEmulation.NfcEventListener { + method @FlaggedApi("android.nfc.nfc_event_listener") public default void onObserveModeStateChanged(boolean); + method @FlaggedApi("android.nfc.nfc_event_listener") public default void onPreferredServiceChanged(boolean); + } + public abstract class HostApduService extends android.app.Service { ctor public HostApduService(); method public final void notifyUnhandled(); method public final android.os.IBinder onBind(android.content.Intent); method public abstract void onDeactivated(int); - method @FlaggedApi("android.nfc.nfc_event_listener") public void onObserveModeStateChanged(boolean); - method @FlaggedApi("android.nfc.nfc_event_listener") public void onPreferredServiceChanged(boolean); method public abstract byte[] processCommandApdu(byte[], android.os.Bundle); method @FlaggedApi("android.nfc.nfc_read_polling_loop") public void processPollingFrames(@NonNull java.util.List<android.nfc.cardemulation.PollingFrame>); method public final void sendResponseApdu(byte[]); diff --git a/nfc/api/system-current.txt b/nfc/api/system-current.txt index 24e14e69637b..80aa7d765085 100644 --- a/nfc/api/system-current.txt +++ b/nfc/api/system-current.txt @@ -105,7 +105,7 @@ package android.nfc { method public void onRfFieldActivated(boolean); method public void onRoutingChanged(); method public void onStateUpdated(int); - method public void onTagConnected(boolean, @NonNull android.nfc.Tag); + method public void onTagConnected(boolean); method public void onTagDispatch(@NonNull java.util.function.Consumer<java.lang.Boolean>); } diff --git a/nfc/java/android/nfc/ComponentNameAndUser.aidl b/nfc/java/android/nfc/ComponentNameAndUser.aidl new file mode 100644 index 000000000000..e677998a7970 --- /dev/null +++ b/nfc/java/android/nfc/ComponentNameAndUser.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2024 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.nfc; + +parcelable ComponentNameAndUser;
\ No newline at end of file diff --git a/nfc/java/android/nfc/ComponentNameAndUser.java b/nfc/java/android/nfc/ComponentNameAndUser.java new file mode 100644 index 000000000000..59e6c62926c9 --- /dev/null +++ b/nfc/java/android/nfc/ComponentNameAndUser.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2024 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.nfc; + +import android.annotation.UserIdInt; +import android.content.ComponentName; +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.Objects; + +/** + * @hide + */ +public class ComponentNameAndUser implements Parcelable { + @UserIdInt private final int mUserId; + private ComponentName mComponentName; + + public ComponentNameAndUser(@UserIdInt int userId, ComponentName componentName) { + mUserId = userId; + mComponentName = componentName; + } + + /** + * @hide + */ + public int describeContents() { + return 0; + } + + /** + * @hide + */ + public void writeToParcel(Parcel out, int flags) { + out.writeInt(mUserId); + out.writeParcelable(mComponentName, flags); + } + + public static final Parcelable.Creator<ComponentNameAndUser> CREATOR = + new Parcelable.Creator<ComponentNameAndUser>() { + public ComponentNameAndUser createFromParcel(Parcel in) { + return new ComponentNameAndUser(in); + } + + public ComponentNameAndUser[] newArray(int size) { + return new ComponentNameAndUser[size]; + } + }; + + private ComponentNameAndUser(Parcel in) { + mUserId = in.readInt(); + mComponentName = in.readParcelable(null, ComponentName.class); + } + + @UserIdInt + public int getUserId() { + return mUserId; + } + + public ComponentName getComponentName() { + return mComponentName; + } + + @Override + public String toString() { + return mComponentName + " for user id: " + mUserId; + } + + @Override + public boolean equals(Object obj) { + if (obj != null && obj instanceof ComponentNameAndUser) { + ComponentNameAndUser other = (ComponentNameAndUser) obj; + return other.getUserId() == mUserId + && Objects.equals(other.getComponentName(), mComponentName); + } + return false; + } + + @Override + public int hashCode() { + if (mComponentName == null) { + return mUserId; + } + return mComponentName.hashCode() + mUserId; + } +} diff --git a/nfc/java/android/nfc/INfcCardEmulation.aidl b/nfc/java/android/nfc/INfcCardEmulation.aidl index 8535e4a9cfd2..5e2e92d958a4 100644 --- a/nfc/java/android/nfc/INfcCardEmulation.aidl +++ b/nfc/java/android/nfc/INfcCardEmulation.aidl @@ -17,6 +17,8 @@ package android.nfc; import android.content.ComponentName; +import android.nfc.INfcEventListener; + import android.nfc.cardemulation.AidGroup; import android.nfc.cardemulation.ApduServiceInfo; import android.os.RemoteCallback; @@ -55,4 +57,7 @@ interface INfcCardEmulation boolean isAutoChangeEnabled(); List<String> getRoutingStatus(); void overwriteRoutingTable(int userHandle, String emptyAid, String protocol, String tech, String sc); + + void registerNfcEventListener(in INfcEventListener listener); + void unregisterNfcEventListener(in INfcEventListener listener); } diff --git a/nfc/java/android/nfc/INfcEventListener.aidl b/nfc/java/android/nfc/INfcEventListener.aidl new file mode 100644 index 000000000000..5162c26ac536 --- /dev/null +++ b/nfc/java/android/nfc/INfcEventListener.aidl @@ -0,0 +1,11 @@ +package android.nfc; + +import android.nfc.ComponentNameAndUser; + +/** + * @hide + */ +oneway interface INfcEventListener { + void onPreferredServiceChanged(in ComponentNameAndUser ComponentNameAndUser); + void onObserveModeStateChanged(boolean isEnabled); +}
\ No newline at end of file diff --git a/nfc/java/android/nfc/INfcOemExtensionCallback.aidl b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl index 48c7ee659266..7d0837a9b096 100644 --- a/nfc/java/android/nfc/INfcOemExtensionCallback.aidl +++ b/nfc/java/android/nfc/INfcOemExtensionCallback.aidl @@ -27,7 +27,7 @@ import java.util.List; * @hide */ interface INfcOemExtensionCallback { - void onTagConnected(boolean connected, in Tag tag); + void onTagConnected(boolean connected); void onStateUpdated(int state); void onApplyRouting(in ResultReceiver isSkipped); void onNdefRead(in ResultReceiver isSkipped); diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java index 474ff8c663e6..0a4c488f6b47 100644 --- a/nfc/java/android/nfc/NfcOemExtension.java +++ b/nfc/java/android/nfc/NfcOemExtension.java @@ -195,9 +195,8 @@ public final class NfcOemExtension { * ex - if tag is connected notify cover and Nfctest app if app is in testing mode * * @param connected status of the tag true if tag is connected otherwise false - * @param tag Tag details */ - void onTagConnected(boolean connected, @NonNull Tag tag); + void onTagConnected(boolean connected); /** * Update the Nfc Adapter State @@ -684,9 +683,9 @@ public final class NfcOemExtension { private final class NfcOemExtensionCallback extends INfcOemExtensionCallback.Stub { @Override - public void onTagConnected(boolean connected, Tag tag) throws RemoteException { + public void onTagConnected(boolean connected) throws RemoteException { mCallbackMap.forEach((cb, ex) -> - handleVoid2ArgCallback(connected, tag, cb::onTagConnected, ex)); + handleVoidCallback(connected, cb::onTagConnected, ex)); } @Override diff --git a/nfc/java/android/nfc/cardemulation/CardEmulation.java b/nfc/java/android/nfc/cardemulation/CardEmulation.java index d8f04c50b695..eb28c3b9c930 100644 --- a/nfc/java/android/nfc/cardemulation/CardEmulation.java +++ b/nfc/java/android/nfc/cardemulation/CardEmulation.java @@ -17,6 +17,7 @@ package android.nfc.cardemulation; import android.Manifest; +import android.annotation.CallbackExecutor; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; @@ -33,15 +34,18 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; +import android.nfc.ComponentNameAndUser; import android.nfc.Constants; import android.nfc.Flags; import android.nfc.INfcCardEmulation; +import android.nfc.INfcEventListener; import android.nfc.NfcAdapter; import android.os.Build; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.SettingNotFoundException; +import android.util.ArrayMap; import android.util.Log; import java.lang.annotation.Retention; @@ -50,6 +54,8 @@ import java.util.HashMap; import java.util.HexFormat; import java.util.List; import java.util.Locale; +import java.util.Objects; +import java.util.concurrent.Executor; import java.util.regex.Pattern; /** @@ -1076,4 +1082,107 @@ public final class CardEmulation { default -> throw new IllegalStateException("Unexpected value: " + route); }; } + + /** Listener for preferred service state changes. */ + @FlaggedApi(android.nfc.Flags.FLAG_NFC_EVENT_LISTENER) + public interface NfcEventListener { + /** + * This method is called when this package gains or loses preferred Nfc service status, + * either the Default Wallet Role holder (see {@link + * android.app.role.RoleManager#ROLE_WALLET}) or the preferred service of the foreground + * activity set with {@link #setPreferredService(Activity, ComponentName)} + * + * @param isPreferred true is this service has become the preferred Nfc service, false if it + * is no longer the preferred service + */ + @FlaggedApi(android.nfc.Flags.FLAG_NFC_EVENT_LISTENER) + default void onPreferredServiceChanged(boolean isPreferred) {} + + /** + * This method is called when observe mode has been enabled or disabled. + * + * @param isEnabled true if observe mode has been enabled, false if it has been disabled + */ + @FlaggedApi(android.nfc.Flags.FLAG_NFC_EVENT_LISTENER) + default void onObserveModeStateChanged(boolean isEnabled) {} + } + + private final ArrayMap<NfcEventListener, Executor> mNfcEventListeners = new ArrayMap<>(); + + final INfcEventListener mINfcEventListener = + new INfcEventListener.Stub() { + public void onPreferredServiceChanged(ComponentNameAndUser componentNameAndUser) { + if (!android.nfc.Flags.nfcEventListener()) { + return; + } + boolean isPreferred = + componentNameAndUser != null + && componentNameAndUser.getUserId() + == mContext.getUser().getIdentifier() + && componentNameAndUser.getComponentName() != null + && Objects.equals( + mContext.getPackageName(), + componentNameAndUser.getComponentName() + .getPackageName()); + synchronized (mNfcEventListeners) { + mNfcEventListeners.forEach( + (listener, executor) -> { + executor.execute( + () -> listener.onPreferredServiceChanged(isPreferred)); + }); + } + } + + public void onObserveModeStateChanged(boolean isEnabled) { + if (!android.nfc.Flags.nfcEventListener()) { + return; + } + synchronized (mNfcEventListeners) { + mNfcEventListeners.forEach( + (listener, executor) -> { + executor.execute( + () -> listener.onObserveModeStateChanged(isEnabled)); + }); + } + } + }; + + /** + * Register a listener for NFC Events. + * + * @param executor The Executor to run the call back with + * @param listener The listener to register + */ + @FlaggedApi(android.nfc.Flags.FLAG_NFC_EVENT_LISTENER) + public void registerNfcEventListener( + @NonNull @CallbackExecutor Executor executor, @NonNull NfcEventListener listener) { + if (!android.nfc.Flags.nfcEventListener()) { + return; + } + synchronized (mNfcEventListeners) { + mNfcEventListeners.put(listener, executor); + if (mNfcEventListeners.size() == 1) { + callService(() -> sService.registerNfcEventListener(mINfcEventListener)); + } + } + } + + /** + * Unregister a preferred service listener that was previously registered with {@link + * #registerNfcEventListener(Executor, NfcEventListener)} + * + * @param listener The previously registered listener to unregister + */ + @FlaggedApi(android.nfc.Flags.FLAG_NFC_EVENT_LISTENER) + public void unregisterNfcEventListener(@NonNull NfcEventListener listener) { + if (!android.nfc.Flags.nfcEventListener()) { + return; + } + synchronized (mNfcEventListeners) { + mNfcEventListeners.remove(listener); + if (mNfcEventListeners.size() == 0) { + callService(() -> sService.unregisterNfcEventListener(mINfcEventListener)); + } + } + } } diff --git a/nfc/java/android/nfc/cardemulation/HostApduService.java b/nfc/java/android/nfc/cardemulation/HostApduService.java index cd8e19c54565..4f601f0704b4 100644 --- a/nfc/java/android/nfc/cardemulation/HostApduService.java +++ b/nfc/java/android/nfc/cardemulation/HostApduService.java @@ -239,15 +239,6 @@ public abstract class HostApduService extends Service { */ public static final int MSG_POLLING_LOOP = 4; - /** - * @hide - */ - public static final int MSG_OBSERVE_MODE_CHANGE = 5; - - /** - * @hide - */ - public static final int MSG_PREFERRED_SERVICE_CHANGED = 6; /** * @hide @@ -343,16 +334,6 @@ public abstract class HostApduService extends Service { processPollingFrames(pollingFrames); } break; - case MSG_OBSERVE_MODE_CHANGE: - if (android.nfc.Flags.nfcEventListener()) { - onObserveModeStateChanged(msg.arg1 == 1); - } - break; - case MSG_PREFERRED_SERVICE_CHANGED: - if (android.nfc.Flags.nfcEventListener()) { - onPreferredServiceChanged(msg.arg1 == 1); - } - break; default: super.handleMessage(msg); } @@ -462,25 +443,4 @@ public abstract class HostApduService extends Service { */ public abstract void onDeactivated(int reason); - - /** - * This method is called when this service is the preferred Nfc service and - * Observe mode has been enabled or disabled. - * - * @param isEnabled true if observe mode has been enabled, false if it has been disabled - */ - @FlaggedApi(android.nfc.Flags.FLAG_NFC_EVENT_LISTENER) - public void onObserveModeStateChanged(boolean isEnabled) { - - } - - /** - * This method is called when this service gains or loses preferred Nfc service status. - * - * @param isPreferred true is this service has become the preferred Nfc service, - * false if it is no longer the preferred service - */ - @FlaggedApi(android.nfc.Flags.FLAG_NFC_EVENT_LISTENER) - public void onPreferredServiceChanged(boolean isPreferred) { - } } diff --git a/ravenwood/scripts/run-ravenwood-tests.sh b/ravenwood/scripts/run-ravenwood-tests.sh index 5d623e0b6c36..672c685aa6d7 100755 --- a/ravenwood/scripts/run-ravenwood-tests.sh +++ b/ravenwood/scripts/run-ravenwood-tests.sh @@ -18,12 +18,38 @@ # Options: # # -s: "Smoke" test -- skip slow tests (SysUI, ICU) +# +# -x PCRE: Specify exclusion filter in PCRE +# Example: -x '^(Cts|hoststub)' # Exclude CTS and hoststubgen tests. +# +# -f PCRE: Specify inclusion filter in PCRE + + +# Regex to identify slow tests, in PCRE +SLOW_TEST_RE='^(SystemUiRavenTests|CtsIcuTestCasesRavenwood)$' smoke=0 -while getopts "s" opt; do +include_re="" +exclude_re="" +smoke_exclude_re="" +dry_run="" +while getopts "sx:f:d" opt; do case "$opt" in s) - smoke=1 + # Remove slow tests. + smoke_exclude_re="$SLOW_TEST_RE" + ;; + x) + # Take a PCRE from the arg, and use it as an exclusion filter. + exclude_re="$OPTARG" + ;; + f) + # Take a PCRE from the arg, and use it as an inclusion filter. + include_re="$OPTARG" + ;; + d) + # Dry run + dry_run="echo" ;; '?') exit 1 @@ -35,21 +61,46 @@ shift $(($OPTIND - 1)) all_tests=(hoststubgentest tiny-framework-dump-test hoststubgen-invoke-test ravenwood-stats-checker) all_tests+=( $(${0%/*}/list-ravenwood-tests.sh) ) -# Regex to identify slow tests, in PCRE -slow_tests_re='^(SystemUiRavenTests|CtsIcuTestCasesRavenwood)$' - -if (( $smoke )) ; then - # Remove the slow tests. - all_tests=( $( - for t in "${all_tests[@]}"; do - echo $t | grep -vP "$slow_tests_re" - done - ) ) -fi +filter() { + local re="$1" + local grep_arg="$2" + if [[ "$re" == "" ]] ; then + cat # No filtering + else + grep $grep_arg -P "$re" + fi +} -run() { - echo "Running: $*" - "${@}" +filter_in() { + filter "$1" } -run ${ATEST:-atest} "${all_tests[@]}" +filter_out() { + filter "$1" -v +} + + +# Remove the slow tests. +targets=( $( + for t in "${all_tests[@]}"; do + echo $t | filter_in "$include_re" | filter_out "$smoke_exclude_re" | filter_out "$exclude_re" + done +) ) + +# Show the target tests + +echo "Target tests:" +for t in "${targets[@]}"; do + echo " $t" +done + +# Calculate the removed tests. + +diff="$(diff <(echo "${all_tests[@]}" | tr ' ' '\n') <(echo "${targets[@]}" | tr ' ' '\n') )" + +if [[ "$diff" != "" ]]; then + echo "Excluded tests:" + echo "$diff" +fi + +$dry_run ${ATEST:-atest} "${targets[@]}" diff --git a/services/core/java/com/android/server/appbinding/AppBindingService.java b/services/core/java/com/android/server/appbinding/AppBindingService.java index 5db6dc7ccc15..6ccb3ee8bcc9 100644 --- a/services/core/java/com/android/server/appbinding/AppBindingService.java +++ b/services/core/java/com/android/server/appbinding/AppBindingService.java @@ -235,6 +235,9 @@ public class AppBindingService extends Binder { } final String action = intent.getAction(); + if (action == null) { + return; + } if (Intent.ACTION_USER_REMOVED.equals(action)) { onUserRemoved(userId); diff --git a/services/usb/OWNERS b/services/usb/OWNERS index d35dbb56437b..2dff392d4e34 100644 --- a/services/usb/OWNERS +++ b/services/usb/OWNERS @@ -1,9 +1,9 @@ -aprasath@google.com -kumarashishg@google.com -sarup@google.com anothermark@google.com +febinthattil@google.com +aprasath@google.com badhri@google.com elaurent@google.com albertccwang@google.com jameswei@google.com -howardyen@google.com
\ No newline at end of file +howardyen@google.com +kumarashishg@google.com
\ No newline at end of file |