diff options
21 files changed, 187 insertions, 86 deletions
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index 0bd11bbced44..c63c68b3d024 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -1474,6 +1474,7 @@ Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;-><init>(Landroid/os/IBin  Landroid/content/pm/IPackageDeleteObserver2$Stub$Proxy;->mRemote:Landroid/os/IBinder;  Landroid/content/pm/IPackageDeleteObserver2$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageDeleteObserver2;  Landroid/content/pm/IPackageDeleteObserver2;->onPackageDeleted(Ljava/lang/String;ILjava/lang/String;)V +Landroid/content/pm/IPackageInstaller;->uninstall(Landroid/content/pm/VersionedPackage;Ljava/lang/String;ILandroid/content/IntentSender;I)V  Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;-><init>(Landroid/os/IBinder;)V  Landroid/content/pm/IPackageInstallerCallback$Stub$Proxy;->mRemote:Landroid/os/IBinder;  Landroid/content/pm/IPackageInstallerCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/IPackageInstallerCallback; @@ -1522,6 +1523,7 @@ Landroid/content/pm/IPackageManager;->getInstallLocation()I  Landroid/content/pm/IPackageManager;->getInstrumentationInfo(Landroid/content/ComponentName;I)Landroid/content/pm/InstrumentationInfo;  Landroid/content/pm/IPackageManager;->getLastChosenActivity(Landroid/content/Intent;Ljava/lang/String;I)Landroid/content/pm/ResolveInfo;  Landroid/content/pm/IPackageManager;->getNameForUid(I)Ljava/lang/String; +Landroid/content/pm/IPackageManager;->getPackageInstaller()Landroid/content/pm/IPackageInstaller;  Landroid/content/pm/IPackageManager;->getPackagesForUid(I)[Ljava/lang/String;  Landroid/content/pm/IPackageManager;->getPackageUid(Ljava/lang/String;II)I  Landroid/content/pm/IPackageManager;->getPermissionControllerPackageName()Ljava/lang/String; @@ -5979,6 +5981,7 @@ Landroid/view/inputmethod/InputMethodManager;->getInputMethodWindowVisibleHeight  Landroid/view/inputmethod/InputMethodManager;->getInstance()Landroid/view/inputmethod/InputMethodManager;  Landroid/view/inputmethod/InputMethodManager;->isCursorAnchorInfoEnabled()Z  Landroid/view/inputmethod/InputMethodManager;->mCurId:Ljava/lang/String; +Landroid/view/inputmethod/InputMethodManager;->mCurMethod:Lcom/android/internal/view/IInputMethodSession;  Landroid/view/inputmethod/InputMethodManager;->mCurRootView:Landroid/view/View;  Landroid/view/inputmethod/InputMethodManager;->mCursorRect:Landroid/graphics/Rect;  Landroid/view/inputmethod/InputMethodManager;->mH:Landroid/view/inputmethod/InputMethodManager$H; @@ -6527,6 +6530,7 @@ Landroid/view/ViewRootImpl;->mWidth:I  Landroid/view/ViewRootImpl;->mWindowSession:Landroid/view/IWindowSession;  Landroid/view/ViewRootImpl;->scheduleTraversals()V  Landroid/view/ViewRootImpl;->setLocalDragState(Ljava/lang/Object;)V +Landroid/view/ViewRootImpl;->sRunQueues:Ljava/lang/ThreadLocal;  Landroid/view/ViewTreeObserver$InternalInsetsInfo;-><init>()V  Landroid/view/ViewTreeObserver$InternalInsetsInfo;->contentInsets:Landroid/graphics/Rect;  Landroid/view/ViewTreeObserver$InternalInsetsInfo;->mTouchableInsets:I diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 65a612587827..baa38bb2f604 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -5060,9 +5060,9 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager              child.assignParent(this);          } else {              child.mParent = this; -            if (child.hasUnhandledKeyListener()) { -                incrementChildUnhandledKeyListeners(); -            } +        } +        if (child.hasUnhandledKeyListener()) { +            incrementChildUnhandledKeyListeners();          }          final boolean childHasFocus = child.hasFocus(); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index ed67075d38d6..48f380d87dcc 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -76,7 +76,6 @@ import android.util.LongArray;  import android.util.MergedConfiguration;  import android.util.Slog;  import android.util.SparseArray; -import android.util.SparseBooleanArray;  import android.util.TimeUtils;  import android.util.TypedValue;  import android.view.Surface.OutOfResourcesException; @@ -5008,10 +5007,7 @@ public final class ViewRootImpl implements ViewParent,          private int processKeyEvent(QueuedInputEvent q) {              final KeyEvent event = (KeyEvent)q.mEvent; -            mUnhandledKeyManager.mDispatched = false; - -            if (mUnhandledKeyManager.hasFocus() -                    && mUnhandledKeyManager.dispatchUnique(mView, event)) { +            if (mUnhandledKeyManager.preViewDispatch(event)) {                  return FINISH_HANDLED;              } @@ -5024,7 +5020,10 @@ public final class ViewRootImpl implements ViewParent,                  return FINISH_NOT_HANDLED;              } -            if (mUnhandledKeyManager.dispatchUnique(mView, event)) { +            // This dispatch is for windows that don't have a Window.Callback. Otherwise, +            // the Window.Callback usually will have already called this (see +            // DecorView.superDispatchKeyEvent) leaving this call a no-op. +            if (mUnhandledKeyManager.dispatch(mView, event)) {                  return FINISH_HANDLED;              } @@ -7062,6 +7061,10 @@ public final class ViewRootImpl implements ViewParent,              stage = q.shouldSkipIme() ? mFirstPostImeInputStage : mFirstInputStage;          } +        if (q.mEvent instanceof KeyEvent) { +            mUnhandledKeyManager.preDispatch((KeyEvent) q.mEvent); +        } +          if (stage != null) {              handleWindowFocusChanged();              stage.deliver(q); @@ -7830,7 +7833,7 @@ public final class ViewRootImpl implements ViewParent,       * @param event       * @return {@code true} if the event was handled, {@code false} otherwise.       */ -    public boolean dispatchKeyFallbackEvent(KeyEvent event) { +    public boolean dispatchUnhandledKeyEvent(KeyEvent event) {          return mUnhandledKeyManager.dispatch(mView, event);      } @@ -8422,35 +8425,74 @@ public final class ViewRootImpl implements ViewParent,      }      private static class UnhandledKeyManager { -          // This is used to ensure that unhandled events are only dispatched once. We attempt          // to dispatch more than once in order to achieve a certain order. Specifically, if we          // are in an Activity or Dialog (and have a Window.Callback), the unhandled events should -        // be dispatched after the view hierarchy, but before the Activity. However, if we aren't +        // be dispatched after the view hierarchy, but before the Callback. However, if we aren't          // in an activity, we still want unhandled keys to be dispatched. -        boolean mDispatched = false; +        private boolean mDispatched = true; -        SparseBooleanArray mCapturedKeys = new SparseBooleanArray(); -        WeakReference<View> mCurrentReceiver = null; +        // Keeps track of which Views have unhandled key focus for which keys. This doesn't +        // include modifiers. +        private final SparseArray<WeakReference<View>> mCapturedKeys = new SparseArray<>(); -        private void updateCaptureState(KeyEvent event) { -            if (event.getAction() == KeyEvent.ACTION_DOWN) { -                mCapturedKeys.append(event.getKeyCode(), true); +        // The current receiver. This value is transient and used between the pre-dispatch and +        // pre-view phase to ensure that other input-stages don't interfere with tracking. +        private WeakReference<View> mCurrentReceiver = null; + +        boolean dispatch(View root, KeyEvent event) { +            if (mDispatched) { +                return false;              } -            if (event.getAction() == KeyEvent.ACTION_UP) { -                mCapturedKeys.delete(event.getKeyCode()); +            View consumer; +            try { +                Trace.traceBegin(Trace.TRACE_TAG_VIEW, "UnhandledKeyEvent dispatch"); +                mDispatched = true; + +                consumer = root.dispatchUnhandledKeyEvent(event); + +                // If an unhandled listener handles one, then keep track of it so that the +                // consuming view is first to receive its repeats and release as well. +                if (event.getAction() == KeyEvent.ACTION_DOWN) { +                    int keycode = event.getKeyCode(); +                    if (consumer != null && !KeyEvent.isModifierKey(keycode)) { +                        mCapturedKeys.put(keycode, new WeakReference<>(consumer)); +                    } +                } +            } finally { +                Trace.traceEnd(Trace.TRACE_TAG_VIEW);              } +            return consumer != null;          } -        boolean dispatch(View root, KeyEvent event) { -            Trace.traceBegin(Trace.TRACE_TAG_VIEW, "KeyFallback dispatch"); -            mDispatched = true; - -            updateCaptureState(event); +        /** +         * Called before the event gets dispatched to anything +         */ +        void preDispatch(KeyEvent event) { +            // Always clean-up 'up' events since it's possible for earlier dispatch stages to +            // consume them without consuming the corresponding 'down' event. +            mCurrentReceiver = null; +            if (event.getAction() == KeyEvent.ACTION_UP) { +                int idx = mCapturedKeys.indexOfKey(event.getKeyCode()); +                if (idx >= 0) { +                    mCurrentReceiver = mCapturedKeys.valueAt(idx); +                    mCapturedKeys.removeAt(idx); +                } +            } +        } +        /** +         * Called before the event gets dispatched to the view hierarchy +         * @return {@code true} if an unhandled handler has focus and consumed the event +         */ +        boolean preViewDispatch(KeyEvent event) { +            mDispatched = false; +            if (mCurrentReceiver == null) { +                mCurrentReceiver = mCapturedKeys.get(event.getKeyCode()); +            }              if (mCurrentReceiver != null) {                  View target = mCurrentReceiver.get(); -                if (mCapturedKeys.size() == 0) { +                if (event.getAction() == KeyEvent.ACTION_UP) {                      mCurrentReceiver = null;                  }                  if (target != null && target.isAttachedToWindow()) { @@ -8459,24 +8501,7 @@ public final class ViewRootImpl implements ViewParent,                  // consume anyways so that we don't feed uncaptured key events to other views                  return true;              } - -            View consumer = root.dispatchUnhandledKeyEvent(event); -            if (consumer != null) { -                mCurrentReceiver = new WeakReference<>(consumer); -            } -            Trace.traceEnd(Trace.TRACE_TAG_VIEW); -            return consumer != null; -        } - -        boolean hasFocus() { -            return mCurrentReceiver != null; -        } - -        boolean dispatchUnique(View root, KeyEvent event) { -            if (mDispatched) { -                return false; -            } -            return dispatch(root, event); +            return false;          }      }  } diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 465957d7cfd0..6ad1d72eaec4 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -429,7 +429,7 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind              return true;          } -        return (getViewRootImpl() != null) && getViewRootImpl().dispatchKeyFallbackEvent(event); +        return (getViewRootImpl() != null) && getViewRootImpl().dispatchUnhandledKeyEvent(event);      }      public boolean superDispatchKeyShortcutEvent(KeyEvent event) { diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 02bf4e343ea3..2207a2a6d4fe 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -2545,6 +2545,10 @@ final public class MediaCodec {              pattern = newPattern;          } +        private void setPattern(int blocksToEncrypt, int blocksToSkip) { +            pattern = new Pattern(blocksToEncrypt, blocksToSkip); +        } +          @Override          public String toString() {              StringBuilder builder = new StringBuilder(); diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp index a85552601b56..15957c6a9c5e 100644 --- a/media/jni/android_media_MediaExtractor.cpp +++ b/media/jni/android_media_MediaExtractor.cpp @@ -52,6 +52,7 @@ struct fields_t {      jfieldID context;      jmethodID cryptoInfoSetID; +    jmethodID cryptoInfoSetPatternID;  };  static fields_t gFields; @@ -654,6 +655,16 @@ static jboolean android_media_MediaExtractor_getSampleCryptoInfo(              ivObj,              mode); +    int32_t encryptedByteBlock = 0, skipByteBlock = 0; +    meta->findInt32(kKeyEncryptedByteBlock, &encryptedByteBlock); +    meta->findInt32(kKeySkipByteBlock, &skipByteBlock); + +    env->CallVoidMethod( +            cryptoInfoObj, +            gFields.cryptoInfoSetPatternID, +            encryptedByteBlock, +            skipByteBlock); +      return JNI_TRUE;  } @@ -669,6 +680,9 @@ static void android_media_MediaExtractor_native_init(JNIEnv *env) {      gFields.cryptoInfoSetID =          env->GetMethodID(clazz, "set", "(I[I[I[B[BI)V"); + +    gFields.cryptoInfoSetPatternID = +        env->GetMethodID(clazz, "setPattern", "(II)V");  }  static void android_media_MediaExtractor_native_setup( diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml index b8353eebd5a4..39c0b00f09ba 100644 --- a/packages/SettingsLib/res/values-as/arrays.xml +++ b/packages/SettingsLib/res/values-as/arrays.xml @@ -231,12 +231,12 @@      <item msgid="1064373276095698656">"পৰীক্ষণ কৰা চিত্ৰাংকণ কমাণ্ডবোৰ সেউজীয়া ৰঙত হাইলাইট কৰক"</item>    </string-array>    <string-array name="track_frame_time_entries"> -    <item msgid="2193584639058893150">"অফ"</item> +    <item msgid="2193584639058893150">"অফ হৈ আছে"</item>      <item msgid="2751513398307949636">"স্ক্ৰীণত দণ্ড হিচাপে"</item>      <item msgid="2355151170975410323">"<xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>ত"</item>    </string-array>    <string-array name="debug_hw_overdraw_entries"> -    <item msgid="8190572633763871652">"বন্ধ কৰক"</item> +    <item msgid="8190572633763871652">"অফ কৰক"</item>      <item msgid="7688197031296835369">"পিক্সেল একাধিকবাৰ ব্যৱহৃত অংশসমূহ দেখুৱাওক"</item>      <item msgid="2290859360633824369">"ডিউটাৰএন\'মেলীৰ অংশসমূহ দেখুৱাওক"</item>    </string-array> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 77932fd06440..da76337fe9a8 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -118,7 +118,7 @@      <string name="bluetooth_hearingaid_right_pairing_message" msgid="1550373802309160891">"সোঁফালৰ শ্ৰৱণ যন্ত্ৰটো যোৰ পতোৱা হৈছে…"</string>      <string name="bluetooth_hearingaid_left_battery_level" msgid="8797811465352097562">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> বেটাৰি বাকী আছে"</string>      <string name="bluetooth_hearingaid_right_battery_level" msgid="7309476148173459677">"সোঁ - বেটাৰি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string> -    <string name="accessibility_wifi_off" msgid="1166761729660614716">"ৱাই-ফাই অফহৈ আছে।"</string> +    <string name="accessibility_wifi_off" msgid="1166761729660614716">"ৱাই-ফাই অফ হৈ আছে।"</string>      <string name="accessibility_no_wifi" msgid="8834610636137374508">"ৱাইফাই সংযোগ বিচ্ছিন্ন হৈ আছে।"</string>      <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ৱাই-ফাই এদাল দণ্ড।"</string>      <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ৱাই-ফাইৰ দুডাল দণ্ড।"</string> @@ -133,7 +133,7 @@      <string name="tether_settings_title_wifi" msgid="3277144155960302049">"প\'ৰ্টেবল হ\'টস্প\'ট"</string>      <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ব্লুটুথ টেডাৰিং"</string>      <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"টেডাৰ কৰি থকা হৈছে"</string> -    <string name="tether_settings_title_all" msgid="8356136101061143841">"টেদৰিং আৰু প\'ৰ্টেবল হ\'টস্পট"</string> +    <string name="tether_settings_title_all" msgid="8356136101061143841">"টেডাৰিং আৰু প\'ৰ্টেবল হটস্পট"</string>      <string name="managed_user_title" msgid="8109605045406748842">"কৰ্মস্থানৰ সকলো এপ"</string>      <string name="user_guest" msgid="8475274842845401871">"অতিথি"</string>      <string name="unknown" msgid="1592123443519355854">"অজ্ঞাত"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 135280a781b1..7fc5e4c4bd86 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -197,7 +197,7 @@      <string name="keep_screen_on" msgid="1146389631208760344">"Aktiv lassen"</string>      <string name="keep_screen_on_summary" msgid="2173114350754293009">"Display wird beim Laden nie in den Ruhezustand versetzt"</string>      <string name="bt_hci_snoop_log" msgid="3340699311158865670">"Bluetooth HCI-Snoop-Protokoll aktivieren"</string> -    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Alle Bluetooth HCI-Pakete in einer Datei erfassen (Wenn diese Einstellung geändert wurde, muss Bluetooth umgeschaltet werden)"</string> +    <string name="bt_hci_snoop_log_summary" msgid="366083475849911315">"Alle Bluetooth HCI-Pakete in einer Datei erfassen. (Wenn diese Einstellung geändert wurde, muss Bluetooth aus- und wieder eingeschaltet werden.)"</string>      <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM-Entsperrung"</string>      <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"Bootloader-Entsperrung zulassen"</string>      <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM-Entsperrung zulassen?"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index d7ee655d9592..9430345824fa 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -85,14 +85,14 @@      <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मीडिया ऑडियो से कनेक्ट किया गया"</string>      <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फ़ोन ऑडियो से कनेक्ट किया गया"</string>      <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फ़ाइल स्थानांतरण सर्वर से कनेक्ट किया गया"</string> -    <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"मानचित्र से कनेक्ट किया गया"</string> +    <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"मैप से कनेक्ट किया गया"</string>      <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP से कनेक्ट किया गया"</string>      <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"फ़ाइल स्थानांतरण सर्वर से कनेक्ट नहीं किया गया"</string>      <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"इनपुट डिवाइस से कनेक्ट किया गया"</string>      <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"इंटरनेट के लिए डिवाइस से कनेक्ट है"</string>      <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"डिवाइस से इंटरनेट शेयर हो रहा है"</string>      <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"इंटरनेट से जुड़ने के लिए इस्तेमाल करें"</string> -    <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"मानचित्र के लिए उपयोग करें"</string> +    <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"मैप के लिए उपयोग करें"</string>      <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"सिम ऐक्सेस के लिए उपयोग करें"</string>      <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"मीडिया ऑडियो के लिए उपयोग करें"</string>      <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फ़ोन ऑडियो के लिए उपयोग करें"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 02e245f5ee43..514a55f18ba6 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -240,10 +240,10 @@      <string name="wifi_unmetered_label" msgid="6124098729457992931">"मीटरने न मोजलेले"</string>      <string name="select_logd_size_title" msgid="7433137108348553508">"लॉगर बफर आकार"</string>      <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"प्रति लॉग बफर लॉगर आकार निवडा"</string> -    <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"लॉगरवर सतत असणारा संचय साफ करायचा?"</string> +    <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"लॉगरवर सतत असणारा स्टोरेज साफ करायचा?"</string>      <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"सातत्याच्या लॉगरसह आम्ही परीक्षण करीत नसतो तेव्हा, आम्हाला आपल्या डिव्हाइसवर असणारा लॉगर डेटा मिटविणे आवश्यक असते."</string>      <string name="select_logpersist_title" msgid="7530031344550073166">"डिव्हाइसवर सातत्याने लॉगर डेटा स्टोअर करा"</string> -    <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"डिव्हाइसवर सातत्याने संचयित करण्यासाठी लॉग बफर निवडा"</string> +    <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"डिव्हाइसवर सातत्याने स्टोअर करण्यासाठी लॉग बफर निवडा"</string>      <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB कॉन्फिगरेशन निवडा"</string>      <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB कॉन्फिगरेशन निवडा"</string>      <string name="allow_mock_location" msgid="2787962564578664888">"बनावट स्थानांना अनुमती द्या"</string> @@ -426,7 +426,7 @@      <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"सिस्टम भाषा वापरा"</string>      <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> साठी सेटिंग्ज उघडण्यात अयशस्वी"</string>      <string name="ime_security_warning" msgid="4135828934735934248">"ही इनपुट पद्धत पासवर्ड आणि क्रेडिट कार्ड नंबर यासह, तुम्ही टाइप करता तो सर्व मजकूर संकलित करण्यात सक्षम होऊ शकते. ही <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> अॅपवरून येते. ही इनपुट पद्धत वापरायची?"</string> -    <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"टीप: रीबूट केल्यानंतर, तुम्ही आपला फोन अनलॉक करे पर्यंत हे अॅप सुरू होऊ शकत नाही"</string> +    <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"टीप: रीबूट केल्यानंतर, तुम्ही तुमचा फोन अनलॉक करे पर्यंत हे अॅप सुरू होऊ शकत नाही"</string>      <string name="ims_reg_title" msgid="7609782759207241443">"IMS नोंदणी स्थिती"</string>      <string name="ims_reg_status_registered" msgid="933003316932739188">"नोंदवलेले"</string>      <string name="ims_reg_status_not_registered" msgid="6529783773485229486">"नोंदवलेले नाही"</string> diff --git a/packages/SettingsLib/res/values-sw/arrays.xml b/packages/SettingsLib/res/values-sw/arrays.xml index d77c92dce75c..f13c2ea5b239 100644 --- a/packages/SettingsLib/res/values-sw/arrays.xml +++ b/packages/SettingsLib/res/values-sw/arrays.xml @@ -59,7 +59,7 @@      <item msgid="45075631231212732">"Kila wakati tumia ukakuaji wa HDCP"</item>    </string-array>    <string-array name="bluetooth_avrcp_versions"> -    <item msgid="5347678900838034763">"AVRCP 1.4 (Chaguo-msingi)"</item> +    <item msgid="5347678900838034763">"AVRCP 1.4 (Chaguo msingi)"</item>      <item msgid="2809759619990248160">"AVRCP 1.3"</item>      <item msgid="6199178154704729352">"AVRCP 1.5"</item>      <item msgid="5172170854953034852">"AVRCP 1.6"</item> @@ -71,7 +71,7 @@      <item msgid="3422726142222090896">"avrcp16"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_titles"> -    <item msgid="7065842274271279580">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="7065842274271279580">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="7539690996561263909">"SBC"</item>      <item msgid="686685526567131661">"AAC"</item>      <item msgid="5254942598247222737">"Sauti ya <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item> @@ -81,7 +81,7 @@      <item msgid="3304843301758635896">"Zima Kodeki Zisizo za Lazima"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_summaries"> -    <item msgid="5062108632402595000">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="5062108632402595000">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="6898329690939802290">"SBC"</item>      <item msgid="6839647709301342559">"AAC"</item>      <item msgid="7848030269621918608">"Sauti ya <xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g>"</item> @@ -91,38 +91,38 @@      <item msgid="741805482892725657">"Zima Kodeki Zisizo za Lazima"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> -    <item msgid="3093023430402746802">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="3093023430402746802">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="8895532488906185219">"kHz 44.1"</item>      <item msgid="2909915718994807056">"kHz 48.0"</item>      <item msgid="3347287377354164611">"kHz 88.2"</item>      <item msgid="1234212100239985373">"kHz 96.0"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_sample_rate_summaries"> -    <item msgid="3214516120190965356">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="3214516120190965356">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="4482862757811638365">"kHz 44.1"</item>      <item msgid="354495328188724404">"kHz 48.0"</item>      <item msgid="7329816882213695083">"kHz 88.2"</item>      <item msgid="6967397666254430476">"kHz 96.0"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles"> -    <item msgid="2684127272582591429">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="2684127272582591429">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="5618929009984956469">"Biti 16 kwa kila sampuli"</item>      <item msgid="3412640499234627248">"Biti 24 kwa kila sampuli"</item>      <item msgid="121583001492929387">"Biti 32 kwa kila sampuli"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries"> -    <item msgid="1081159789834584363">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="1081159789834584363">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="4726688794884191540">"Biti 16 kwa kila sampuli"</item>      <item msgid="305344756485516870">"Biti 24 kwa kila sampuli"</item>      <item msgid="244568657919675099">"Biti 32 kwa kila sampuli"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_channel_mode_titles"> -    <item msgid="5226878858503393706">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="5226878858503393706">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="4106832974775067314">"Mono"</item>      <item msgid="5571632958424639155">"Stereo"</item>    </string-array>    <string-array name="bluetooth_a2dp_codec_channel_mode_summaries"> -    <item msgid="4118561796005528173">"Tumia Uteuzi wa Mfumo (Chaguo-msingi)"</item> +    <item msgid="4118561796005528173">"Tumia Uteuzi wa Mfumo (Chaguo msingi)"</item>      <item msgid="8900559293912978337">"Mono"</item>      <item msgid="8883739882299884241">"Stereo"</item>    </string-array> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index 70dc27632f75..6d5916b36fc2 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -138,7 +138,7 @@      <string name="user_guest" msgid="8475274842845401871">"Aliyealikwa"</string>      <string name="unknown" msgid="1592123443519355854">"Haijulikani"</string>      <string name="running_process_item_user_label" msgid="3129887865552025943">"Mtumiaji: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> -    <string name="launch_defaults_some" msgid="313159469856372621">"Baadhi ya chaguo-msingi zimewekwa"</string> +    <string name="launch_defaults_some" msgid="313159469856372621">"Baadhi ya chaguo msingi zimewekwa"</string>      <string name="launch_defaults_none" msgid="4241129108140034876">"Hakuna chaguo-misingi zilizowekwa"</string>      <string name="tts_settings" msgid="8186971894801348327">"Mipangilio ya kusoma maandishi kwa sauti"</string>      <string name="tts_settings_title" msgid="1237820681016639683">"Kusoma maandishi kwa sauti"</string> @@ -157,7 +157,7 @@      <string name="tts_engine_security_warning" msgid="8786238102020223650">"Hotuba hii inawezesha injini huenda ikaweza kukusanya maandishi ambayo yatazungumziwa, ikijumlisha data ya kibinafsi ya nenosiri na namba ya kaddi ya mkopo. Inatoka kwa injini ya <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> Wezesha matumizi ya hotuba hii iliyowezeshwa ya injini?"</string>      <string name="tts_engine_network_required" msgid="1190837151485314743">"Lugha hii inahitaji muunganisho wa mtandao unaofanya kazi ili kipengele cha kusoma maandishi kwa sauti kifanye kazi."</string>      <string name="tts_default_sample_string" msgid="4040835213373086322">"Huu ni mfano wa usanisi usemaji"</string> -    <string name="tts_status_title" msgid="7268566550242584413">"Hali ya lugha chaguo-msingi"</string> +    <string name="tts_status_title" msgid="7268566550242584413">"Hali ya lugha chaguo msingi"</string>      <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> inaweza kutumiwa kikamilifu"</string>      <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> inahitaji muunganisho wa mtandao"</string>      <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> haiwezi kutumiwa"</string> @@ -167,7 +167,7 @@      <string name="tts_engine_preference_section_title" msgid="448294500990971413">"Injini inayofaa"</string>      <string name="tts_general_section_title" msgid="4402572014604490502">"Kwa ujumla"</string>      <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"Weka upya mipangilio ya ubora wa matamshi"</string> -    <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Rejesha mipangilio ya ubora wa matamshi kuwa ya chaguo-msingi."</string> +    <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"Rejesha mipangilio ya ubora wa matamshi kuwa ya chaguo msingi."</string>    <string-array name="tts_rate_entries">      <item msgid="6695494874362656215">"Polepole sana"</item>      <item msgid="4795095314303559268">"Polepole"</item> @@ -333,7 +333,7 @@      <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"Nenosiri jipya na uthibitisho havioani"</string>      <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"Imeshindwa kuweka nenosiri la hifadhi rudufu"</string>    <string-array name="color_mode_names"> -    <item msgid="2425514299220523812">"Maridadi (chaguo-msingi)"</item> +    <item msgid="2425514299220523812">"Maridadi (chaguo msingi)"</item>      <item msgid="8446070607501413455">"Asili"</item>      <item msgid="6553408765810699025">"Muundo-msingi"</item>    </string-array> @@ -412,7 +412,7 @@      <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> zilizopita"</string>      <string name="remaining_length_format" msgid="7886337596669190587">"Zimesalia <xliff:g id="ID_1">%1$s</xliff:g>"</string>      <string name="screen_zoom_summary_small" msgid="5867245310241621570">"Ndogo"</string> -    <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Chaguo-msingi"</string> +    <string name="screen_zoom_summary_default" msgid="2247006805614056507">"Chaguo msingi"</string>      <string name="screen_zoom_summary_large" msgid="4835294730065424084">"Kubwa"</string>      <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"Kubwa kiasi"</string>      <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"Kubwa zaidi"</string> diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java index 42bd66ae4a90..9fc71c813d74 100644 --- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java @@ -166,9 +166,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis              long token = Binder.clearCallingIdentity();              try {                  mHandler.post(() -> { -                    for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { -                        mConnectionCallbacks.get(i).onBackButtonAlphaChanged(alpha, animate); -                    } +                    notifyBackButtonAlphaChanged(alpha, animate);                  });              } finally {                  Binder.restoreCallingIdentity(token); @@ -355,10 +353,17 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis              mOverviewProxy.asBinder().unlinkToDeath(mOverviewServiceDeathRcpt, 0);              mContext.unbindService(mOverviewServiceConnection);              mOverviewProxy = null; +            notifyBackButtonAlphaChanged(1f, false /* animate */);              notifyConnectionChanged();          }      } +    private void notifyBackButtonAlphaChanged(float alpha, boolean animate) { +        for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) { +            mConnectionCallbacks.get(i).onBackButtonAlphaChanged(alpha, animate); +        } +    } +      private void notifyConnectionChanged() {          for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {              mConnectionCallbacks.get(i).onConnectionChanged(mOverviewProxy != null); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index f30fa6bd4b93..d647e21888dd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -710,6 +710,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView          updateClickAndFocus();          if (mNotificationParent != null) {              setOverrideTintColor(NO_COLOR, 0.0f); +            // Let's reset the distance to top roundness, as this isn't applied to group children +            setDistanceToTopRoundness(NO_ROUNDNESS);              mNotificationParent.updateBackgroundForGroupState();          }          updateIconVisibilities(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java index 29c3ebdae326..ae8d84450404 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java @@ -36,6 +36,7 @@ import java.util.ArrayList;   */  public abstract class ExpandableView extends FrameLayout { +    public static final float NO_ROUNDNESS = -1;      protected OnHeightChangedListener mOnHeightChangedListener;      private int mActualHeight;      protected int mClipTopAmount; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java index 9f82bcf5bfe8..39485c3c8800 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/HeadsUpStatusBarView.java @@ -22,6 +22,7 @@ import android.content.res.Resources;  import android.graphics.Point;  import android.graphics.Rect;  import android.util.AttributeSet; +import android.view.Display;  import android.view.DisplayCutout;  import android.view.View;  import android.widget.TextView; @@ -31,6 +32,8 @@ import com.android.keyguard.AlphaOptimizedLinearLayout;  import com.android.systemui.R;  import com.android.systemui.statusbar.policy.DarkIconDispatcher; +import java.util.List; +  /**   * The view in the statusBar that contains part of the heads-up information   */ @@ -48,8 +51,9 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {      private View mRootView;      private int mSysWinInset;      private int mCutOutInset; +    private List<Rect> mCutOutBounds;      private Rect mIconDrawingRect = new Rect(); -    private Point mPoint; +    private Point mDisplaySize;      private Runnable mOnDrawingRectChangedListener;      public HeadsUpStatusBarView(Context context) { @@ -141,16 +145,19 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {          mLayoutedIconRect.set(left, top, right, bottom);          updateDrawingRect();          int targetPadding = mAbsoluteStartPadding + mSysWinInset + mCutOutInset; -        if (left != targetPadding) { -            int start; -            if (isLayoutRtl()) { -                if (mPoint == null) { -                    mPoint = new Point(); +        boolean isRtl = isLayoutRtl(); +        int start = isRtl ? (mDisplaySize.x - right) : left; + +        if (start != targetPadding) { +            if (mCutOutBounds != null) { +                for (Rect cutOutRect : mCutOutBounds) { +                    int cutOutStart = (isRtl) +                            ? (mDisplaySize.x - cutOutRect.right) : cutOutRect.left; +                    if (start > cutOutStart) { +                        start -= cutOutRect.width(); +                        break; +                    }                  } -                getDisplay().getRealSize(mPoint); -                start = (mPoint.x - right); -            } else { -                start = left;              }              int newPadding = targetPadding - start + getPaddingStart(); @@ -165,6 +172,11 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {          }      } +    /** In order to do UI alignment, this view will be notified by +     * {@link com.android.systemui.statusbar.stack.NotificationStackScrollLayout}. +     * After scroller laid out, the scroller will tell this view about scroller's getX() +     * @param translationX how to translate the horizontal position +     */      public void setPanelTranslation(float translationX) {          if (isLayoutRtl()) {              setTranslationX(translationX + mCutOutInset); @@ -191,6 +203,15 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {          mCutOutInset = (displayCutout != null)                  ? (isRtl ? displayCutout.getSafeInsetRight() : displayCutout.getSafeInsetLeft())                  : 0; + +        getDisplaySize(); + +        mCutOutBounds = null; +        if (displayCutout != null && displayCutout.getSafeInsetRight() == 0 +                && displayCutout.getSafeInsetLeft() == 0) { +            mCutOutBounds = displayCutout.getBoundingRects(); +        } +          // For Double Cut Out mode, the System window navigation bar is at the right          // side of the left cut out. In this condition, mSysWinInset include the left cut          // out width so we set mCutOutInset to be 0. For RTL, the condition is the same. @@ -222,4 +243,17 @@ public class HeadsUpStatusBarView extends AlphaOptimizedLinearLayout {      public void setOnDrawingRectChangedListener(Runnable onDrawingRectChangedListener) {          mOnDrawingRectChangedListener = onDrawingRectChangedListener;      } + +    private void getDisplaySize() { +        if (mDisplaySize == null) { +            mDisplaySize = new Point(); +        } +        getDisplay().getRealSize(mDisplaySize); +    } + +    @Override +    protected void onAttachedToWindow() { +        super.onAttachedToWindow(); +        getDisplaySize(); +    }  } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index b52e3246f5db..409a78391975 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -148,7 +148,6 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener,       * @return the translation X value for RTL. In theory, it should be negative. i.e. -Y       */      private int getRtlTranslation() { -        // TODO: Corner Cut Out still need to handle.          if (mPoint == null) {              mPoint = new Point();          } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 804fd4161500..9c26c69045d5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -776,7 +776,8 @@ public class NotificationStackScrollLayout extends ViewGroup              boolean clip = clipStart > start && clipStart < end                      || clipEnd >= start && clipEnd <= end;              clip &= !(first && mOwnScrollY == 0); -            child.setDistanceToTopRoundness(clip ? Math.max(start - clipStart, 0) : -1); +            child.setDistanceToTopRoundness(clip ? Math.max(start - clipStart, 0) +                    : ExpandableView.NO_ROUNDNESS);              first = false;          }      } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index c3f504f6c6ed..2d2c4cd6875e 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4868,7 +4868,12 @@ public class ConnectivityService extends IConnectivityManager.Stub       */      private NetworkCapabilities mixInCapabilities(NetworkAgentInfo nai, NetworkCapabilities nc) {          // Once a NetworkAgent is connected, complain if some immutable capabilities are removed. +         // Don't complain for VPNs since they're not driven by requests and there is no risk of +         // causing a connect/teardown loop. +         // TODO: remove this altogether and make it the responsibility of the NetworkFactories to +         // avoid connect/teardown loops.          if (nai.everConnected && +                !nai.isVPN() &&                  !nai.networkCapabilities.satisfiedByImmutableNetworkCapabilities(nc)) {              // TODO: consider not complaining when a network agent degrades its capabilities if this              // does not cause any request (that is not a listen) currently matching that agent to diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 92310b92d932..3fd69ee5645c 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -215,6 +215,10 @@ public class AudioService extends IAudioService.Stub          return mPlatformType == AudioSystem.PLATFORM_TELEVISION;      } +    private boolean isPlatformAutomotive() { +        return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); +    } +      /** The controller for the volume UI. */      private final VolumeController mVolumeController = new VolumeController(); @@ -2367,8 +2371,11 @@ public class AudioService extends IAudioService.Stub          if (DEBUG_VOL) {              Log.d(TAG, String.format("Master mute %s, %d, user=%d", mute, flags, userId));          } -        if (mUseFixedVolume) { -            return; // If using fixed volume, we don't mute. +        if (!isPlatformAutomotive() && mUseFixedVolume) { +            // If using fixed volume, we don't mute. +            // TODO: remove the isPlatformAutomotive check here. +            // The isPlatformAutomotive check is added for safety but may not be necessary. +            return;          }          if (getCurrentUserId() == userId) {              if (mute != AudioSystem.getMasterMute()) {  |