diff options
183 files changed, 1890 insertions, 927 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 57ad989d01c8..131bfd337b18 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4178,15 +4178,20 @@ public final class ActivityThread extends ClientTransactionHandler view.requestLayout(); view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() { + private boolean mHandled = false; @Override public void onDraw() { + if (mHandled) { + return; + } + mHandled = true; // Transfer the splash screen view from shell to client. // Call syncTransferSplashscreenViewTransaction at the first onDraw so we can ensure // the client view is ready to show and we can use applyTransactionOnDraw to make // all transitions happen at the same frame. syncTransferSplashscreenViewTransaction( view, r.token, decorView, startingWindowLeash); - view.postOnAnimation(() -> view.getViewTreeObserver().removeOnDrawListener(this)); + view.post(() -> view.getViewTreeObserver().removeOnDrawListener(this)); } }); } diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index e0324c0ded26..9f798869e54a 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -524,6 +524,7 @@ public class InputMethodService extends AbstractInputMethodService { private Handler mHandler; private boolean mImeSurfaceScheduledForRemoval; private ImsConfigurationTracker mConfigTracker = new ImsConfigurationTracker(); + private boolean mDestroyed; /** * An opaque {@link Binder} token of window requesting {@link InputMethodImpl#showSoftInput} @@ -604,6 +605,11 @@ public class InputMethodService extends AbstractInputMethodService { Log.w(TAG, "The token has already registered, ignore this initialization."); return; } + if (mDestroyed) { + Log.i(TAG, "The InputMethodService has already onDestroyed()." + + "Ignore the initialization."); + return; + } Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.initializeInternal"); mConfigTracker.onInitialize(configChanges); mPrivOps.set(privilegedOperations); @@ -1403,6 +1409,7 @@ public class InputMethodService extends AbstractInputMethodService { } @Override public void onDestroy() { + mDestroyed = true; super.onDestroy(); mRootView.getViewTreeObserver().removeOnComputeInternalInsetsListener( mInsetsComputer); diff --git a/core/java/android/view/BatchedInputEventReceiver.java b/core/java/android/view/BatchedInputEventReceiver.java index 7023e4bd0134..1ed12f74ba2c 100644 --- a/core/java/android/view/BatchedInputEventReceiver.java +++ b/core/java/android/view/BatchedInputEventReceiver.java @@ -17,6 +17,7 @@ package android.view; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Handler; import android.os.Looper; /** @@ -27,6 +28,13 @@ public class BatchedInputEventReceiver extends InputEventReceiver { private Choreographer mChoreographer; private boolean mBatchingEnabled; private boolean mBatchedInputScheduled; + private final Handler mHandler; + private final Runnable mConsumeBatchedInputEvents = new Runnable() { + @Override + public void run() { + consumeBatchedInputEvents(-1); + } + }; @UnsupportedAppUsage public BatchedInputEventReceiver( @@ -34,6 +42,7 @@ public class BatchedInputEventReceiver extends InputEventReceiver { super(inputChannel, looper); mChoreographer = choreographer; mBatchingEnabled = true; + mHandler = new Handler(looper); } @Override @@ -57,10 +66,15 @@ public class BatchedInputEventReceiver extends InputEventReceiver { * @hide */ public void setBatchingEnabled(boolean batchingEnabled) { + if (mBatchingEnabled == batchingEnabled) { + return; + } + mBatchingEnabled = batchingEnabled; + mHandler.removeCallbacks(mConsumeBatchedInputEvents); if (!batchingEnabled) { unscheduleBatchedInput(); - consumeBatchedInputEvents(-1); + mHandler.post(mConsumeBatchedInputEvents); } } diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 4c7bfd252657..0e49cc967656 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -138,20 +138,9 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private boolean mDisableBackgroundLayer = false; /** - * We use this lock in SOME cases when reading or writing SurfaceControl, - * but use the following model so that the RenderThread can run locklessly - * in the position up-date case. - * - * 1. UI Thread can read from mSurfaceControl (use in Transactions) without - * holding the lock. - * 2. UI Thread will hold the lock when writing to mSurfaceControl (calling release - * or remove). - * 3. Render thread will also hold the lock when writing to mSurfaceControl (e.g. - * calling release from positionLost). - * 3. RenderNode.PositionUpdateListener::positionChanged will only be called - * when the UI thread is paused (blocked on the Render thread). - * 4. positionChanged thus will not be required to hold the lock as the - * UI thread is blocked, and the other writer is the RT itself. + * We use this lock to protect access to mSurfaceControl and + * SurfaceViewPositionUpdateListener#mPositionChangedTransaction. Both are accessed on the UI + * thread and the render thread. */ final Object mSurfaceControlLock = new Object(); final Rect mTmpRect = new Rect(); @@ -945,7 +934,9 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall Transaction geometryTransaction) { if (mPositionListener != null) { mRenderNode.removePositionUpdateListener(mPositionListener); - geometryTransaction = mPositionListener.getTransaction().merge(geometryTransaction); + synchronized (mSurfaceControlLock) { + geometryTransaction = mPositionListener.getTransaction().merge(geometryTransaction); + } } mPositionListener = new SurfaceViewPositionUpdateListener(surfaceWidth, surfaceHeight, geometryTransaction); @@ -975,9 +966,9 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall mParentSurfaceSequenceId = viewRoot.getSurfaceSequenceId(); if (mViewVisibility) { - mTmpTransaction.show(mSurfaceControl); + geometryTransaction.show(mSurfaceControl); } else { - mTmpTransaction.hide(mSurfaceControl); + geometryTransaction.hide(mSurfaceControl); } if (mSurfacePackage != null) { @@ -1467,43 +1458,45 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall if (mSurfaceControl == null) { return; } - } - if (mRTLastReportedPosition.left == left - && mRTLastReportedPosition.top == top - && mRTLastReportedPosition.right == right - && mRTLastReportedPosition.bottom == bottom - && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth - && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight - && !mPendingTransaction) { - return; - } - try { - if (DEBUG_POSITION) { - Log.d(TAG, String.format( - "%d updateSurfacePosition RenderWorker, frameNr = %d, " - + "position = [%d, %d, %d, %d] surfaceSize = %dx%d", - System.identityHashCode(SurfaceView.this), frameNumber, - left, top, right, bottom, mRtSurfaceWidth, mRtSurfaceHeight)); - } - mRTLastReportedPosition.set(left, top, right, bottom); - mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight); - onSetSurfacePositionAndScaleRT(mPositionChangedTransaction, mSurfaceControl, - mRTLastReportedPosition.left /*positionLeft*/, - mRTLastReportedPosition.top /*positionTop*/, - mRTLastReportedPosition.width() / (float) mRtSurfaceWidth /*postScaleX*/, - mRTLastReportedPosition.height() / (float) mRtSurfaceHeight /*postScaleY*/); - if (mViewVisibility) { - mPositionChangedTransaction.show(mSurfaceControl); + if (mRTLastReportedPosition.left == left + && mRTLastReportedPosition.top == top + && mRTLastReportedPosition.right == right + && mRTLastReportedPosition.bottom == bottom + && mRTLastReportedSurfaceSize.x == mRtSurfaceWidth + && mRTLastReportedSurfaceSize.y == mRtSurfaceHeight + && !mPendingTransaction) { + return; } - final ViewRootImpl viewRoot = getViewRootImpl(); - if (viewRoot != null) { - applyChildSurfaceTransaction_renderWorker(mPositionChangedTransaction, - viewRoot.mSurface, frameNumber); + try { + if (DEBUG_POSITION) { + Log.d(TAG, String.format( + "%d updateSurfacePosition RenderWorker, frameNr = %d, " + + "position = [%d, %d, %d, %d] surfaceSize = %dx%d", + System.identityHashCode(SurfaceView.this), frameNumber, + left, top, right, bottom, mRtSurfaceWidth, mRtSurfaceHeight)); + } + mRTLastReportedPosition.set(left, top, right, bottom); + mRTLastReportedSurfaceSize.set(mRtSurfaceWidth, mRtSurfaceHeight); + onSetSurfacePositionAndScaleRT(mPositionChangedTransaction, mSurfaceControl, + mRTLastReportedPosition.left /*positionLeft*/, + mRTLastReportedPosition.top /*positionTop*/, + mRTLastReportedPosition.width() + / (float) mRtSurfaceWidth /*postScaleX*/, + mRTLastReportedPosition.height() + / (float) mRtSurfaceHeight /*postScaleY*/); + if (mViewVisibility) { + mPositionChangedTransaction.show(mSurfaceControl); + } + final ViewRootImpl viewRoot = getViewRootImpl(); + if (viewRoot != null) { + applyChildSurfaceTransaction_renderWorker(mPositionChangedTransaction, + viewRoot.mSurface, frameNumber); + } + applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); + mPendingTransaction = false; + } catch (Exception ex) { + Log.e(TAG, "Exception from repositionChild", ex); } - applyOrMergeTransaction(mPositionChangedTransaction, frameNumber); - mPendingTransaction = false; - } catch (Exception ex) { - Log.e(TAG, "Exception from repositionChild", ex); } } @@ -1526,18 +1519,18 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } mRTLastReportedPosition.setEmpty(); mRTLastReportedSurfaceSize.set(-1, -1); - if (mPendingTransaction) { - Log.w(TAG, System.identityHashCode(SurfaceView.this) - + "Pending transaction cleared."); - mPositionChangedTransaction.clear(); - mPendingTransaction = false; - } /** * positionLost can be called while UI thread is un-paused so we * need to hold the lock here. */ synchronized (mSurfaceControlLock) { + if (mPendingTransaction) { + Log.w(TAG, System.identityHashCode(SurfaceView.this) + + "Pending transaction cleared."); + mPositionChangedTransaction.clear(); + mPendingTransaction = false; + } if (mSurfaceControl == null) { return; } diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index dfd853acaf0d..1784dcfc505f 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -301,6 +301,13 @@ public class RemoteViews implements Parcelable, Filter { public static final int FLAG_USE_LIGHT_BACKGROUND_LAYOUT = 4; /** + * A ReadWriteHelper which has the same behavior as ReadWriteHelper.DEFAULT, but which is + * intentionally a different instance in order to trick Bundle reader so that it doesn't allow + * lazy initialization. + */ + private static final Parcel.ReadWriteHelper ALTERNATIVE_DEFAULT = new Parcel.ReadWriteHelper(); + + /** * Used to restrict the views which can be inflated * * @see android.view.LayoutInflater.Filter#onLoadClass(java.lang.Class) @@ -1856,7 +1863,18 @@ public class RemoteViews implements Parcelable, Filter { this.value = in.readTypedObject(Bitmap.CREATOR); break; case BUNDLE: - this.value = in.readBundle(); + // Because we use Parcel.allowSquashing() when writing, and that affects + // how the contents of Bundles are written, we need to ensure the bundle is + // unparceled immediately, not lazily. Setting a custom ReadWriteHelper + // just happens to have that effect on Bundle.readFromParcel(). + // TODO(b/212731590): build this state tracking into Bundle + if (in.hasReadWriteHelper()) { + this.value = in.readBundle(); + } else { + in.setReadWriteHelper(ALTERNATIVE_DEFAULT); + this.value = in.readBundle(); + in.setReadWriteHelper(null); + } break; case INTENT: this.value = in.readTypedObject(Intent.CREATOR); diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index b427e8be142d..ad4f280b1e8d 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -205,8 +205,10 @@ oneway interface IStatusBar * * @param displayId the ID of the display to notify. * @param types the internal insets types of the bars are about to show transiently. + * @param isGestureOnSystemBar whether the gesture to show the transient bar was a gesture on + * one of the bars itself. */ - void showTransient(int displayId, in int[] types); + void showTransient(int displayId, in int[] types, boolean isGestureOnSystemBar); /** * Notifies System UI to abort the transient state of system bars, which prevents the bars being diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index acf7d398d2fe..bc324f437452 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -319,7 +319,7 @@ <string name="permgrouplab_location" msgid="1858277002233964394">"الموقع الجغرافي"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"الوصول إلى موقع هذا الجهاز"</string> <string name="permgrouplab_calendar" msgid="6426860926123033230">"التقويم"</string> - <string name="permgroupdesc_calendar" msgid="6762751063361489379">"الوصول تقويمك"</string> + <string name="permgroupdesc_calendar" msgid="6762751063361489379">"الوصول إلى تقويمك"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"إرسال رسائل قصيرة SMS وعرضها"</string> <string name="permgrouplab_storage" msgid="1938416135375282333">"الملفات والوسائط"</string> @@ -338,17 +338,17 @@ <string name="permgroupdesc_phone" msgid="270048070781478204">"إجراء مكالمات هاتفية وإدارتها"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"أجهزة استشعار الجسم"</string> <string name="permgroupdesc_sensors" msgid="2610631290633747752">"الوصول إلى بيانات المستشعر حول علاماتك الحيوية"</string> - <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"استرداد محتوى النافذة"</string> - <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"فحص محتوى نافذة يتم التفاعل معها"</string> - <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"تفعيل الاستكشاف باللمس"</string> + <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"استرداد محتوى النافذة:"</string> + <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"فحص محتوى نافذة يتم التفاعل معها."</string> + <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"تفعيل الاستكشاف باللمس:"</string> <string name="capability_desc_canRequestTouchExploration" msgid="4394677060796752976">"سيتم قول العناصر التي تم النقر عليها بصوت عالٍ ويمكن استكشاف الشاشة باستخدام الإيماءات."</string> - <string name="capability_title_canRequestFilterKeyEvents" msgid="2772371671541753254">"ملاحظة النص الذي تكتبه"</string> + <string name="capability_title_canRequestFilterKeyEvents" msgid="2772371671541753254">"ملاحظة النص الذي تكتبه:"</string> <string name="capability_desc_canRequestFilterKeyEvents" msgid="2381315802405773092">"يتضمن بيانات شخصية مثل أرقام بطاقات الائتمان وكلمات المرور."</string> - <string name="capability_title_canControlMagnification" msgid="7701572187333415795">"التحكم في تكبير الشاشة"</string> + <string name="capability_title_canControlMagnification" msgid="7701572187333415795">"التحكم في تكبير الشاشة:"</string> <string name="capability_desc_canControlMagnification" msgid="2206586716709254805">"يمكنك التحكّم في مستوى تكبير/تصغير الشاشة وتحديد الموضع."</string> <string name="capability_title_canPerformGestures" msgid="9106545062106728987">"تنفيذ إيماءات"</string> <string name="capability_desc_canPerformGestures" msgid="6619457251067929726">"يمكن النقر والتمرير بسرعة والتصغير أو التكبير بإصبعين وتنفيذ إيماءات أخرى."</string> - <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"إيماءات بصمات الإصبع"</string> + <string name="capability_title_canCaptureFingerprintGestures" msgid="1189053104594608091">"إيماءات بصمات الإصبع:"</string> <string name="capability_desc_canCaptureFingerprintGestures" msgid="6861869337457461274">"يمكن أن تلتقط الإيماءات التي تم تنفيذها على جهاز استشعار بصمة الإصبع في الجهاز."</string> <string name="capability_title_canTakeScreenshot" msgid="3895812893130071930">"أخذ لقطة شاشة"</string> <string name="capability_desc_canTakeScreenshot" msgid="7762297374317934052">"يمكن أخذ لقطة شاشة."</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index d6b0e5a033cc..0882875b96a6 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -609,7 +609,7 @@ <string name="fingerprint_or_screen_lock_dialog_default_subtitle" msgid="5195808203117992200">"Aurrera egiteko, erabili hatz-marka edo pantailaren blokeoa"</string> <string-array name="fingerprint_error_vendor"> </string-array> - <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Arazoren bat izan da. Saiatu berriro."</string> + <string name="fingerprint_error_vendor_unknown" msgid="4170002184907291065">"Arazo bat izan da. Saiatu berriro."</string> <string name="fingerprint_icon_content_description" msgid="4741068463175388817">"Hatz-markaren ikonoa"</string> <string name="face_recalibrate_notification_name" msgid="7311163114750748686">"Aurpegi bidez desblokeatzeko eginbidea"</string> <string name="face_recalibrate_notification_title" msgid="2524791952735579082">"Arazoak ditugu aurpegi bidez desblokeatzeko eginbidearekin"</string> @@ -663,7 +663,7 @@ <string name="face_or_screen_lock_dialog_default_subtitle" msgid="5006381531158341844">"Aurrera egiteko, erabili aurpegia edo pantailaren blokeoa"</string> <string-array name="face_error_vendor"> </string-array> - <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Arazoren bat izan da. Saiatu berriro."</string> + <string name="face_error_vendor_unknown" msgid="7387005932083302070">"Arazo bat izan da. Saiatu berriro."</string> <string name="face_icon_content_description" msgid="465030547475916280">"Aurpegiaren ikonoa"</string> <string name="permlab_readSyncSettings" msgid="6250532864893156277">"irakurri sinkronizazio-ezarpenak"</string> <string name="permdesc_readSyncSettings" msgid="1325658466358779298">"Kontu baten sinkronizazio-ezarpenak irakurtzeko baimena ematen die aplikazioei. Adibidez, Jendea aplikazioa konturen batekin sinkronizatuta dagoen zehatz dezake."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index f780957c8f90..9bedb9fda90e 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -303,21 +303,21 @@ <string name="user_owner_label" msgid="8628726904184471211">"प्रोफ़ाइल बदलकर निजी प्रोफ़ाइल पर जाएं"</string> <string name="managed_profile_label" msgid="7316778766973512382">"प्रोफ़ाइल बदलकर वर्क प्रोफ़ाइल पर जाएं"</string> <string name="permgrouplab_contacts" msgid="4254143639307316920">"संपर्क"</string> - <string name="permgroupdesc_contacts" msgid="9163927941244182567">"अपने संपर्कों को ऐक्सेस करने की"</string> + <string name="permgroupdesc_contacts" msgid="9163927941244182567">"अपने संपर्कों को ऐक्सेस करें"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"जगह की जानकारी"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"इस डिवाइस की जगह तक पहुंचने दें"</string> <string name="permgrouplab_calendar" msgid="6426860926123033230">"कैलेंडर"</string> - <string name="permgroupdesc_calendar" msgid="6762751063361489379">"अपने कैलेंडर को ऐक्सेस करने"</string> + <string name="permgroupdesc_calendar" msgid="6762751063361489379">"अपने कैलेंडर को ऐक्सेस करें"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"मैसेज (एसएमएस)"</string> <string name="permgroupdesc_sms" msgid="5726462398070064542">"मैसेज (एसएमएस) भेजें और देखें"</string> <string name="permgrouplab_storage" msgid="1938416135375282333">"फ़ाइलें और मीडिया"</string> - <string name="permgroupdesc_storage" msgid="6351503740613026600">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया और फ़ाइलें ऐक्सेस करने की"</string> + <string name="permgroupdesc_storage" msgid="6351503740613026600">"अपने डिवाइस पर मौजूद फ़ोटो, मीडिया, और फ़ाइलें ऐक्सेस करें"</string> <string name="permgrouplab_microphone" msgid="2480597427667420076">"माइक्रोफ़ोन"</string> <string name="permgroupdesc_microphone" msgid="1047786732792487722">"ऑडियो रिकॉर्ड करें"</string> <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"शारीरिक गतिविधि"</string> <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"शारीरिक गतिविधि की जानकारी पा सकता है"</string> <string name="permgrouplab_camera" msgid="9090413408963547706">"कैमरा"</string> - <string name="permgroupdesc_camera" msgid="7585150538459320326">"चित्र लेने और वीडियो रिकॉर्ड करने"</string> + <string name="permgroupdesc_camera" msgid="7585150538459320326">"फ़ोटो खीचें और वीडियो रिकॉर्ड करें"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"आस-पास मौजूद डिवाइस"</string> <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"आस-पास मौजूद डिवाइस खोजें और उनसे कनेक्ट करें"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"कॉल लॉग"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index b4cd162a70a0..4638307bab6f 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -226,9 +226,9 @@ <string name="reboot_to_update_title" msgid="2125818841916373708">"Pemutakhiran sistem Android"</string> <string name="reboot_to_update_prepare" msgid="6978842143587422365">"Bersiap untuk memperbarui..."</string> <string name="reboot_to_update_package" msgid="4644104795527534811">"Memproses pembaruan paket…"</string> - <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Memulai kembali…"</string> + <string name="reboot_to_update_reboot" msgid="4474726009984452312">"Memulai ulang…"</string> <string name="reboot_to_reset_title" msgid="2226229680017882787">"Kembalikan ke setelan pabrik"</string> - <string name="reboot_to_reset_message" msgid="3347690497972074356">"Memulai kembali…"</string> + <string name="reboot_to_reset_message" msgid="3347690497972074356">"Memulai ulang…"</string> <string name="shutdown_progress" msgid="5017145516412657345">"Sedang mematikan..."</string> <string name="shutdown_confirm" product="tablet" msgid="2872769463279602432">"Tablet Anda akan dimatikan."</string> <string name="shutdown_confirm" product="tv" msgid="7975942887313518330">"Perangkat Android TV akan dimatikan."</string> @@ -1351,7 +1351,7 @@ <string name="sim_done_button" msgid="6464250841528410598">"Selesai"</string> <string name="sim_added_title" msgid="7930779986759414595">"Kartu SIM ditambahkan"</string> <string name="sim_added_message" msgid="6602906609509958680">"Mulai ulang perangkat Anda untuk mengakses jaringan selular."</string> - <string name="sim_restart_button" msgid="8481803851341190038">"Nyalakan Ulang"</string> + <string name="sim_restart_button" msgid="8481803851341190038">"Mulai Ulang"</string> <string name="install_carrier_app_notification_title" msgid="5712723402213090102">"Aktifkan layanan seluler"</string> <string name="install_carrier_app_notification_text" msgid="2781317581274192728">"Download aplikasi operator untuk mengaktifkan SIM baru"</string> <string name="install_carrier_app_notification_text_app_name" msgid="4086877327264106484">"Download aplikasi <xliff:g id="APP_NAME">%1$s</xliff:g> untuk mengaktifkan SIM baru"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index d60fdae84a15..e8390da8ba8f 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -303,29 +303,29 @@ <string name="user_owner_label" msgid="8628726904184471211">"Passa al profilo personale"</string> <string name="managed_profile_label" msgid="7316778766973512382">"Passa a profilo di lavoro"</string> <string name="permgrouplab_contacts" msgid="4254143639307316920">"Contatti"</string> - <string name="permgroupdesc_contacts" msgid="9163927941244182567">"accedere ai contatti"</string> + <string name="permgroupdesc_contacts" msgid="9163927941244182567">"Possono accedere ai contatti"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"Posizione"</string> - <string name="permgroupdesc_location" msgid="1995955142118450685">"accedere alla posizione di questo dispositivo"</string> + <string name="permgroupdesc_location" msgid="1995955142118450685">"Possono accedere alla posizione di questo dispositivo"</string> <string name="permgrouplab_calendar" msgid="6426860926123033230">"Calendario"</string> - <string name="permgroupdesc_calendar" msgid="6762751063361489379">"accedere al calendario"</string> + <string name="permgroupdesc_calendar" msgid="6762751063361489379">"Possono accedere al calendario"</string> <string name="permgrouplab_sms" msgid="795737735126084874">"SMS"</string> - <string name="permgroupdesc_sms" msgid="5726462398070064542">"inviare e visualizzare SMS"</string> - <string name="permgrouplab_storage" msgid="1938416135375282333">"File e contenuti multimediali"</string> - <string name="permgroupdesc_storage" msgid="6351503740613026600">"accedere a foto, contenuti multimediali e file sul dispositivo"</string> + <string name="permgroupdesc_sms" msgid="5726462398070064542">"Possono inviare e visualizzare SMS"</string> + <string name="permgrouplab_storage" msgid="1938416135375282333">"File/contenuti multimediali"</string> + <string name="permgroupdesc_storage" msgid="6351503740613026600">"Possono accedere a foto, contenuti multimediali e file sul dispositivo"</string> <string name="permgrouplab_microphone" msgid="2480597427667420076">"Microfono"</string> - <string name="permgroupdesc_microphone" msgid="1047786732792487722">"registrare audio"</string> + <string name="permgroupdesc_microphone" msgid="1047786732792487722">"Possono registrare audio"</string> <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"Attività fisica"</string> - <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"Consente di accedere all\'attività fisica"</string> + <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"Possono accedere all\'attività fisica"</string> <string name="permgrouplab_camera" msgid="9090413408963547706">"Fotocamera"</string> - <string name="permgroupdesc_camera" msgid="7585150538459320326">"scattare foto e registrare video"</string> + <string name="permgroupdesc_camera" msgid="7585150538459320326">"Possono scattare foto e registrare video"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"Dispositivi nelle vicinanze"</string> <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"Consente di rilevare dispositivi nelle vicinanze e di connettersi a tali dispositivi"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"Registri chiamate"</string> - <string name="permgroupdesc_calllog" msgid="2026996642917801803">"leggere e modificare il registro chiamate del telefono"</string> + <string name="permgroupdesc_calllog" msgid="2026996642917801803">"Possono leggere e modificare il registro chiamate del telefono"</string> <string name="permgrouplab_phone" msgid="570318944091926620">"Telefono"</string> - <string name="permgroupdesc_phone" msgid="270048070781478204">"eseguire e gestire le telefonate"</string> + <string name="permgroupdesc_phone" msgid="270048070781478204">"Possono eseguire e gestire le telefonate"</string> <string name="permgrouplab_sensors" msgid="9134046949784064495">"Sensori del corpo"</string> - <string name="permgroupdesc_sensors" msgid="2610631290633747752">"accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string> + <string name="permgroupdesc_sensors" msgid="2610631290633747752">"Possono accedere ai dati dei sensori relativi ai tuoi parametri vitali"</string> <string name="capability_title_canRetrieveWindowContent" msgid="7554282892101587296">"Recuperare contenuti della finestra"</string> <string name="capability_desc_canRetrieveWindowContent" msgid="6195610527625237661">"Esamina i contenuti di una finestra con cui interagisci."</string> <string name="capability_title_canRequestTouchExploration" msgid="327598364696316213">"Attivare Esplora al tocco"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 87415b0882d4..fcb0941da8d5 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1333,7 +1333,7 @@ <string name="volume_music_hint_silent_ringtone_selected" msgid="1514829655029062233">"הוגדר רינגטון שקט"</string> <string name="volume_call" msgid="7625321655265747433">"עוצמת קול בשיחה"</string> <string name="volume_bluetooth_call" msgid="2930204618610115061">"עוצמת הקול בשיחה ב-Bluetooth"</string> - <string name="volume_alarm" msgid="4486241060751798448">"עוצמת קול של התראה"</string> + <string name="volume_alarm" msgid="4486241060751798448">"עוצמת הקול של השעון המעורר"</string> <string name="volume_notification" msgid="6864412249031660057">"עוצמת הקול של ההתראות"</string> <string name="volume_unknown" msgid="4041914008166576293">"עוצמת קול"</string> <string name="volume_icon_description_bluetooth" msgid="7540388479345558400">"עוצמת הקול של Bluetooth"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index f65ba4896355..913539b106ae 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -303,7 +303,7 @@ <string name="user_owner_label" msgid="8628726904184471211">"개인 프로필로 전환"</string> <string name="managed_profile_label" msgid="7316778766973512382">"직장 프로필로 전환"</string> <string name="permgrouplab_contacts" msgid="4254143639307316920">"연락처"</string> - <string name="permgroupdesc_contacts" msgid="9163927941244182567">"주소록에 액세스"</string> + <string name="permgroupdesc_contacts" msgid="9163927941244182567">"연락처에 액세스"</string> <string name="permgrouplab_location" msgid="1858277002233964394">"위치"</string> <string name="permgroupdesc_location" msgid="1995955142118450685">"이 기기의 위치정보에 액세스"</string> <string name="permgrouplab_calendar" msgid="6426860926123033230">"캘린더"</string> @@ -1306,7 +1306,7 @@ <string name="ringtone_silent" msgid="397111123930141876">"없음"</string> <string name="ringtone_picker_title" msgid="667342618626068253">"벨소리"</string> <string name="ringtone_picker_title_alarm" msgid="7438934548339024767">"알람 소리"</string> - <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"알림 사운드"</string> + <string name="ringtone_picker_title_notification" msgid="6387191794719608122">"알림음"</string> <string name="ringtone_unknown" msgid="5059495249862816475">"알 수 없음"</string> <string name="wifi_available_sign_in" msgid="381054692557675237">"Wi-Fi 네트워크에 로그인"</string> <string name="network_available_sign_in" msgid="1520342291829283114">"네트워크에 로그인"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index aeda707ca0b7..d09e18e77b4c 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -317,7 +317,7 @@ <string name="permgrouplab_activityRecognition" msgid="3324466667921775766">"ကိုယ်ခန္ဓာလှုပ်ရှားမှု"</string> <string name="permgroupdesc_activityRecognition" msgid="4725624819457670704">"သင့်ကိုယ်ခန္ဓာလှုပ်ရှားမှုကို ဝင်ကြည့်ရန်"</string> <string name="permgrouplab_camera" msgid="9090413408963547706">"ကင်မရာ"</string> - <string name="permgroupdesc_camera" msgid="7585150538459320326">"ဓာတ်ပုံ ရိုက်ပြီးနောက် ဗွီဒီယို မှတ်တမ်းတင်ရန်"</string> + <string name="permgroupdesc_camera" msgid="7585150538459320326">"ဓာတ်ပုံနှင့် ဗီဒီယို ရိုက်ကူးရန်"</string> <string name="permgrouplab_nearby_devices" msgid="5529147543651181991">"အနီးတစ်ဝိုက်ရှိ စက်များ"</string> <string name="permgroupdesc_nearby_devices" msgid="3213561597116913508">"အနီးတစ်ဝိုက်ရှိ စက်များကို ရှာဖွေပြီးချိတ်ဆက်မည်"</string> <string name="permgrouplab_calllog" msgid="7926834372073550288">"ခေါ်ဆိုမှတ်တမ်း"</string> @@ -1696,12 +1696,12 @@ <string name="kg_reordering_delete_drop_target_text" msgid="2034358143731750914">"ဖယ်ရှားရန်"</string> <string name="safe_media_volume_warning" product="default" msgid="3751676824423049994">"အသံကို အကြံပြုထားသည့် ပမာဏထက် မြှင့်ပေးရမလား?\n\nအသံကို မြင့်သည့် အဆင့်မှာ ကြာရှည်စွာ နားထောင်ခြင်းက သင်၏ နားကို ထိခိုက်စေနိုင်သည်။"</string> <string name="accessibility_shortcut_warning_dialog_title" msgid="4017995837692622933">"အများသုံးစွဲနိုင်မှု ဖြတ်လမ်းလင့်ခ်ကို အသုံးပြုလိုပါသလား။"</string> - <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ဖြတ်လမ်းလင့်ခ်ကို ဖွင့်ထားစဉ် အသံထိန်းခလုတ် နှစ်ခုစလုံးကို ၃ စက္ကန့်ခန့် ဖိထားခြင်းဖြင့် အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုကို ဖွင့်နိုင်သည်။"</string> + <string name="accessibility_shortcut_toogle_warning" msgid="4161716521310929544">"ဖြတ်လမ်းလင့်ခ်ကို ဖွင့်ထားစဉ် အသံထိန်းခလုတ် နှစ်ခုစလုံးကို ၃ စက္ကန့်ခန့် ဖိထားခြင်းဖြင့် အများသုံးနိုင်သည့် ဝန်ဆောင်မှုကို ဖွင့်နိုင်သည်။"</string> <string name="accessibility_shortcut_multiple_service_warning_title" msgid="3135860819356676426">"အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများအတွက် ဖြတ်လမ်းကို ဖွင့်မလား။"</string> <string name="accessibility_shortcut_multiple_service_warning" msgid="3740723309483706911">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုများ ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nလက်ရှိ ဝန်ဆောင်မှုများ-\n<xliff:g id="SERVICE">%1$s</xliff:g>\n\'ဆက်တင်များ > အများသုံးစွဲနိုင်မှု\' တွင် ရွေးထားသည့် ဝန်ဆောင်မှုများကို ပြောင်းနိုင်သည်။"</string> <string name="accessibility_shortcut_multiple_service_list" msgid="2128323171922023762">" • <xliff:g id="SERVICE">%1$s</xliff:g>\n"</string> <string name="accessibility_shortcut_single_service_warning_title" msgid="1909518473488345266">"<xliff:g id="SERVICE">%1$s</xliff:g> ဖြတ်လမ်းကို ဖွင့်မလား။"</string> - <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးစွဲနိုင်မှုဆိုင်ရာ ဝန်ဆောင်မှုဖြစ်သော <xliff:g id="SERVICE">%1$s</xliff:g> ကို ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nဤဖြတ်လမ်းလင့်ခ်ကို \'ဆက်တင်များ > အများသုံးစွဲနိုင်မှု\' တွင် နောက်ဝန်ဆောင်မှုတစ်ခုသို့ ပြောင်းနိုင်သည်။"</string> + <string name="accessibility_shortcut_single_service_warning" msgid="6363127705112844257">"အသံခလုတ်နှစ်ခုလုံးကို စက္ကန့်အနည်းငယ် ဖိထားခြင်းက အများသုံးနိုင်သည့် ဝန်ဆောင်မှုဖြစ်သော <xliff:g id="SERVICE">%1$s</xliff:g> ကို ဖွင့်ပေးသည်။ ဤလုပ်ဆောင်ချက်က သင့်စက်အလုပ်လုပ်ပုံကို ပြောင်းလဲနိုင်သည်။\n\nဤဖြတ်လမ်းလင့်ခ်ကို ဆက်တင်များ > အများသုံးနိုင်မှုတွင် နောက်ဝန်ဆောင်မှုတစ်ခုသို့ ပြောင်းနိုင်သည်။"</string> <string name="accessibility_shortcut_on" msgid="5463618449556111344">"ဖွင့်ရန်"</string> <string name="accessibility_shortcut_off" msgid="3651336255403648739">"မဖွင့်ပါနှင့်"</string> <string name="accessibility_shortcut_menu_item_status_on" msgid="6608392117189732543">"ဖွင့်"</string> @@ -1730,9 +1730,9 @@ <string name="accessibility_shortcut_enabling_service" msgid="5473495203759847687">"အသံခလုတ်များကို ဖိထားသည်။ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ဖွင့်လိုက်သည်။"</string> <string name="accessibility_shortcut_disabling_service" msgid="8675244165062700619">"အသံခလုတ်များကို ဖိထားသည်။ <xliff:g id="SERVICE_NAME">%1$s</xliff:g> ပိတ်လိုက်သည်။"</string> <string name="accessibility_shortcut_spoken_feedback" msgid="4228997042855695090">"<xliff:g id="SERVICE_NAME">%1$s</xliff:g> ကို သုံးရန် အသံအတိုးအလျှော့ ခလုတ်နှစ်ခုလုံးကို သုံးစက္ကန့်ကြာ ဖိထားပါ"</string> - <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"အများသုံးစွဲနိုင်မှု ခလုတ်ကို တို့သည့်အခါ အသုံးပြုမည့် ဝန်ဆောင်မှုကို ရွေးချယ်ပါ−"</string> - <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string> - <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"အများသုံးစွဲနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string> + <string name="accessibility_button_prompt_text" msgid="8343213623338605305">"သုံးနိုင်မှုခလုတ်ကို တို့ပြီးလျှင် ဝန်ဆောင်မှုတစ်ခု ရွေးပါ−"</string> + <string name="accessibility_gesture_prompt_text" msgid="8742535972130563952">"သုံးနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string> + <string name="accessibility_gesture_3finger_prompt_text" msgid="5211827854510660203">"သုံးနိုင်မှုလက်ဟန်ဖြင့် အသုံးပြုရန် ဝန်ဆောင်မှုတစ်ခုကို ရွေးပါ (ဖန်သားပြင်အောက်ခြေမှနေ၍ လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပါ)-"</string> <string name="accessibility_button_instructional_text" msgid="8853928358872550500">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် အများသုံးစွဲနိုင်မှုခလုတ်ကို ဖိထားပါ။"</string> <string name="accessibility_gesture_instructional_text" msgid="9196230728837090497">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်နှစ်ချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။"</string> <string name="accessibility_gesture_3finger_instructional_text" msgid="3425123684990193765">"ဝန်ဆောင်မှုများအကြား ပြောင်းရန် လက်သုံးချောင်းဖြင့် အပေါ်သို့ ပွတ်ဆွဲပြီး ဖိထားပါ။"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index b05c2da000fa..9af41e16bd4a 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1375,7 +1375,7 @@ <string name="usb_midi_notification_title" msgid="7404506788950595557">"I-MIDI nge-USB ivuliwe"</string> <string name="usb_accessory_notification_title" msgid="1385394660861956980">"Insiza ye-USB ixhunyiwe"</string> <string name="usb_notification_message" msgid="4715163067192110676">"Thepha ngezinketho eziningi."</string> - <string name="usb_power_notification_message" msgid="7284765627437897702">"Ishaja idivayisi exhunyiwe. Thepha ukuze uthole ezinye izinketho."</string> + <string name="usb_power_notification_message" msgid="7284765627437897702">"Ishaja idivayisi exhunyiwe. Thepha ukuze uthole okunye okungakhethwa."</string> <string name="usb_unsupported_audio_accessory_title" msgid="2335775548086533065">"Kutholwe isisetshenziswa se-analog yomsindo"</string> <string name="usb_unsupported_audio_accessory_message" msgid="1300168007129796621">"Idivayisi enamathiselwe kwi-imeyili ayihambisani nale foni. Thepha ukuze ufunde kabanzi."</string> <string name="adb_active_notification_title" msgid="408390247354560331">"Ukulungisa iphutha le-USB kuxhunyiwe"</string> diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index b8e8b0114b47..ed5f706618ad 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -346,7 +346,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen TaskFragmentContainer getTopActiveContainer() { for (int i = mContainers.size() - 1; i >= 0; i--) { TaskFragmentContainer container = mContainers.get(i); - if (!container.isFinished()) { + if (!container.isFinished() && container.getTopNonFinishingActivity() != null) { return container; } } diff --git a/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml b/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml index 4ac972c6cfa7..44b2f45052ba 100644 --- a/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml +++ b/libs/WindowManager/Shell/res/layout/compat_mode_hint.xml @@ -21,7 +21,7 @@ android:orientation="vertical" android:clipToPadding="false" android:paddingEnd="@dimen/compat_hint_padding_end" - android:paddingBottom="5dp" + android:paddingBottom="8dp" android:clickable="true"> <TextView diff --git a/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml b/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml index c99f3fe89563..dfaeeeb81c07 100644 --- a/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml +++ b/libs/WindowManager/Shell/res/layout/compat_ui_layout.xml @@ -33,8 +33,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:clipToPadding="false" - android:layout_marginEnd="16dp" - android:layout_marginBottom="16dp" + android:layout_marginEnd="@dimen/compat_button_margin" + android:layout_marginBottom="@dimen/compat_button_margin" android:orientation="vertical"> <ImageButton @@ -62,8 +62,10 @@ <ImageButton android:id="@+id/size_compat_restart_button" android:visibility="gone" - android:layout_width="@dimen/size_compat_button_width" - android:layout_height="@dimen/size_compat_button_height" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="@dimen/compat_button_margin" + android:layout_marginBottom="@dimen/compat_button_margin" android:src="@drawable/size_compat_restart_button_ripple" android:background="@android:color/transparent" android:contentDescription="@string/restart_button_description"/> diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index 8b32b382c90d..ec0e9ea6b867 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Bestuur"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Borrel is toegemaak."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tik om hierdie program te herbegin en maak volskerm oop."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerakwessies?\nTik om aan te pas"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nie opgelos nie?\nTik om terug te stel"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen kamerakwessies nie? Tik om toe te maak."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index 8b898c0e79da..646a0d3b055f 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"ያቀናብሩ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"አረፋ ተሰናብቷል።"</string> <string name="restart_button_description" msgid="5887656107651190519">"ይህን መተግበሪያ ዳግም ለማስነሳት መታ ያድርጉ እና ወደ ሙሉ ማያ ገጽ ይሂዱ።"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"የካሜራ ችግሮች አሉ?\nዳግም ለማበጀት መታ ያድርጉ"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"አልተስተካከለም?\nለማህደር መታ ያድርጉ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index a9eafdd2df1d..a184fe4719b3 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"إدارة"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"تم إغلاق الفقاعة."</string> <string name="restart_button_description" msgid="5887656107651190519">"انقر لإعادة تشغيل هذا التطبيق والانتقال إلى وضع ملء الشاشة."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"هل هناك مشاكل في الكاميرا؟\nانقر لإعادة الضبط."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ألم يتم حل المشكلة؟\nانقر للعودة"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"أليس هناك مشاكل في الكاميرا؟ انقر للإغلاق."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index a81d4e3ee1b4..c58c025f202e 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"পৰিচালনা কৰক"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল অগ্ৰাহ্য কৰা হৈছে"</string> <string name="restart_button_description" msgid="5887656107651190519">"এপ্টো ৰিষ্টাৰ্ট কৰিবলৈ আৰু পূৰ্ণ স্ক্ৰীন ব্যৱহাৰ কৰিবলৈ টিপক।"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"কেমেৰাৰ কোনো সমস্যা হৈছে নেকি?\nপুনৰ খাপ খোৱাবলৈ টিপক"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এইটো সমাধান কৰা নাই নেকি?\nপূৰ্বাৱস্থালৈ নিবলৈ টিপক"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"কেমেৰাৰ কোনো সমস্যা নাই নেকি? অগ্ৰাহ্য কৰিবলৈ টিপক।"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml index 45e3fdbd91a3..945f7382b1bd 100644 --- a/libs/WindowManager/Shell/res/values-az/strings.xml +++ b/libs/WindowManager/Shell/res/values-az/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"İdarə edin"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Qabarcıqdan imtina edilib."</string> <string name="restart_button_description" msgid="5887656107651190519">"Bu tətbiqi sıfırlayaraq tam ekrana keçmək üçün toxunun."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera problemi var?\nBərpa etmək üçün toxunun"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Düzəltməmisiniz?\nGeri qaytarmaq üçün toxunun"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera problemi yoxdur? Qapatmaq üçün toxunun."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml index c17b3c43c147..cac983be0571 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljajte"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string> <string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da biste restartovali aplikaciju i prešli u režim celog ekrana."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Imate problema sa kamerom?\nDodirnite da biste ponovo uklopili"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije rešen?\nDodirnite da biste vratili"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema sa kamerom? Dodirnite da biste odbacili."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index bcf7186e054a..791bcef98192 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Кіраваць"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Усплывальнае апавяшчэнне адхілена."</string> <string name="restart_button_description" msgid="5887656107651190519">"Націсніце, каб перазапусціць гэту праграму і перайсці ў поўнаэкранны рэжым."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Праблемы з камерай?\nНацісніце, каб пераабсталяваць"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не ўдалося выправіць?\nНацісніце, каб аднавіць"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ніякіх праблем з камерай? Націсніце, каб адхіліць."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index 5f48744f41fd..2974b85861df 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Управление"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отхвърлено."</string> <string name="restart_button_description" msgid="5887656107651190519">"Докоснете, за да рестартирате това приложение в режим на цял екран."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблеми с камерата?\nДокоснете за ремонтиране"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблемът не се отстрани?\nДокоснете за връщане в предишното състояние"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нямате проблеми с камерата? Докоснете, за да отхвърлите."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index f96d65fac238..e359d46cf129 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"ম্যানেজ করুন"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"বাবল বাতিল করা হয়েছে।"</string> <string name="restart_button_description" msgid="5887656107651190519">"এই অ্যাপ রিস্টার্ট করতে ট্যাপ করুন ও \'ফুল-স্ক্রিন\' মোড ব্যবহার করুন।"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ক্যামেরা সংক্রান্ত সমস্যা?\nরিফিট করতে ট্যাপ করুন"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এখনও সমাধান হয়নি?\nরিভার্ট করার জন্য ট্যাপ করুন"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ক্যামেরা সংক্রান্ত সমস্যা নেই? বাতিল করতে ট্যাপ করুন।"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index 1e068c6f94f9..e3990e02846e 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljaj"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić je odbačen."</string> <string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da ponovo pokrenete ovu aplikaciju i aktivirate prikaz preko cijelog ekrana."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s kamerom?\nDodirnite da ponovo namjestite"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nije popravljeno?\nDodirnite da vratite"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nema problema s kamerom? Dodirnite da odbacite."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-bs/strings_tv.xml b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml index 8e301b0a8f4d..9a655bb41066 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings_tv.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings_tv.xml @@ -19,6 +19,6 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="notification_channel_tv_pip" msgid="2576686079160402435">"Slika u slici"</string> <string name="pip_notification_unknown_title" msgid="2729870284350772311">"(Program bez naslova)"</string> - <string name="pip_close" msgid="9135220303720555525">"Zatvori PIP"</string> + <string name="pip_close" msgid="9135220303720555525">"Zatvori sliku u slici"</string> <string name="pip_fullscreen" msgid="7278047353591302554">"Cijeli ekran"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml index 97585ef0f2ce..f3c2470ff159 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestiona"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"La bombolla s\'ha ignorat."</string> <string name="restart_button_description" msgid="5887656107651190519">"Toca per reiniciar aquesta aplicació i passar a pantalla completa."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tens problemes amb la càmera?\nToca per resoldre\'ls"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"El problema no s\'ha resolt?\nToca per desfer els canvis"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No tens cap problema amb la càmera? Toca per ignorar."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index 7a3a89051517..d1c9a464aace 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovat"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina byla zavřena."</string> <string name="restart_button_description" msgid="5887656107651190519">"Klepnutím aplikaci restartujete a přejdete na režim celé obrazovky"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s fotoaparátem?\nKlepnutím vyřešíte"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepomohlo to?\nKlepnutím se vrátíte"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Žádné problémy s fotoaparátem? Klepnutím zavřete."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index 4a025ba25b8c..94f9a7a1964e 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen blev lukket."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tryk for at genstarte denne app, og gå til fuld skærm."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du problemer med dit kamera?\nTryk for at gendanne det oprindelige format"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Løste det ikke problemet?\nTryk for at fortryde"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen problemer med dit kamera? Tryk for at afvise."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index bacd5126dc25..d1851ea117a4 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Verwalten"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble verworfen."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tippe, um die App im Vollbildmodus neu zu starten."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Probleme mit der Kamera?\nZum Anpassen tippen."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Das Problem ist nicht behoben?\nZum Rückgängigmachen tippen."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Keine Probleme mit der Kamera? Zum Schließen tippen."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml index f306ba3b1169..21d747404ffc 100644 --- a/libs/WindowManager/Shell/res/values-el/strings.xml +++ b/libs/WindowManager/Shell/res/values-el/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Διαχείριση"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Το συννεφάκι παραβλέφθηκε."</string> <string name="restart_button_description" msgid="5887656107651190519">"Πατήστε για επανεκκίνηση αυτής της εφαρμογής και ενεργοποίηση πλήρους οθόνης."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Προβλήματα με την κάμερα;\nΠατήστε για επιδιόρθωση."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Δεν διορθώθηκε;\nΠατήστε για επαναφορά."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Δεν αντιμετωπίζετε προβλήματα με την κάμερα; Πατήστε για παράβλεψη."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml index 1ffbd0396238..7ac28ea991b7 100644 --- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml index 1ffbd0396238..7ac28ea991b7 100644 --- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml index 1ffbd0396238..7ac28ea991b7 100644 --- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml index 1ffbd0396238..7ac28ea991b7 100644 --- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Manage"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubble dismissed."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tap to restart this app and go full screen."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml index 1ca7bfcf04b0..d8db8e188512 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Se descartó el cuadro."</string> <string name="restart_button_description" msgid="5887656107651190519">"Presiona para reiniciar esta app y acceder al modo de pantalla completa."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Tienes problemas con la cámara?\nPresiona para reajustarla"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se resolvió?\nPresiona para revertir los cambios"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No tienes problemas con la cámara? Presionar para descartar."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index 3d4642136a1a..9a7d1c0659bd 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbuja cerrada."</string> <string name="restart_button_description" msgid="5887656107651190519">"Toca para reiniciar esta aplicación e ir a la pantalla completa."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Problemas con la cámara?\nToca para reajustar"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index 4f5d563b7c3e..9dfd6cf27675 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Halda"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Mullist loobuti."</string> <string name="restart_button_description" msgid="5887656107651190519">"Puudutage rakenduse taaskäivitamiseks ja täisekraanrežiimi aktiveerimiseks."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kas teil on kaameraprobleeme?\nPuudutage ümberpaigutamiseks."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Kas probleemi ei lahendatud?\nPuudutage ennistamiseks."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kas kaameraprobleeme pole? Puudutage loobumiseks."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml index b76ccc84e830..210c44172147 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Kudeatu"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Baztertu da globoa."</string> <string name="restart_button_description" msgid="5887656107651190519">"Saka ezazu aplikazioa berrabiarazteko, eta ezarri pantaila osoko modua."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Arazoak dauzkazu kamerarekin?\nBerriro doitzeko, sakatu hau."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ez al da konpondu?\nLeheneratzeko, sakatu hau."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ez daukazu arazorik kamerarekin? Baztertzeko, sakatu hau."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index aef3c62400c2..87c7f8b01928 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"مدیریت"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"حبابک رد شد."</string> <string name="restart_button_description" msgid="5887656107651190519">"برای بازراهاندازی این برنامه و تغییر به حالت تمامصفحه، ضربه بزنید."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"دوربین مشکل دارد؟\nبرای تنظیم مجدد اندازه ضربه بزنید"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"مشکل برطرف نشد؟\nبرای برگرداندن ضربه بزنید"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"دوربین مشکلی ندارد؟ برای بستن ضربه بزنید."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml index 5f76ba4ec83e..7b2ea037734a 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Ylläpidä"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Kupla ohitettu."</string> <string name="restart_button_description" msgid="5887656107651190519">"Napauta, niin sovellus käynnistyy uudelleen ja siirtyy koko näytön tilaan."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Onko kameran kanssa ongelmia?\nKorjaa napauttamalla"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Eikö ongelma ratkennut?\nKumoa napauttamalla"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ei ongelmia kameran kanssa? Hylkää napauttamalla."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml index e1843e73b1a9..338b8bb54a10 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle ignorée."</string> <string name="restart_button_description" msgid="5887656107651190519">"Touchez pour redémarrer cette application et passer en plein écran."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo?\nTouchez pour réajuster"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu?\nTouchez pour rétablir"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo? Touchez pour ignorer."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml index b3f33496c4b7..22d1d19594a5 100644 --- a/libs/WindowManager/Shell/res/values-fr/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gérer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulle fermée."</string> <string name="restart_button_description" msgid="5887656107651190519">"Appuyez pour redémarrer cette application et activer le mode plein écran."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo ?\nAppuyez pour réajuster"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu ?\nAppuyez pour rétablir"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo ? Appuyez pour ignorer."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index 3cdddf30e00d..4bd70a1ce8d8 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Xestionar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ignorouse a burbulla."</string> <string name="restart_button_description" msgid="5887656107651190519">"Toca o botón para reiniciar esta aplicación e abrila en pantalla completa."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tes problemas coa cámara?\nToca para reaxustala"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Non se solucionaron os problemas?\nToca para reverter o seu tratamento"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Non hai problemas coa cámara? Tocar para ignorar."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index 09d206e8e9cf..81c5ba975cc4 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"મેનેજ કરો"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"બબલ છોડી દેવાયો."</string> <string name="restart_button_description" msgid="5887656107651190519">"આ ઍપ ફરીથી ચાલુ કરવા માટે ટૅપ કરીને પૂર્ણ સ્ક્રીન કરો."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"કૅમેરામાં સમસ્યાઓ છે?\nફરીથી ફિટ કરવા માટે ટૅપ કરો"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"સુધારો નથી થયો?\nપહેલાંના પર પાછું ફેરવવા માટે ટૅપ કરો"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"કૅમેરામાં કોઈ સમસ્યા નથી? છોડી દેવા માટે ટૅપ કરો."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index 0ce5114a2dc9..56c32715926e 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"मैनेज करें"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल खारिज किया गया."</string> <string name="restart_button_description" msgid="5887656107651190519">"इस ऐप्लिकेशन को रीस्टार्ट करने और फ़ुल स्क्रीन पर देखने के लिए टैप करें."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्या कैमरे से जुड़ी कोई समस्या है?\nफिर से फ़िट करने के लिए टैप करें"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"क्या समस्या ठीक नहीं हुई?\nपहले जैसा करने के लिए टैप करें"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्या कैमरे से जुड़ी कोई समस्या नहीं है? खारिज करने के लिए टैप करें."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml index e8c83f170e7f..d71bc1d54bd1 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblačić odbačen."</string> <string name="restart_button_description" msgid="5887656107651190519">"Dodirnite da biste ponovo pokrenuli tu aplikaciju i prikazali je na cijelom zaslonu."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s fotoaparatom?\nDodirnite za popravak"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije riješen?\nDodirnite za vraćanje"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema s fotoaparatom? Dodirnite za odbacivanje."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index 6d60513e706d..a69f197ad7c2 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Kezelés"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Buborék elvetve."</string> <string name="restart_button_description" msgid="5887656107651190519">"Koppintson az alkalmazás újraindításához és a teljes képernyős mód elindításához."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerával kapcsolatos problémába ütközött?\nKoppintson a megoldáshoz."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nem sikerült a hiba kijavítása?\nKoppintson a visszaállításhoz."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nincsenek problémái kamerával? Koppintson az elvetéshez."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml index f1ec076fcbaf..e38285e082f3 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Կառավարել"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ամպիկը փակվեց։"</string> <string name="restart_button_description" msgid="5887656107651190519">"Հպեք՝ հավելվածը վերագործարկելու և լիաէկրան ռեժիմին անցնելու համար։"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Տեսախցիկի հետ կապված խնդիրնե՞ր կան։\nՀպեք՝ վերակարգավորելու համար։"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Չհաջողվե՞ց շտկել։\nՀպեք՝ փոփոխությունները չեղարկելու համար։"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Տեսախցիկի հետ կապված խնդիրներ չկա՞ն։ Փակելու համար հպեք։"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml index 62dfcb71f3c8..036acb875a3a 100644 --- a/libs/WindowManager/Shell/res/values-in/strings.xml +++ b/libs/WindowManager/Shell/res/values-in/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Kelola"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon ditutup."</string> <string name="restart_button_description" msgid="5887656107651190519">"Ketuk untuk memulai ulang aplikasi ini dan membuka layar penuh."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Masalah kamera?\nKetuk untuk memperbaiki"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tidak dapat diperbaiki?\nKetuk untuk mengembalikan"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tidak ada masalah kamera? Ketuk untuk menutup."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index feab36293699..2f9848764f02 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Stjórna"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Blöðru lokað."</string> <string name="restart_button_description" msgid="5887656107651190519">"Ýttu til að endurræsa forritið og sýna það á öllum skjánum."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Myndavélavesen?\nÝttu til að breyta stærð"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ennþá vesen?\nÝttu til að afturkalla"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ekkert myndavélavesen? Ýttu til að hunsa."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index bfcd38554978..e4da3939f5f6 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestisci"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Fumetto ignorato."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tocca per riavviare l\'app e passare alla modalità a schermo intero."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi con la fotocamera?\nTocca per risolverli"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index 7ef5035c7869..99294f947c37 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"ניהול"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"הבועה נסגרה."</string> <string name="restart_button_description" msgid="5887656107651190519">"צריך להקיש כדי להפעיל מחדש את האפליקציה הזו ולעבור למסך מלא."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"בעיות במצלמה?\nאפשר להקיש כדי לבצע התאמה מחדש"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"הבעיה לא נפתרה?\nאפשר להקיש כדי לחזור לגרסה הקודמת"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"אין בעיות במצלמה? אפשר להקיש כדי לסגור."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index fb58abbbac8f..1ee606aaef03 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ふきだしが非表示になっています。"</string> <string name="restart_button_description" msgid="5887656107651190519">"タップしてこのアプリを再起動すると、全画面表示になります。"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"カメラに関する問題の場合は、\nタップすると修正できます"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"修正されなかった場合は、\nタップすると元に戻ります"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"カメラに関する問題でない場合は、タップすると閉じます。"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index 297d9af14c18..e8efa8d90b93 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"მართვა"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ბუშტი დაიხურა."</string> <string name="restart_button_description" msgid="5887656107651190519">"შეეხეთ ამ აპის გადასატვირთად და გადადით სრულ ეკრანზე."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"კამერად პრობლემები აქვს?\nშეეხეთ გამოსასწორებლად"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"არ გამოსწორდა?\nშეეხეთ წინა ვერსიის დასაბრუნებლად"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"კამერას პრობლემები არ აქვს? შეეხეთ უარყოფისთვის."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index 7ca2f23f00cc..0c3f8f549f4f 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Басқару"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Қалқыма хабар жабылды."</string> <string name="restart_button_description" msgid="5887656107651190519">"Бұл қолданбаны қайта қосып, толық экранға өту үшін түртіңіз."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада қателер шықты ма?\nЖөндеу үшін түртіңіз."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Жөнделмеді ме?\nҚайтару үшін түртіңіз."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада қателер шықпады ма? Жабу үшін түртіңіз."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index dae229382434..e5ecf819cfa7 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"គ្រប់គ្រង"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"បានច្រានចោលសារលេចឡើង។"</string> <string name="restart_button_description" msgid="5887656107651190519">"ចុចដើម្បីចាប់ផ្ដើមកម្មវិធីនេះឡើងវិញ រួចចូលប្រើពេញអេក្រង់។"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"មានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាឬ?\nចុចដើម្បីដោះស្រាយ"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"មិនបានដោះស្រាយបញ្ហានេះទេឬ?\nចុចដើម្បីត្រឡប់"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"មិនមានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាទេឬ? ចុចដើម្បីច្រានចោល។"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 72ba8eae62c0..69a6df857a31 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"ನಿರ್ವಹಿಸಿ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ಬಬಲ್ ವಜಾಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="restart_button_description" msgid="5887656107651190519">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು ಮತ್ತು ಪೂರ್ಣ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ನೋಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿವೆಯೇ?\nಮರುಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ಅದನ್ನು ಸರಿಪಡಿಸಲಿಲ್ಲವೇ?\nಹಿಂತಿರುಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿಲ್ಲವೇ? ವಜಾಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index d99abc435cd8..804b78ccfbb9 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"관리"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"대화창을 닫았습니다."</string> <string name="restart_button_description" msgid="5887656107651190519">"탭하여 이 앱을 다시 시작하고 전체 화면으로 이동합니다."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"카메라 문제가 있나요?\n해결하려면 탭하세요."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index fe25161fc658..c7e7a05dd193 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Башкаруу"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Калкып чыкма билдирме жабылды."</string> <string name="restart_button_description" msgid="5887656107651190519">"Бул колдонмону өчүрүп күйгүзүп, толук экранга өтүү үчүн таптап коюңуз."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада маселелер келип чыктыбы?\nОңдоо үчүн таптаңыз"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Оңдолгон жокпу?\nАртка кайтаруу үчүн таптаңыз"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада маселе жокпу? Этибарга албоо үчүн таптаңыз."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index 786d83707c09..a94507f9d9b7 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"ຈັດການ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ປິດ Bubble ໄສ້ແລ້ວ."</string> <string name="restart_button_description" msgid="5887656107651190519">"ແຕະເພື່ອຣີສະຕາດແອັບນີ້ ແລະ ໃຊ້ແບບເຕັມຈໍ."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ?\nແຕະເພື່ອປັບໃໝ່"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ບໍ່ໄດ້ແກ້ໄຂມັນບໍ?\nແຕະເພື່ອແປງກັບຄືນ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ບໍ່ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ? ແຕະເພື່ອປິດໄວ້."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index 32bdfc44e724..dae4d712ff4b 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Tvarkyti"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Debesėlio atsisakyta."</string> <string name="restart_button_description" msgid="5887656107651190519">"Palieskite, kad paleistumėte iš naujo šią programą ir įjungtumėte viso ekrano režimą."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Iškilo problemų dėl kameros?\nPalieskite, kad pritaikytumėte iš naujo"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepavyko pataisyti?\nPalieskite, kad grąžintumėte"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nėra jokių problemų dėl kameros? Palieskite, kad atsisakytumėte."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml index 5d0f318a052d..564002ddeba6 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Pārvaldīt"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Burbulis ir noraidīts."</string> <string name="restart_button_description" msgid="5887656107651190519">"Pieskarieties, lai restartētu šo lietotni un pārietu pilnekrāna režīmā."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Vai ir problēmas ar kameru?\nPieskarieties, lai tās novērstu."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Vai problēma netika novērsta?\nPieskarieties, lai atjaunotu."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Vai nav problēmu ar kameru? Pieskarieties, lai nerādītu."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index 8c2e44c294c1..a9b00197f5e7 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Управувајте"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Балончето е отфрлено."</string> <string name="restart_button_description" msgid="5887656107651190519">"Допрете за да ја рестартирате апликацијава и да ја отворите на цел екран."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми со камерата?\nДопрете за да се совпадне повторно"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не се поправи?\nДопрете за враќање"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нема проблеми со камерата? Допрете за отфрлање."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index 6c8883a9741d..932613465545 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"മാനേജ് ചെയ്യുക"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ബബിൾ ഡിസ്മിസ് ചെയ്തു."</string> <string name="restart_button_description" msgid="5887656107651190519">"ഈ ആപ്പ് റീസ്റ്റാർട്ട് ചെയ്ത് പൂർണ്ണ സ്ക്രീനിലേക്ക് മാറാൻ ടാപ്പ് ചെയ്യുക."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ക്യാമറ പ്രശ്നങ്ങളുണ്ടോ?\nശരിയാക്കാൻ ടാപ്പ് ചെയ്യുക"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"അത് പരിഹരിച്ചില്ലേ?\nപുനഃസ്ഥാപിക്കാൻ ടാപ്പ് ചെയ്യുക"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ക്യാമറാ പ്രശ്നങ്ങളൊന്നുമില്ലേ? നിരസിക്കാൻ ടാപ്പ് ചെയ്യുക."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml index d297923e0e13..8f21592babb1 100644 --- a/libs/WindowManager/Shell/res/values-mn/strings.xml +++ b/libs/WindowManager/Shell/res/values-mn/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Удирдах"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Бөмбөлгийг үл хэрэгссэн."</string> <string name="restart_button_description" msgid="5887656107651190519">"Энэ аппыг дахин эхлүүлж, бүтэн дэлгэцэд орохын тулд товшино уу."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерын асуудал гарсан уу?\nДахин тааруулахын тулд товшино уу"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Үүнийг засаагүй юу?\nБуцаахын тулд товшино уу"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерын асуудал байхгүй юу? Хаахын тулд товшино уу."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index 3d9b53c185bf..936c25236fb5 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापित करा"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल डिसमिस केला."</string> <string name="restart_button_description" msgid="5887656107651190519">"हे अॅप रीस्टार्ट करण्यासाठी आणि फुल स्क्रीन करण्यासाठी टॅप करा."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"कॅमेराशी संबंधित काही समस्या आहेत का?\nपुन्हा फिट करण्यासाठी टॅप करा"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"निराकरण झाले नाही?\nरिव्हर्ट करण्यासाठी कृपया टॅप करा"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"कॅमेराशी संबंधित कोणत्याही समस्या नाहीत का? डिसमिस करण्यासाठी टॅप करा."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index 0aafb592d4f5..15c122c845e8 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Urus"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Gelembung diketepikan."</string> <string name="restart_button_description" msgid="5887656107651190519">"Ketik untuk memulakan semula apl ini dan menggunakan skrin penuh."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Isu kamera?\nKetik untuk memuatkan semula"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Isu tidak dibetulkan?\nKetik untuk kembali"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tiada isu kamera? Ketik untuk mengetepikan."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index 899c607d805f..c54e3b325f61 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"စီမံရန်"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ပူဖောင်းကွက် ဖယ်လိုက်သည်။"</string> <string name="restart_button_description" msgid="5887656107651190519">"ဤအက်ပ်ကို ပြန်စပြီး ဖန်သားပြင်အပြည့်လုပ်ရန် တို့ပါ။"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ကင်မရာပြဿနာလား။\nပြင်ဆင်ရန် တို့ပါ"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ကောင်းမသွားဘူးလား။\nပြန်ပြောင်းရန် တို့ပါ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ကင်မရာပြဿနာ မရှိဘူးလား။ ပယ်ရန် တို့ပါ။"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml index 60891d393401..ae33f7af66e9 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Administrer"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Boblen er avvist."</string> <string name="restart_button_description" msgid="5887656107651190519">"Trykk for å starte denne appen på nytt og vise den i fullskjerm."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du kameraproblemer?\nTrykk for å tilpasse"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ble ikke problemet løst?\nTrykk for å gå tilbake"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen kameraproblemer? Trykk for å lukke."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index 8bd6907d821c..bbf247c5418b 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"व्यवस्थापन गर्नुहोस्"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"बबल हटाइयो।"</string> <string name="restart_button_description" msgid="5887656107651190519">"यो एप रिस्टार्ट गर्न ट्याप गर्नुहोस् र फुल स्क्रिन मोडमा जानुहोस्।"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्यामेरासम्बन्धी समस्या देखियो?\nसमस्या हल गर्न ट्याप गर्नुहोस्"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"समस्या हल भएन?\nपहिलेको जस्तै बनाउन ट्याप गर्नुहोस्"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्यामेरासम्बन्धी कुनै पनि समस्या छैन? खारेज गर्न ट्याप गर्नुहोस्।"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index 3fddf3479eb3..6a4d3107550b 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Beheren"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubbel gesloten."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tik om deze app opnieuw te starten en te openen op het volledige scherm."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Cameraproblemen?\nTik om opnieuw passend te maken."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Is dit geen oplossing?\nTik om terug te zetten."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen cameraproblemen? Tik om te sluiten."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index 217556e415e5..09fe95b046ca 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ବବଲ୍ ଖାରଜ କରାଯାଇଛି।"</string> <string name="restart_button_description" msgid="5887656107651190519">"ଏହି ଆପକୁ ରିଷ୍ଟାର୍ଟ କରି ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"କ୍ୟାମେରାରେ ସମସ୍ୟା ଅଛି?\nପୁଣି ଫିଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ଏହାର ସମାଧାନ ହୋଇନାହିଁ?\nଫେରିଯିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"କ୍ୟାମେରାରେ କିଛି ସମସ୍ୟା ନାହିଁ? ଖାରଜ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index dc4dae117352..3c7f3736f53f 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ਬਬਲ ਨੂੰ ਖਾਰਜ ਕੀਤਾ ਗਿਆ।"</string> <string name="restart_button_description" msgid="5887656107651190519">"ਇਸ ਐਪ ਨੂੰ ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਪੂਰੀ ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਜਾਓ।"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ?\nਮੁੜ-ਫਿੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ਕੀ ਇਹ ਠੀਕ ਨਹੀਂ ਹੋਈ?\nਵਾਪਸ ਉਹੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ? ਖਾਰਜ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index fccd1382e9de..cb89c39d7982 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Zarządzaj"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Zamknięto dymek"</string> <string name="restart_button_description" msgid="5887656107651190519">"Kliknij, by uruchomić tę aplikację ponownie i przejść w tryb pełnoekranowy."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemy z aparatem?\nKliknij, aby dopasować"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Naprawa się nie udała?\nKliknij, aby cofnąć"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Brak problemów z aparatem? Kliknij, aby zamknąć"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml index 56640300dae6..73cf177a7bf0 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string> <string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar o app e usar tela cheia."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index abe6a010c904..8ea4c2fee407 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerir"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão ignorado."</string> <string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar esta app e ficar em ecrã inteiro."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmara?\nToque aqui para reajustar"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Não foi corrigido?\nToque para reverter"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nenhum problema com a câmara? Toque para ignorar."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index 56640300dae6..73cf177a7bf0 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gerenciar"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balão dispensado."</string> <string name="restart_button_description" msgid="5887656107651190519">"Toque para reiniciar o app e usar tela cheia."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index 39dec90152fd..eb77c6a0e6b1 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Gestionați"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balonul a fost respins."</string> <string name="restart_button_description" msgid="5887656107651190519">"Atingeți ca să reporniți aplicația și să treceți în modul ecran complet."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Aveți probleme cu camera foto?\nAtingeți pentru a reîncadra"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nu ați remediat problema?\nAtingeți pentru a reveni"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nu aveți probleme cu camera foto? Atingeți pentru a închide."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index e3c22156a556..64de668685d8 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Настроить"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Всплывающий чат закрыт."</string> <string name="restart_button_description" msgid="5887656107651190519">"Нажмите, чтобы перезапустить приложение и перейти в полноэкранный режим."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблемы с камерой?\nНажмите, чтобы исправить."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не помогло?\nНажмите, чтобы отменить изменения."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нет проблем с камерой? Нажмите, чтобы закрыть."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index efaf1f305362..8c3aae9926a8 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"කළමනා කරන්න"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"බුබුල ඉවත දමා ඇත."</string> <string name="restart_button_description" msgid="5887656107651190519">"මෙම යෙදුම යළි ඇරඹීමට සහ පූර්ණ තිරයට යාමට තට්ටු කරන්න."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"කැමරා ගැටලුද?\nයළි සවි කිරීමට තට්ටු කරන්න"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"එය විසඳුවේ නැතිද?\nප්රතිවර්තනය කිරීමට තට්ටු කරන්න"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"කැමරා ගැටලු නොමැතිද? ඉවත දැමීමට තට්ටු කරන්න"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index a827153c296b..5dbe5adc722f 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Spravovať"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bublina bola zavretá."</string> <string name="restart_button_description" msgid="5887656107651190519">"Klepnutím reštartujete túto aplikáciu a prejdete do režimu celej obrazovky."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s kamerou?\nKlepnutím znova upravte."</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nevyriešilo sa to?\nKlepnutím sa vráťte."</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemáte problémy s kamerou? Klepnutím zatvoríte."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index 74376548950d..61155a90ca10 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Upravljanje"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Oblaček je bil opuščen."</string> <string name="restart_button_description" msgid="5887656107651190519">"Dotaknite se za vnovični zagon te aplikacije in preklop v celozaslonski način."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Težave s fotoaparatom?\nDotaknite se za vnovično prilagoditev"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"To ni odpravilo težave?\nDotaknite se za povrnitev"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nimate težav s fotoaparatom? Dotaknite se za opustitev."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index bda10c872599..8c11ea58ac8b 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Menaxho"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Flluska u hoq."</string> <string name="restart_button_description" msgid="5887656107651190519">"Trokit për ta rinisur këtë aplikacion dhe për të kaluar në ekranin e plotë."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ka probleme me kamerën?\nTrokit për ta ripërshtatur"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nuk u rregullua?\nTrokit për ta rikthyer"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nuk ka probleme me kamerën? Trokit për ta shpërfillur."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index 98e13be755a9..910108d2743d 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Управљајте"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Облачић је одбачен."</string> <string name="restart_button_description" msgid="5887656107651190519">"Додирните да бисте рестартовали апликацију и прешли у режим целог екрана."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблема са камером?\nДодирните да бисте поново уклопили"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблем није решен?\nДодирните да бисте вратили"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немате проблема са камером? Додирните да бисте одбацили."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index 308008800759..b3fa582949f2 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Hantera"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bubblan ignorerades."</string> <string name="restart_button_description" msgid="5887656107651190519">"Tryck för att starta om appen i helskärmsläge."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problem med kameran?\nTryck för att anpassa på nytt"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Löstes inte problemet?\nTryck för att återställa"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Inga problem med kameran? Tryck för att ignorera."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml index 9fb746016b7f..286b53c052eb 100644 --- a/libs/WindowManager/Shell/res/values-sw/strings.xml +++ b/libs/WindowManager/Shell/res/values-sw/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Dhibiti"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Umeondoa kiputo."</string> <string name="restart_button_description" msgid="5887656107651190519">"Gusa ili uzime na uwashe programu hii, kisha nenda kwenye skrini nzima."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Je, kuna hitilafu za kamera?\nGusa ili urekebishe"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Umeshindwa kurekebisha?\nGusa ili urejeshe nakala ya awali"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Je, hakuna hitilafu za kamera? Gusa ili uondoe."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml index d7f17aa4e8c6..b929a1c98a06 100644 --- a/libs/WindowManager/Shell/res/values-ta/strings.xml +++ b/libs/WindowManager/Shell/res/values-ta/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"நிர்வகி"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"குமிழ் நிராகரிக்கப்பட்டது."</string> <string name="restart_button_description" msgid="5887656107651190519">"தட்டுவதன் மூலம் இந்த ஆப்ஸை மீண்டும் தொடங்கலாம், முழுத்திரையில் பார்க்கலாம்."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"கேமரா தொடர்பான சிக்கல்களா?\nமீண்டும் பொருத்த தட்டவும்"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"சிக்கல்கள் சரிசெய்யப்படவில்லையா?\nமாற்றியமைக்க தட்டவும்"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"கேமரா தொடர்பான சிக்கல்கள் எதுவும் இல்லையா? நிராகரிக்க தட்டவும்."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 4e421b5ffbbc..84cf285a4b32 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"మేనేజ్ చేయండి"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"బబుల్ విస్మరించబడింది."</string> <string name="restart_button_description" msgid="5887656107651190519">"ఈ యాప్ను రీస్టార్ట్ చేయడానికి ట్యాప్ చేసి, ఆపై పూర్తి స్క్రీన్లోకి వెళ్లండి."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"కెమెరా సమస్యలు ఉన్నాయా?\nరీఫిట్ చేయడానికి ట్యాప్ చేయండి"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"దాని సమస్యను పరిష్కరించలేదా?\nపూర్వస్థితికి మార్చడానికి ట్యాప్ చేయండి"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"కెమెరా సమస్యలు లేవా? తీసివేయడానికి ట్యాప్ చేయండి."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 52f94e6b0e05..f0d9362f9981 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"จัดการ"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"ปิดบับเบิลแล้ว"</string> <string name="restart_button_description" msgid="5887656107651190519">"แตะเพื่อรีสตาร์ทแอปนี้และแสดงแบบเต็มหน้าจอ"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"หากพบปัญหากับกล้อง\nแตะเพื่อแก้ไข"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"หากไม่ได้แก้ไข\nแตะเพื่อเปลี่ยนกลับ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"หากไม่พบปัญหากับกล้อง แตะเพื่อปิด"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index d7b671db3043..1c3b8f18258e 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Pamahalaan"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Na-dismiss na ang bubble."</string> <string name="restart_button_description" msgid="5887656107651190519">"I-tap para i-restart ang app na ito at mag-full screen."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"May mga isyu sa camera?\nI-tap para i-refit"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Hindi ito naayos?\nI-tap para i-revert"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Walang isyu sa camera? I-tap para i-dismiss."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml index c618f6cc2b94..41c6c898db32 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Yönet"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Balon kapatıldı."</string> <string name="restart_button_description" msgid="5887656107651190519">"Bu uygulamayı yeniden başlatmak ve tam ekrana geçmek için dokunun."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kameranızda sorun mu var?\nDüzeltmek için dokunun"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bu işlem sorunu düzeltmedi mi?\nİşlemi geri almak için dokunun"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kameranızda sorun yok mu? Kapatmak için dokunun."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml index ec2e5503653c..8094d5d6252b 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Налаштувати"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Спливаюче сповіщення закрито."</string> <string name="restart_button_description" msgid="5887656107651190519">"Натисніть, щоб перезапустити додаток і перейти в повноекранний режим."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми з камерою?\nНатисніть, щоб пристосувати"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблему не вирішено?\nНатисніть, щоб скасувати зміни"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немає проблем із камерою? Торкніться, щоб закрити."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml index 18e1e51c8a37..0f6061ede6d6 100644 --- a/libs/WindowManager/Shell/res/values-ur/strings.xml +++ b/libs/WindowManager/Shell/res/values-ur/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"نظم کریں"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"بلبلہ برخاست کر دیا گیا۔"</string> <string name="restart_button_description" msgid="5887656107651190519">"یہ ایپ دوبارہ شروع کرنے کے لیے تھپتھپائیں اور پوری اسکرین پر جائیں۔"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"کیمرے کے مسائل؟\nدوبارہ فٹ کرنے کیلئے تھپتھپائیں"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"یہ حل نہیں ہوا؟\nلوٹانے کیلئے تھپتھپائیں"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"کوئی کیمرے کا مسئلہ نہیں ہے؟ برخاست کرنے کیلئے تھپتھپائیں۔"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index f6c7ed2ecb29..12fbd0fc2491 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Boshqarish"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Bulutcha yopildi."</string> <string name="restart_button_description" msgid="5887656107651190519">"Bu ilovani qaytadan ishga tushirish va butun ekranda ochish uchun bosing."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera nosozmi?\nQayta moslash uchun bosing"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tuzatilmadimi?\nQaytarish uchun bosing"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera muammosizmi? Yopish uchun bosing."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml index 1cab8e779e8d..4623b6bc389c 100644 --- a/libs/WindowManager/Shell/res/values-vi/strings.xml +++ b/libs/WindowManager/Shell/res/values-vi/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Quản lý"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Đã đóng bong bóng."</string> <string name="restart_button_description" msgid="5887656107651190519">"Nhấn để khởi động lại ứng dụng này và xem ở chế độ toàn màn hình."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Có vấn đề với máy ảnh?\nHãy nhấn để sửa lỗi"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bạn chưa khắc phục vấn đề?\nHãy nhấn để hủy bỏ"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Không có vấn đề với máy ảnh? Hãy nhấn để đóng."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml index dc12c4f70a7d..59366775175f 100644 --- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已关闭对话泡。"</string> <string name="restart_button_description" msgid="5887656107651190519">"点按即可重启此应用并进入全屏模式。"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相机有问题?\n点按即可整修"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"没有解决此问题?\n点按即可恢复"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相机没有问题?点按即可忽略。"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml index fe114ac1c5a0..55045371510b 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"對話氣泡已關閉。"</string> <string name="restart_button_description" msgid="5887656107651190519">"輕按即可重新開啟此應用程式並放大至全螢幕。"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題?\n輕按即可修正"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未能修正問題?\n輕按即可還原"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機冇問題?㩒一下就可以即可閂咗佢。"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml index 0e4fc304f0e4..aa0bdd0d27b6 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"管理"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"已關閉泡泡。"</string> <string name="restart_button_description" msgid="5887656107651190519">"輕觸即可重新啟動這個應用程式並進入全螢幕模式。"</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題嗎?\n輕觸即可修正"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未修正問題嗎?\n輕觸即可還原"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機沒問題嗎?輕觸即可關閉。"</string> </resources> diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml index f563f1fd538b..688f36b4ae01 100644 --- a/libs/WindowManager/Shell/res/values-zu/strings.xml +++ b/libs/WindowManager/Shell/res/values-zu/strings.xml @@ -73,10 +73,7 @@ <string name="manage_bubbles_text" msgid="7730624269650594419">"Phatha"</string> <string name="accessibility_bubble_dismissed" msgid="8367471990421247357">"Ibhamuza licashisiwe."</string> <string name="restart_button_description" msgid="5887656107651190519">"Thepha ukuze uqale kabusha lolu hlelo lokusebenza uphinde uye kusikrini esigcwele."</string> - <!-- no translation found for camera_compat_treatment_suggested_button_description (8103916969024076767) --> - <skip /> - <!-- no translation found for camera_compat_treatment_applied_button_description (2944157113330703897) --> - <skip /> - <!-- no translation found for camera_compat_dismiss_button_description (2795364433503817511) --> - <skip /> + <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Izinkinga zekhamera?\nThepha ukuze uyilinganise kabusha"</string> + <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Akuyilungisanga?\nThepha ukuze ubuyele"</string> + <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Azikho izinkinga zekhamera? Thepha ukuze ucashise."</string> </resources> diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml index d338e3bd74f9..1c19a10ab231 100644 --- a/libs/WindowManager/Shell/res/values/dimen.xml +++ b/libs/WindowManager/Shell/res/values/dimen.xml @@ -200,11 +200,8 @@ <!-- Size of user education views on large screens (phone is just match parent). --> <dimen name="bubbles_user_education_width_large_screen">400dp</dimen> - <!-- The width of the size compat restart button including padding. --> - <dimen name="size_compat_button_width">80dp</dimen> - - <!-- The height of the size compat restart button including padding. --> - <dimen name="size_compat_button_height">64dp</dimen> + <!-- Bottom and end margin for compat buttons. --> + <dimen name="compat_button_margin">16dp</dimen> <!-- The radius of the corners of the compat hint bubble. --> <dimen name="compat_hint_corner_radius">28dp</dimen> @@ -212,8 +209,8 @@ <!-- The width of the compat hint point. --> <dimen name="compat_hint_point_width">10dp</dimen> - <!-- The end padding for the compat hint. Computed as (size_compat_button_width / 2 - - compat_hint_corner_radius - compat_hint_point_width /2). --> + <!-- The end padding for the compat hint. Computed as (compat button width (=48) / 2 + + compat_button_margin - compat_hint_corner_radius - compat_hint_point_width / 2). --> <dimen name="compat_hint_padding_end">7dp</dimen> <!-- The width of the size compat hint. --> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java index 9374da4c4fab..f878a46d26f2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleFlyoutView.java @@ -231,8 +231,9 @@ public class BubbleFlyoutView extends FrameLayout { * Fade animation for consecutive flyouts. */ void animateUpdate(Bubble.FlyoutMessage flyoutMessage, PointF stackPos, - boolean hideDot, Runnable onHide) { + boolean hideDot, float[] dotCenter, Runnable onHide) { mOnHide = onHide; + mDotCenter = dotCenter; final Runnable afterFadeOut = () -> { updateFlyoutMessage(flyoutMessage); // Wait for TextViews to layout with updated height. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java index b40021ec82a7..620c291b357b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleStackView.java @@ -2494,6 +2494,7 @@ public class BubbleStackView extends FrameLayout if (mFlyout.getVisibility() == View.VISIBLE) { mFlyout.animateUpdate(bubble.getFlyoutMessage(), mStackAnimationController.getStackPosition(), !bubble.showDot(), + bubble.getIconView().getDotCenter(), mAfterFlyoutHidden /* onHide */); } else { mFlyout.setVisibility(INVISIBLE); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java index ad9ebb2ef6ae..36e55bae18c3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitDecorManager.java @@ -137,14 +137,16 @@ public class SplitDecorManager extends WindowlessWindowManager { return; } - if (mIcon == null) { - // TODO: add fade-in animation. + if (mBackgroundLeash == null) { mBackgroundLeash = SurfaceUtils.makeColorLayer(mHostLeash, RESIZING_BACKGROUND_SURFACE_NAME, mSurfaceSession); t.setColor(mBackgroundLeash, getResizingBackgroundColor(resizingTask)) .setLayer(mBackgroundLeash, SPLIT_DIVIDER_LAYER - 1) .show(mBackgroundLeash); + } + if (mIcon == null && resizingTask.topActivityInfo != null) { + // TODO: add fade-in animation. mIcon = mIconProvider.getIcon(resizingTask.topActivityInfo); mResizingIconView.setImageDrawable(mIcon); mResizingIconView.setVisibility(View.VISIBLE); @@ -168,12 +170,16 @@ public class SplitDecorManager extends WindowlessWindowManager { return; } + if (mBackgroundLeash != null) { + t.remove(mBackgroundLeash); + mBackgroundLeash = null; + } + if (mIcon != null) { mResizingIconView.setVisibility(View.GONE); mResizingIconView.setImageDrawable(null); - t.remove(mBackgroundLeash).hide(mIconLeash); + t.hide(mIconLeash); mIcon = null; - mBackgroundLeash = null; } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java index 92a359891003..915c5939c34b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipDismissTargetHandler.java @@ -140,6 +140,7 @@ public class PipDismissTargetHandler implements ViewTreeObserver.OnPreDrawListen }); mMagnetizedPip = mMotionHelper.getMagnetizedPip(); + mMagnetizedPip.clearAllTargets(); mMagneticTarget = mMagnetizedPip.addTarget(mTargetView, 0); updateMagneticTargetSize(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 53681e6b268f..5d1d159e63e6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -367,6 +367,8 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, float splitRatio, RemoteAnimationAdapter adapter) { // Init divider first to make divider leash for remote animation target. setDividerVisibility(true /* visible */); + // Set false to avoid record new bounds with old task still on top; + mShouldUpdateRecents = false; final WindowContainerTransaction wct = new WindowContainerTransaction(); final WindowContainerTransaction evictWct = new WindowContainerTransaction(); prepareEvictChildTasks(SPLIT_POSITION_TOP_OR_LEFT, evictWct); @@ -393,6 +395,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationFinished() throws RemoteException { mIsDividerRemoteAnimating = false; + mShouldUpdateRecents = true; mSyncQueue.queue(evictWct); mSyncQueue.runInSync(t -> applyDividerVisibility(t)); finishedCallback.onAnimationFinished(); @@ -416,6 +419,7 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, @Override public void onAnimationCancelled() { mIsDividerRemoteAnimating = false; + mShouldUpdateRecents = true; mSyncQueue.queue(evictWct); mSyncQueue.runInSync(t -> applyDividerVisibility(t)); try { @@ -782,7 +786,9 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, mLogger.logSideStageAppChange(getSideStagePosition(), mSideStage.getTopChildTaskUid(), mSplitLayout.isLandscape()); } - updateRecentTasksSplitPair(); + if (present && visible) { + updateRecentTasksSplitPair(); + } for (int i = mListeners.size() - 1; i >= 0; --i) { mListeners.get(i).onTaskStageChanged(taskId, stage, visible); @@ -798,7 +804,6 @@ class StageCoordinator implements SplitLayout.SplitLayoutHandler, if (!mShouldUpdateRecents) { return; } - mRecentTasks.ifPresent(recentTasks -> { Rect topLeftBounds = mSplitLayout.getBounds1(); Rect bottomRightBounds = mSplitLayout.getBounds2(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskUnfoldController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskUnfoldController.java index e904f6a9e22c..4849163e96fd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskUnfoldController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskUnfoldController.java @@ -100,6 +100,9 @@ public class StageTaskUnfoldController implements UnfoldListener, OnInsetsChange * @param leash surface leash for the appeared task */ public void onTaskAppeared(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl leash) { + // Only handle child task surface here. + if (!taskInfo.hasParentTask()) return; + AnimationContext context = new AnimationContext(leash); mAnimationContextByTaskId.put(taskInfo.taskId, context); } @@ -109,6 +112,8 @@ public class StageTaskUnfoldController implements UnfoldListener, OnInsetsChange * @param taskInfo info for the vanished task */ public void onTaskVanished(ActivityManager.RunningTaskInfo taskInfo) { + if (!taskInfo.hasParentTask()) return; + AnimationContext context = mAnimationContextByTaskId.get(taskInfo.taskId); if (context != null) { final SurfaceControl.Transaction transaction = mTransactionPool.acquire(); diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 5d9f2909903b..6ff551a68c18 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -1317,7 +1317,7 @@ public class AudioSystem return DEVICE_OUT_BLE_SPEAKER_NAME; case DEVICE_OUT_DEFAULT: default: - return Integer.toString(device); + return "0x" + Integer.toHexString(device); } } diff --git a/media/packages/BluetoothMidiService/AndroidManifest.xml b/media/packages/BluetoothMidiService/AndroidManifest.xml index 03606bac6840..90390116df06 100644 --- a/media/packages/BluetoothMidiService/AndroidManifest.xml +++ b/media/packages/BluetoothMidiService/AndroidManifest.xml @@ -20,7 +20,7 @@ xmlns:tools="http://schemas.android.com/tools" package="com.android.bluetoothmidiservice" > - <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> + <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/> diff --git a/media/packages/BluetoothMidiService/AndroidManifestBase.xml b/media/packages/BluetoothMidiService/AndroidManifestBase.xml index bfb05469adb9..5a900c794dd1 100644 --- a/media/packages/BluetoothMidiService/AndroidManifestBase.xml +++ b/media/packages/BluetoothMidiService/AndroidManifestBase.xml @@ -19,7 +19,7 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.bluetoothmidiservice" > - <uses-sdk android:minSdkVersion="29" android:targetSdkVersion="29" /> + <uses-sdk android:minSdkVersion="30" android:targetSdkVersion="30" /> <application android:label="BluetoothMidi" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 048039f6af81..e429603fd6c4 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -189,7 +189,7 @@ <item msgid="3075292553049300105">"Normal"</item> <item msgid="1158955023692670059">"Ligera"</item> <item msgid="5664310435707146591">"Muy ligera"</item> - <item msgid="5491266922147715962">"A velocidad muy alta"</item> + <item msgid="5491266922147715962">"Muy rápida"</item> <item msgid="7659240015901486196">"Rápida"</item> <item msgid="7147051179282410945">"Muy rápida"</item> <item msgid="581904787661470707">"A velocidad máxima"</item> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index de974371ee86..808fbe9e2bf7 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -524,7 +524,7 @@ <string name="time_unit_just_now" msgid="3006134267292728099">"Oraintxe"</string> <string name="media_transfer_this_device_name" msgid="2716555073132169240">"Telefonoaren bozgorailua"</string> <string name="media_transfer_this_phone" msgid="7194341457812151531">"Telefono hau"</string> - <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazoren bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string> + <string name="profile_connect_timeout_subtext" msgid="4043408193005851761">"Arazo bat izan da konektatzean. Itzali gailua eta pitz ezazu berriro."</string> <string name="media_transfer_wired_device_name" msgid="4447880899964056007">"Audio-gailu kableduna"</string> <string name="help_label" msgid="3528360748637781274">"Laguntza eta iritziak"</string> <string name="storage_category" msgid="2287342585424631813">"Biltegiratzea"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 017de6a6d462..da9783ddd40e 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -192,7 +192,7 @@ <item msgid="5491266922147715962">"Nog sneller"</item> <item msgid="7659240015901486196">"Heel erg snel"</item> <item msgid="7147051179282410945">"Snelst"</item> - <item msgid="581904787661470707">"Allerallersnelst"</item> + <item msgid="581904787661470707">"Allersnelst"</item> </string-array> <string name="choose_profile" msgid="343803890897657450">"Profiel kiezen"</string> <string name="category_personal" msgid="6236798763159385225">"Persoonlijk"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java index 2b357c57b306..1e8cb9fc4622 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java @@ -38,6 +38,7 @@ import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; import android.text.style.ImageSpan; +import android.util.Log; import android.view.MenuItem; import android.widget.TextView; @@ -54,6 +55,7 @@ import java.util.List; public class RestrictedLockUtilsInternal extends RestrictedLockUtils { private static final String LOG_TAG = "RestrictedLockUtils"; + private static final boolean DEBUG = Log.isLoggable(LOG_TAG, Log.DEBUG); /** * @return drawables for displaying with settings that are locked by a device admin. @@ -92,14 +94,25 @@ public class RestrictedLockUtilsInternal extends RestrictedLockUtils { } final UserManager um = UserManager.get(context); + final UserHandle userHandle = UserHandle.of(userId); final List<UserManager.EnforcingUser> enforcingUsers = - um.getUserRestrictionSources(userRestriction, UserHandle.of(userId)); + um.getUserRestrictionSources(userRestriction, userHandle); if (enforcingUsers.isEmpty()) { // Restriction is not enforced. return null; - } else if (enforcingUsers.size() > 1) { - return EnforcedAdmin.createDefaultEnforcedAdminWithRestriction(userRestriction); + } + final int size = enforcingUsers.size(); + if (size > 1) { + final EnforcedAdmin enforcedAdmin = EnforcedAdmin + .createDefaultEnforcedAdminWithRestriction(userRestriction); + enforcedAdmin.user = userHandle; + if (DEBUG) { + Log.d(LOG_TAG, "Multiple (" + size + ") enforcing users for restriction '" + + userRestriction + "' on user " + userHandle + "; returning default admin " + + "(" + enforcedAdmin + ")"); + } + return enforcedAdmin; } final int restrictionSource = enforcingUsers.get(0).getUserRestrictionSource(); diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiRestrictionsCache.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiRestrictionsCache.java new file mode 100644 index 000000000000..7ffae4094add --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiRestrictionsCache.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2021 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 com.android.settingslib.wifi; + +import static android.os.UserManager.DISALLOW_CONFIG_WIFI; + +import android.annotation.NonNull; +import android.content.Context; +import android.os.Bundle; +import android.os.UserManager; +import android.util.SparseArray; + +import androidx.annotation.VisibleForTesting; + +import java.util.HashMap; +import java.util.Map; + +/** + * This is a singleton class for Wi-Fi restrictions caching. + */ +public class WifiRestrictionsCache { + private static final String TAG = "WifiResCache"; + + /** + * Manages mapping between user ID and corresponding singleton {@link WifiRestrictionsCache} + * object. + */ + @VisibleForTesting + protected static final SparseArray<WifiRestrictionsCache> sInstances = new SparseArray<>(); + + @VisibleForTesting + protected UserManager mUserManager; + @VisibleForTesting + protected Bundle mUserRestrictions; + @VisibleForTesting + protected final Map<String, Boolean> mRestrictions = new HashMap<>(); + + /** + * @return an instance of {@link WifiRestrictionsCache} object. + */ + @NonNull + public static WifiRestrictionsCache getInstance(@NonNull Context context) { + final int requestUserId = context.getUserId(); + WifiRestrictionsCache cache; + synchronized (sInstances) { + // We have same user context as request. + if (sInstances.indexOfKey(requestUserId) >= 0) { + return sInstances.get(requestUserId); + } + // Request by a new user context. + cache = new WifiRestrictionsCache(context); + sInstances.put(context.getUserId(), cache); + } + return cache; + } + + /** + * Removes all the instances. + */ + public static void clearInstance() { + synchronized (sInstances) { + for (int i = 0; i < sInstances.size(); i++) { + int key = sInstances.keyAt(i); + WifiRestrictionsCache cache = sInstances.get(key); + cache.clearRestrictions(); + sInstances.remove(key); + } + sInstances.clear(); + } + } + + /** + * Constructor to create a singleton class for Wi-Fi restrictions cache. + * + * @param context The Context this is associated with. + */ + protected WifiRestrictionsCache(@NonNull Context context) { + mUserManager = context.getSystemService(UserManager.class); + if (mUserManager != null) { + mUserRestrictions = mUserManager.getUserRestrictions(); + } + } + + /** + * @return the boolean value of the restrictions + */ + public Boolean getRestriction(String key) { + if (mUserRestrictions == null) { + return false; + } + Boolean restriction; + synchronized (mRestrictions) { + if (mRestrictions.containsKey(key)) { + return mRestrictions.get(key); + } + restriction = mUserRestrictions.getBoolean(key); + mRestrictions.put(key, restriction); + } + return restriction; + } + + /** + * Removes all the restrictions. + */ + public void clearRestrictions() { + synchronized (mRestrictions) { + mRestrictions.clear(); + } + } + + /** + * @return Whether the user is allowed to config Wi-Fi. + */ + public Boolean isConfigWifiAllowed() { + return !getRestriction(DISALLOW_CONFIG_WIFI); + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiRestrictionsCacheTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiRestrictionsCacheTest.java new file mode 100644 index 000000000000..404e0e88c34f --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/wifi/WifiRestrictionsCacheTest.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2021 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 com.android.settingslib.wifi; + +import static android.os.UserManager.DISALLOW_CONFIG_WIFI; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.os.Bundle; +import android.os.UserManager; + +import androidx.test.core.app.ApplicationProvider; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class WifiRestrictionsCacheTest { + + private static final int USER_OWNER = 0; + private static final int USER_1 = 1; + private static final int USER_2 = 2; + private static final int USER_3 = 3; + private static final int USER_GUEST = 10; + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule(); + @Mock + UserManager mUserManager; + @Mock + Bundle mUserRestrictionsOwner; + @Mock + Bundle mUserRestrictionsGuest; + + private Context mContext; + private WifiRestrictionsCache mWifiRestrictionsCacheOwner; + private WifiRestrictionsCache mWifiRestrictionsCacheGuest; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(UserManager.class)).thenReturn(mUserManager); + + when(mContext.getUserId()).thenReturn(USER_OWNER); + when(mUserManager.getUserRestrictions()).thenReturn(mUserRestrictionsOwner); + when(mUserRestrictionsOwner.getBoolean(anyString())).thenReturn(false); + mWifiRestrictionsCacheOwner = WifiRestrictionsCache.getInstance(mContext); + + when(mContext.getUserId()).thenReturn(USER_GUEST); + when(mUserManager.getUserRestrictions()).thenReturn(mUserRestrictionsGuest); + when(mUserRestrictionsGuest.getBoolean(anyString())).thenReturn(true); + mWifiRestrictionsCacheGuest = WifiRestrictionsCache.getInstance(mContext); + } + + @After + public void tearDown() { + WifiRestrictionsCache.clearInstance(); + } + + @Test + public void getInstance_sameUserId_sameInstance() { + when(mContext.getUserId()).thenReturn(USER_OWNER); + WifiRestrictionsCache instance1 = WifiRestrictionsCache.getInstance(mContext); + + WifiRestrictionsCache instance2 = WifiRestrictionsCache.getInstance(mContext); + + assertThat(instance1).isEqualTo(instance2); + } + + @Test + public void getInstance_diffUserId_diffInstance() { + when(mContext.getUserId()).thenReturn(USER_OWNER); + WifiRestrictionsCache instance1 = WifiRestrictionsCache.getInstance(mContext); + + when(mContext.getUserId()).thenReturn(USER_GUEST); + WifiRestrictionsCache instance2 = WifiRestrictionsCache.getInstance(mContext); + + assertThat(instance1).isNotEqualTo(instance2); + } + + @Test + public void clearInstance_instanceShouldBeEmpty() { + WifiRestrictionsCache.clearInstance(); + + assertThat(WifiRestrictionsCache.sInstances.size()).isEqualTo(0); + } + + @Test + public void getRestriction_firstTime_getFromSystem() { + Bundle userRestrictions = mock(Bundle.class); + WifiRestrictionsCache wifiRestrictionsCache = mockInstance(USER_1, userRestrictions); + + wifiRestrictionsCache.getRestriction(DISALLOW_CONFIG_WIFI); + + verify(userRestrictions).getBoolean(DISALLOW_CONFIG_WIFI); + } + + @Test + public void getRestriction_secondTime_notGetFromSystem() { + Bundle userRestrictions = mock(Bundle.class); + WifiRestrictionsCache wifiRestrictionsCache = mockInstance(USER_2, userRestrictions); + // First time to get the restriction value + wifiRestrictionsCache.getRestriction(DISALLOW_CONFIG_WIFI); + reset(userRestrictions); + + // Second time to get the restriction value + wifiRestrictionsCache.getRestriction(DISALLOW_CONFIG_WIFI); + + verify(userRestrictions, never()).getBoolean(DISALLOW_CONFIG_WIFI); + } + + @Test + public void clearRestrictions_shouldGetRestrictionFromSystemAgain() { + Bundle userRestrictions = mock(Bundle.class); + WifiRestrictionsCache wifiRestrictionsCache = mockInstance(USER_3, userRestrictions); + // First time to get the restriction value + wifiRestrictionsCache.getRestriction(DISALLOW_CONFIG_WIFI); + reset(userRestrictions); + + // Clear the cache and then second time to get the restriction value + wifiRestrictionsCache.clearRestrictions(); + wifiRestrictionsCache.getRestriction(DISALLOW_CONFIG_WIFI); + + verify(userRestrictions).getBoolean(DISALLOW_CONFIG_WIFI); + } + + @Test + public void isConfigWifiAllowed_ownerUser_returnTrue() { + assertThat(mWifiRestrictionsCacheOwner.isConfigWifiAllowed()).isTrue(); + } + + @Test + public void isConfigWifiAllowed_guestUser_returnFalse() { + assertThat(mWifiRestrictionsCacheGuest.isConfigWifiAllowed()).isFalse(); + } + + private WifiRestrictionsCache mockInstance(int userId, Bundle userRestrictions) { + when(mContext.getUserId()).thenReturn(userId); + when(mUserManager.getUserRestrictions()).thenReturn(userRestrictions); + return WifiRestrictionsCache.getInstance(mContext); + } +} diff --git a/packages/SystemUI/res-product/values-zu/strings.xml b/packages/SystemUI/res-product/values-zu/strings.xml index e6c140a76bdf..8b79a22a72a9 100644 --- a/packages/SystemUI/res-product/values-zu/strings.xml +++ b/packages/SystemUI/res-product/values-zu/strings.xml @@ -40,7 +40,7 @@ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4682221342671290678">"Uzame ngokungalungile ukuvula ifoni izikhathi ezingu-<xliff:g id="NUMBER">%d</xliff:g>. Iphrofayela yomsebenzi izosuswa, okuzosusa yonke idatha yephrofayela."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="1860049973474855672">"Udwebe ngokungalungile iphethini yakho yokuvula ngezikhathi ezingu-<xliff:g id="NUMBER_0">%1$d</xliff:g>. Ngemuva kwemizamo engaphumelelanga kaningi engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuthi uvule ithebulethi yakho usebenzisa i-akhawunti ye-imeyili.\n\nZama futhi kumasekhondi angu-<xliff:g id="NUMBER_2">%3$d</xliff:g>."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="44112553371516141">"Ukulayisha ungenisa iphathini yakho yokuvula ngendlela engalungile izikhathi ezi-<xliff:g id="NUMBER_0">%1$d</xliff:g> Emva kweminye imizamo engu-<xliff:g id="NUMBER_1">%2$d</xliff:g>, uzocelwa ukuvula ifoni yakho usebenzisa ukungena ngemvume ku-Google\n\n Zame futhi emumva kwengu- <xliff:g id="NUMBER_2">%3$d</xliff:g> imizuzwana."</string> - <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Vula ifoni yakho ukuthola izinketho ezengeziwe"</string> - <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Vula ithebulethi yakho ukuthola izinketho ezengeziwe"</string> - <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Vula idivayisi yakho ukuthola izinketho ezengeziwe"</string> + <string name="global_action_lock_message" product="default" msgid="7092460751050168771">"Vula ifoni yakho ukuthola okunye okungakhethwa"</string> + <string name="global_action_lock_message" product="tablet" msgid="1024230056230539493">"Vula ithebulethi yakho ukuthola okunye okungakhethwa"</string> + <string name="global_action_lock_message" product="device" msgid="3165224897120346096">"Vula idivayisi yakho ukuthola okunye okungakhethwa"</string> </resources> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index e82e8f53dc23..3c18a81392c2 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -852,7 +852,7 @@ <string name="new_notification_image_content_description" msgid="6017506886810813123">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak irudi bat bidali du"</string> <string name="new_status_content_description" msgid="6046637888641308327">"<xliff:g id="NAME">%1$s</xliff:g> erabiltzaileak egoera eguneratu du: <xliff:g id="STATUS">%2$s</xliff:g>"</string> <string name="person_available" msgid="2318599327472755472">"Konektatuta"</string> - <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat gertatu da bateria-neurgailua irakurtzean"</string> + <string name="battery_state_unknown_notification_title" msgid="8464703640483773454">"Arazo bat izan da bateria-neurgailua irakurtzean"</string> <string name="battery_state_unknown_notification_text" msgid="13720937839460899">"Informazio gehiago lortzeko, sakatu hau"</string> <string name="qs_alarm_tile_no_alarm" msgid="4826472008616807923">"Ez da ezarri alarmarik"</string> <string name="accessibility_fingerprint_label" msgid="5255731221854153660">"Hatz-marken sentsorea"</string> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index e8c30e1e8c5f..bffa966f8590 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -647,7 +647,7 @@ <string name="accessibility_quick_settings_settings" msgid="7098489591715844713">"సెట్టింగ్లను తెరవండి."</string> <string name="accessibility_quick_settings_expand" msgid="2609275052412521467">"శీఘ్ర సెట్టింగ్లను తెరవండి."</string> <string name="accessibility_quick_settings_collapse" msgid="4674876336725041982">"శీఘ్ర సెట్టింగ్లను మూసివేయండి."</string> - <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> వలె సైన్ ఇన్ చేశారు"</string> + <string name="accessibility_quick_settings_user" msgid="505821942882668619">"<xliff:g id="ID_1">%s</xliff:g> లాగా సైన్ ఇన్ చేశారు"</string> <string name="accessibility_quick_settings_choose_user_action" msgid="4554388498186576087">"యూజర్ను ఎంపిక చేయండి"</string> <string name="data_connection_no_internet" msgid="691058178914184544">"ఇంటర్నెట్ లేదు"</string> <string name="accessibility_quick_settings_open_details" msgid="4879279912389052142">"వివరాలను తెరవండి."</string> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java index 30db13611f4a..2583e096e3c7 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteAnimationTargetCompat.java @@ -278,7 +278,9 @@ public class RemoteAnimationTargetCompat { * @see SurfaceControl#release() */ public void release() { - leash.mSurfaceControl.release(); + if (leash.mSurfaceControl != null) { + leash.mSurfaceControl.release(); + } if (mStartLeash != null) { mStartLeash.release(); } diff --git a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt index 977e46ac3b44..d2ded71487dc 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManager.kt @@ -131,6 +131,12 @@ class ControlsProviderLifecycleManager( wrapper = null bindService(false) } + + override fun onNullBinding(name: ComponentName?) { + if (DEBUG) Log.d(TAG, "onNullBinding $name") + wrapper = null + context.unbindService(this) + } } private fun handlePendingServiceMethods() { diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java new file mode 100644 index 000000000000..08d969b5eb77 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LSShadeTransitionLog.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2022 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 com.android.systemui.log.dagger; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import com.android.systemui.log.LogBuffer; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import javax.inject.Qualifier; + +/** A {@link LogBuffer} for lockscreen to shade transition events. */ +@Qualifier +@Documented +@Retention(RUNTIME) +public @interface LSShadeTransitionLog { +} diff --git a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java index 1f0de4e10d05..64911affd985 100644 --- a/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java +++ b/packages/SystemUI/src/com/android/systemui/log/dagger/LogModule.java @@ -52,6 +52,14 @@ public class LogModule { return factory.create("NotifLog", 1000); } + /** Provides a logging buffer for all logs for lockscreen to shade transition events. */ + @Provides + @SysUISingleton + @LSShadeTransitionLog + public static LogBuffer provideLSShadeTransitionControllerBuffer(LogBufferFactory factory) { + return factory.create("LSShadeTransitionLog", 50); + } + /** Provides a logging buffer for all logs related to managing notification sections. */ @Provides @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 963576bc7dc2..d4acdd05f218 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -228,6 +228,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private @Behavior int mBehavior; private boolean mTransientShown; + private boolean mTransientShownFromGestureOnSystemBar; private int mNavBarMode = NAV_BAR_MODE_3BUTTON; private LightBarController mLightBarController; private final LightBarController mMainLightBarController; @@ -872,6 +873,9 @@ public class NavigationBar implements View.OnAttachStateChangeListener, + windowStateToString(mNavigationBarWindowState)); pw.println(" mNavigationBarMode=" + BarTransitions.modeToString(mNavigationBarMode)); + pw.println(" mTransientShown=" + mTransientShown); + pw.println(" mTransientShownFromGestureOnSystemBar=" + + mTransientShownFromGestureOnSystemBar); dumpBarTransitions(pw, "mNavigationBarView", mNavigationBarView.getBarTransitions()); mNavigationBarView.dump(pw); } @@ -990,7 +994,8 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } @Override - public void showTransient(int displayId, @InternalInsetsType int[] types) { + public void showTransient(int displayId, @InternalInsetsType int[] types, + boolean isGestureOnSystemBar) { if (displayId != mDisplayId) { return; } @@ -999,6 +1004,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } if (!mTransientShown) { mTransientShown = true; + mTransientShownFromGestureOnSystemBar = isGestureOnSystemBar; handleTransientChanged(); } } @@ -1017,12 +1023,14 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private void clearTransient() { if (mTransientShown) { mTransientShown = false; + mTransientShownFromGestureOnSystemBar = false; handleTransientChanged(); } } private void handleTransientChanged() { - mNavigationBarView.onTransientStateChanged(mTransientShown); + mNavigationBarView.onTransientStateChanged(mTransientShown, + mTransientShownFromGestureOnSystemBar); final int barMode = barMode(mTransientShown, mAppearance); if (updateBarMode(barMode) && mLightBarController != null) { mLightBarController.onNavigationBarModeChanged(barMode); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 7adb7ac92dc1..5fbdd88b9f66 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -447,12 +447,17 @@ public class NavigationBarView extends FrameLayout implements mRegionSamplingHelper.setWindowHasBlurs(hasBlurs); } - void onTransientStateChanged(boolean isTransient) { + void onTransientStateChanged(boolean isTransient, boolean isGestureOnSystemBar) { mEdgeBackGestureHandler.onNavBarTransientStateChanged(isTransient); // The visibility of the navigation bar buttons is dependent on the transient state of // the navigation bar. if (mNavBarOverlayController.isNavigationBarOverlayEnabled()) { + // Always allow the overlay if in non-gestural nav mode, otherwise, only allow showing + // the overlay if the user is swiping directly over a system bar + boolean allowNavBarOverlay = !QuickStepContract.isGesturalMode(mNavBarMode) + || isGestureOnSystemBar; + isTransient = isTransient && allowNavBarOverlay; mNavBarOverlayController.setButtonState(isTransient, /* force */ false); } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index feda99fd3471..c3f1b1109ad3 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -350,7 +350,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks, } @Override - public void showTransient(int displayId, int[] types) { + public void showTransient(int displayId, int[] types, boolean isGestureOnSystemBar) { if (displayId != mDisplayId) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 5876703a800e..0b06b35b75d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -343,11 +343,19 @@ public class CommandQueue extends IStatusBar.Stub implements String packageName) { } /** - * @see IStatusBar#showTransient(int, int[]). + * @see IStatusBar#showTransient(int, int[], boolean). */ default void showTransient(int displayId, @InternalInsetsType int[] types) { } /** + * @see IStatusBar#showTransient(int, int[], boolean). + */ + default void showTransient(int displayId, @InternalInsetsType int[] types, + boolean isGestureOnSystemBar) { + showTransient(displayId, types); + } + + /** * @see IStatusBar#abortTransient(int, int[]). */ default void abortTransient(int displayId, @InternalInsetsType int[] types) { } @@ -1019,9 +1027,10 @@ public class CommandQueue extends IStatusBar.Stub implements } @Override - public void showTransient(int displayId, int[] types) { + public void showTransient(int displayId, int[] types, boolean isGestureOnSystemBar) { synchronized (mLock) { - mHandler.obtainMessage(MSG_SHOW_TRANSIENT, displayId, 0, types).sendToTarget(); + mHandler.obtainMessage(MSG_SHOW_TRANSIENT, displayId, isGestureOnSystemBar ? 1 : 0, + types).sendToTarget(); } } @@ -1404,8 +1413,9 @@ public class CommandQueue extends IStatusBar.Stub implements case MSG_SHOW_TRANSIENT: { final int displayId = msg.arg1; final int[] types = (int[]) msg.obj; + final boolean isGestureOnSystemBar = msg.arg2 != 0; for (int i = 0; i < mCallbacks.size(); i++) { - mCallbacks.get(i).showTransient(displayId, types); + mCallbacks.get(i).showTransient(displayId, types, isGestureOnSystemBar); } break; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt index 0fb08e403483..029415bad5bb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LockscreenShadeTransitionController.kt @@ -8,12 +8,13 @@ import android.content.Context import android.content.res.Configuration import android.os.SystemClock import android.util.DisplayMetrics +import android.util.IndentingPrintWriter import android.util.MathUtils import android.view.MotionEvent import android.view.View import android.view.ViewConfiguration import androidx.annotation.VisibleForTesting -import com.android.internal.logging.nano.MetricsProto.MetricsEvent +import com.android.systemui.Dumpable import com.android.systemui.ExpandHelper import com.android.systemui.Gefingerpoken import com.android.systemui.R @@ -22,23 +23,26 @@ import com.android.systemui.biometrics.UdfpsKeyguardViewController import com.android.systemui.classifier.Classifier import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dump.DumpManager import com.android.systemui.media.MediaHierarchyManager import com.android.systemui.plugins.ActivityStarter.OnDismissAction import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QS +import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.notification.stack.AmbientState import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.phone.KeyguardBypassController -import com.android.systemui.statusbar.phone.LockscreenGestureLogger -import com.android.systemui.statusbar.phone.LockscreenGestureLogger.LockscreenUiEvent +import com.android.systemui.statusbar.phone.LSShadeTransitionLogger import com.android.systemui.statusbar.phone.NotificationPanelViewController import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.StatusBar import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.Utils +import java.io.FileDescriptor +import java.io.PrintWriter import javax.inject.Inject private const val SPRING_BACK_ANIMATION_LENGTH_MS = 375L @@ -51,19 +55,19 @@ private const val RUBBERBAND_FACTOR_EXPANDABLE = 0.5f @SysUISingleton class LockscreenShadeTransitionController @Inject constructor( private val statusBarStateController: SysuiStatusBarStateController, - private val lockscreenGestureLogger: LockscreenGestureLogger, + private val logger: LSShadeTransitionLogger, private val keyguardBypassController: KeyguardBypassController, private val lockScreenUserManager: NotificationLockscreenUserManager, private val falsingCollector: FalsingCollector, private val ambientState: AmbientState, - private val displayMetrics: DisplayMetrics, private val mediaHierarchyManager: MediaHierarchyManager, private val scrimController: ScrimController, private val depthController: NotificationShadeDepthController, private val context: Context, configurationController: ConfigurationController, - falsingManager: FalsingManager -) { + falsingManager: FalsingManager, + dumpManager: DumpManager, +) : Dumpable { private var pulseHeight: Float = 0f private var useSplitShade: Boolean = false private lateinit var nsslController: NotificationStackScrollLayoutController @@ -139,6 +143,23 @@ class LockscreenShadeTransitionController @Inject constructor( touchHelper.updateResources(context) } }) + dumpManager.registerDumpable(this) + statusBarStateController.addCallback(object : StatusBarStateController.StateListener { + override fun onExpandedChanged(isExpanded: Boolean) { + // safeguard: When the panel is fully collapsed, let's make sure to reset. + // See b/198098523 + if (!isExpanded) { + if (dragDownAmount != 0f && dragDownAnimator?.isRunning != true) { + logger.logDragDownAmountResetWhenFullyCollapsed() + dragDownAmount = 0f + } + if (pulseHeight != 0f && pulseHeightAnimator?.isRunning != true) { + logger.logPulseHeightNotResetWhenFullyCollapsed() + setPulseHeight(0f, animate = false) + } + } + } + }) } private fun updateResources() { @@ -182,19 +203,19 @@ class LockscreenShadeTransitionController @Inject constructor( */ internal fun onDraggedDown(startingChild: View?, dragLengthY: Int) { if (canDragDown()) { + val cancelRunnable = Runnable { + logger.logGoingToLockedShadeAborted() + setDragDownAmountAnimated(0f) + } if (nsslController.isInLockedDownShade()) { + logger.logDraggedDownLockDownShade(startingChild) statusBarStateController.setLeaveOpenOnKeyguardHide(true) statusbar.dismissKeyguardThenExecute(OnDismissAction { nextHideKeyguardNeedsNoAnimation = true false - }, - null /* cancelRunnable */, false /* afterKeyguardGone */) + }, cancelRunnable, false /* afterKeyguardGone */) } else { - lockscreenGestureLogger.write( - MetricsEvent.ACTION_LS_SHADE, - (dragLengthY / displayMetrics.density).toInt(), - 0 /* velocityDp */) - lockscreenGestureLogger.log(LockscreenUiEvent.LOCKSCREEN_PULL_SHADE_OPEN) + logger.logDraggedDown(startingChild, dragLengthY) if (!ambientState.isDozing() || startingChild != null) { // go to locked shade while animating the drag down amount from its current // value @@ -216,11 +237,11 @@ class LockscreenShadeTransitionController @Inject constructor( dragDownAmount = 0f forceApplyAmount = false } - val cancelRunnable = Runnable { setDragDownAmountAnimated(0f) } goToLockedShadeInternal(startingChild, animationHandler, cancelRunnable) } } } else { + logger.logUnSuccessfulDragDown(startingChild) setDragDownAmountAnimated(0f) } } @@ -229,6 +250,7 @@ class LockscreenShadeTransitionController @Inject constructor( * Called by the touch helper when the drag down was aborted and should be reset. */ internal fun onDragDownReset() { + logger.logDragDownAborted() nsslController.setDimmed(true /* dimmed */, true /* animated */) nsslController.resetScrollPosition() nsslController.resetCheckSnoozeLeavebehind() @@ -246,10 +268,16 @@ class LockscreenShadeTransitionController @Inject constructor( /** * Called by the touch helper when the drag down was started */ - internal fun onDragDownStarted() { + internal fun onDragDownStarted(startingChild: ExpandableView?) { + logger.logDragDownStarted(startingChild) nsslController.cancelLongPress() nsslController.checkSnoozeLeavebehind() - dragDownAnimator?.cancel() + dragDownAnimator?.apply { + if (isRunning) { + logger.logAnimationCancelled(isPulse = false) + cancel() + } + } } /** @@ -294,7 +322,7 @@ class LockscreenShadeTransitionController @Inject constructor( set(value) { if (field != value || forceApplyAmount) { field = value - if (!nsslController.isInLockedDownShade() || forceApplyAmount) { + if (!nsslController.isInLockedDownShade() || field == 0f || forceApplyAmount) { nsslController.setTransitionToFullShadeAmount(field) notificationPanelController.setTransitionToFullShadeAmount(field, false /* animate */, 0 /* delay */) @@ -322,6 +350,7 @@ class LockscreenShadeTransitionController @Inject constructor( delay: Long = 0, endlistener: (() -> Unit)? = null ) { + logger.logDragDownAnimation(target) val dragDownAnimator = ValueAnimator.ofFloat(dragDownAmount, target) dragDownAnimator.interpolator = Interpolators.FAST_OUT_SLOW_IN dragDownAnimator.duration = SPRING_BACK_ANIMATION_LENGTH_MS @@ -377,7 +406,9 @@ class LockscreenShadeTransitionController @Inject constructor( */ @JvmOverloads fun goToLockedShade(expandedView: View?, needsQSAnimation: Boolean = true) { - if (statusBarStateController.state == StatusBarState.KEYGUARD) { + val isKeyguard = statusBarStateController.state == StatusBarState.KEYGUARD + logger.logTryGoToLockedShade(isKeyguard) + if (isKeyguard) { val animationHandler: ((Long) -> Unit)? if (needsQSAnimation) { // Let's use the default animation @@ -413,6 +444,7 @@ class LockscreenShadeTransitionController @Inject constructor( ) { if (statusbar.isShadeDisabled) { cancelAction?.run() + logger.logShadeDisabledOnGoToLockedShade() return } var userId: Int = lockScreenUserManager.getCurrentUserId() @@ -451,9 +483,11 @@ class LockscreenShadeTransitionController @Inject constructor( } cancelAction?.run() } + logger.logShowBouncerOnGoToLockedShade() statusbar.showBouncerWithDimissAndCancelIfKeyguard(onDismissAction, cancelHandler) draggedDownEntry = entry } else { + logger.logGoingToLockedShade(animationHandler != null) statusBarStateController.setState(StatusBarState.SHADE_LOCKED) // This call needs to be after updating the shade state since otherwise // the scrimstate resets too early @@ -473,6 +507,7 @@ class LockscreenShadeTransitionController @Inject constructor( * @param previousState which state were we in when we hid the keyguard? */ fun onHideKeyguard(delay: Long, previousState: Int) { + logger.logOnHideKeyguard() if (animationHandlerOnKeyguardDismiss != null) { animationHandlerOnKeyguardDismiss!!.invoke(delay) animationHandlerOnKeyguardDismiss = null @@ -495,6 +530,7 @@ class LockscreenShadeTransitionController @Inject constructor( * not triggered by gestures, e.g. when clicking on the shelf or expand button. */ private fun performDefaultGoToFullShadeAnimation(delay: Long) { + logger.logDefaultGoToFullShadeAnimation(delay) notificationPanelController.animateToFullShade(delay) animateAppear(delay) } @@ -531,6 +567,7 @@ class LockscreenShadeTransitionController @Inject constructor( * @param cancelled was the interaction cancelled and this is a reset? */ fun finishPulseAnimation(cancelled: Boolean) { + logger.logPulseExpansionFinished(cancelled) if (cancelled) { setPulseHeight(0f, animate = true) } else { @@ -543,7 +580,27 @@ class LockscreenShadeTransitionController @Inject constructor( * Notify this class that a pulse expansion is starting */ fun onPulseExpansionStarted() { - pulseHeightAnimator?.cancel() + logger.logPulseExpansionStarted() + pulseHeightAnimator?.apply { + if (isRunning) { + logger.logAnimationCancelled(isPulse = true) + cancel() + } + } + } + + override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { + IndentingPrintWriter(pw, " ").let { + it.println("LSShadeTransitionController:") + it.increaseIndent() + it.println("pulseHeight: $pulseHeight") + it.println("useSplitShade: $useSplitShade") + it.println("dragDownAmount: $dragDownAmount") + it.println("isDragDownAnywhereEnabled: $isDragDownAnywhereEnabled") + it.println("isFalsingCheckNeeded: $isFalsingCheckNeeded") + it.println("hasPendingHandlerOnKeyguardDismiss: " + + "${animationHandlerOnKeyguardDismiss != null}") + } } } @@ -623,7 +680,7 @@ class DragDownHelper( captureStartingChild(initialTouchX, initialTouchY) initialTouchY = y initialTouchX = x - dragDownCallback.onDragDownStarted() + dragDownCallback.onDragDownStarted(startingChild) dragDownAmountOnStart = dragDownCallback.dragDownAmount return startingChild != null || dragDownCallback.isDragDownAnywhereEnabled } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt index 761a20326200..ea51bd89df42 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/PulseExpansionHandler.kt @@ -24,15 +24,18 @@ import android.content.res.Configuration import android.os.PowerManager import android.os.PowerManager.WAKE_REASON_GESTURE import android.os.SystemClock +import android.util.IndentingPrintWriter import android.view.MotionEvent import android.view.VelocityTracker import android.view.ViewConfiguration +import com.android.systemui.Dumpable import com.android.systemui.Gefingerpoken import com.android.systemui.R import com.android.systemui.animation.Interpolators import com.android.systemui.classifier.Classifier.NOTIFICATION_DRAG_DOWN import com.android.systemui.classifier.FalsingCollector import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator @@ -43,6 +46,8 @@ import com.android.systemui.statusbar.notification.stack.NotificationStackScroll import com.android.systemui.statusbar.phone.HeadsUpManagerPhone import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController +import java.io.FileDescriptor +import java.io.PrintWriter import javax.inject.Inject import kotlin.math.max @@ -61,8 +66,9 @@ constructor( private val statusBarStateController: StatusBarStateController, private val falsingManager: FalsingManager, private val lockscreenShadeTransitionController: LockscreenShadeTransitionController, - private val falsingCollector: FalsingCollector -) : Gefingerpoken { + private val falsingCollector: FalsingCollector, + dumpManager: DumpManager +) : Gefingerpoken, Dumpable { companion object { private val SPRING_BACK_ANIMATION_LENGTH_MS = 375 } @@ -120,6 +126,7 @@ constructor( } }) mPowerManager = context.getSystemService(PowerManager::class.java) + dumpManager.registerDumpable(this) } private fun initResources(context: Context) { @@ -329,4 +336,17 @@ constructor( fun onStartedWakingUp() { isWakingToShadeLocked = false } + + override fun dump(fd: FileDescriptor, pw: PrintWriter, args: Array<out String>) { + IndentingPrintWriter(pw, " ").let { + it.println("PulseExpansionHandler:") + it.increaseIndent() + it.println("isExpanding: $isExpanding") + it.println("leavingLockscreen: $leavingLockscreen") + it.println("mPulsing: $mPulsing") + it.println("isWakingToShadeLocked: $isWakingToShadeLocked") + it.println("qsExpanded: $qsExpanded") + it.println("bouncerShowing: $bouncerShowing") + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java index ad1c23283912..98b5dcc25730 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java @@ -645,7 +645,7 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp if (biometricSourceType.equals(BiometricSourceType.FINGERPRINT) && mUpdateMonitor.isUdfpsSupported() && mNumConsecutiveFpFailures >= FP_ATTEMPTS_BEFORE_SHOW_BOUNCER) { - mKeyguardViewController.showBouncer(true); + startWakeAndUnlock(MODE_SHOW_BOUNCER); UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN); mNumConsecutiveFpFailures = 0; } @@ -668,7 +668,8 @@ public class BiometricUnlockController extends KeyguardUpdateMonitorCallback imp && mUpdateMonitor.isUdfpsSupported() && (mStatusBarStateController.getState() == StatusBarState.SHADE || mStatusBarStateController.getState() == StatusBarState.SHADE_LOCKED)) { - mKeyguardViewController.showBouncer(true); + startWakeAndUnlock(MODE_SHOW_BOUNCER); + UI_EVENT_LOGGER.log(BiometricUiEvent.BIOMETRIC_BOUNCER_SHOWN); } cleanup(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt new file mode 100644 index 000000000000..868efa027f40 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LSShadeTransitionLogger.kt @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2022 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 com.android.systemui.statusbar.phone + +import android.util.DisplayMetrics +import android.view.View +import com.android.internal.logging.nano.MetricsProto.MetricsEvent +import com.android.systemui.log.LogBuffer +import com.android.systemui.log.LogLevel +import com.android.systemui.log.dagger.LSShadeTransitionLog +import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow +import com.android.systemui.statusbar.notification.row.ExpandableView +import javax.inject.Inject + +private const val TAG = "LockscreenShadeTransitionController" + +class LSShadeTransitionLogger @Inject constructor( + @LSShadeTransitionLog private val buffer: LogBuffer, + private val lockscreenGestureLogger: LockscreenGestureLogger, + private val displayMetrics: DisplayMetrics +) { + fun logUnSuccessfulDragDown(startingChild: View?) { + val entry = (startingChild as? ExpandableNotificationRow)?.entry + buffer.log(TAG, LogLevel.INFO, { + str1 = entry?.key ?: "no entry" + }, { + "Tried to drag down but can't drag down on $str1" + }) + } + + fun logDragDownAborted() { + buffer.log(TAG, LogLevel.INFO, {}, { + "The drag down was reset" + }) + } + + fun logDragDownStarted(startingChild: ExpandableView?) { + val entry = (startingChild as? ExpandableNotificationRow)?.entry + buffer.log(TAG, LogLevel.INFO, { + str1 = entry?.key ?: "no entry" + }, { + "The drag down has started on $str1" + }) + } + + fun logDraggedDownLockDownShade(startingChild: View?) { + val entry = (startingChild as? ExpandableNotificationRow)?.entry + buffer.log(TAG, LogLevel.INFO, { + str1 = entry?.key ?: "no entry" + }, { + "Dragged down in locked down shade on $str1" + }) + } + + fun logDraggedDown(startingChild: View?, dragLengthY: Int) { + val entry = (startingChild as? ExpandableNotificationRow)?.entry + buffer.log(TAG, LogLevel.INFO, { + str1 = entry?.key ?: "no entry" + }, { + "Drag down succeeded on $str1" + }) + // Do logging to event log not just our own buffer + lockscreenGestureLogger.write( + MetricsEvent.ACTION_LS_SHADE, + (dragLengthY / displayMetrics.density).toInt(), + 0 /* velocityDp */) + lockscreenGestureLogger.log( + LockscreenGestureLogger.LockscreenUiEvent.LOCKSCREEN_PULL_SHADE_OPEN) + } + + fun logDefaultGoToFullShadeAnimation(delay: Long) { + buffer.log(TAG, LogLevel.DEBUG, { + long1 = delay + }, { + "Default animation started to full shade with delay $long1" + }) + } + + fun logTryGoToLockedShade(keyguard: Boolean) { + buffer.log(TAG, LogLevel.INFO, { + bool1 = keyguard + }, { + "Trying to go to locked shade " + if (bool1) "from keyguard" else "not from keyguard" + }) + } + + fun logShadeDisabledOnGoToLockedShade() { + buffer.log(TAG, LogLevel.WARNING, {}, { + "The shade was disabled when trying to go to the locked shade" + }) + } + + fun logShowBouncerOnGoToLockedShade() { + buffer.log(TAG, LogLevel.INFO, {}, { + "Showing bouncer when trying to go to the locked shade" + }) + } + + fun logGoingToLockedShade(customAnimationHandler: Boolean) { + buffer.log(TAG, LogLevel.INFO, { + bool1 = customAnimationHandler + }, { + "Going to locked shade " + if (customAnimationHandler) "with" else "without" + + " a custom handler" + }) + } + + fun logOnHideKeyguard() { + buffer.log(TAG, LogLevel.INFO, {}, { + "Notified that the keyguard is being hidden" + }) + } + + fun logPulseExpansionStarted() { + buffer.log(TAG, LogLevel.INFO, {}, { + "Pulse Expansion has started" + }) + } + + fun logPulseExpansionFinished(cancelled: Boolean) { + if (cancelled) { + buffer.log(TAG, LogLevel.INFO, {}, { + "Pulse Expansion is requested to cancel" + }) + } else { + buffer.log(TAG, LogLevel.INFO, {}, { + "Pulse Expansion is requested to finish" + }) + } + } + + fun logDragDownAnimation(target: Float) { + buffer.log(TAG, LogLevel.DEBUG, { + double1 = target.toDouble() + }, { + "Drag down amount animating to " + double1 + }) + } + + fun logAnimationCancelled(isPulse: Boolean) { + if (isPulse) { + buffer.log(TAG, LogLevel.DEBUG, {}, { + "Pulse animation cancelled" + }) + } else { + buffer.log(TAG, LogLevel.DEBUG, {}, { + "drag down animation cancelled" + }) + } + } + + fun logDragDownAmountResetWhenFullyCollapsed() { + buffer.log(TAG, LogLevel.WARNING, {}, { + "Drag down amount stuck and reset after shade was fully collapsed" + }) + } + + fun logPulseHeightNotResetWhenFullyCollapsed() { + buffer.log(TAG, LogLevel.WARNING, {}, { + "Pulse height stuck and reset after shade was fully collapsed" + }) + } + + fun logGoingToLockedShadeAborted() { + buffer.log(TAG, LogLevel.INFO, {}, { + "Going to the Locked Shade has been aborted" + }) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java index 3ce4472014c8..c861f9920d71 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarCommandQueueCallbacks.java @@ -495,7 +495,8 @@ public class StatusBarCommandQueueCallbacks implements CommandQueue.Callbacks { } @Override - public void showTransient(int displayId, @InternalInsetsType int[] types) { + public void showTransient(int displayId, @InternalInsetsType int[] types, + boolean isGestureOnSystemBar) { if (displayId != mDisplayId) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java b/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java index 8b394bfe35b7..a3b29327f55a 100644 --- a/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java +++ b/packages/SystemUI/src/com/android/systemui/toast/SystemUIToast.java @@ -200,7 +200,9 @@ public class SystemUIToast implements ToastPlugin.Toast { iconView.setVisibility(View.GONE); } else { iconView.setImageDrawable(icon); - if (appInfo.labelRes != 0) { + if (appInfo == null) { + Log.d(TAG, "No appInfo for pkg=" + mPackageName + " usr=" + mUserId); + } else if (appInfo.labelRes != 0) { try { Resources res = mContext.getPackageManager().getResourcesForApplication( appInfo, diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java index 2e183b38a7dc..ba9b638fac99 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java @@ -223,8 +223,7 @@ public class WalletScreenController implements } mUiEventLogger.log(WalletUiEvent.QAW_CLICK_CARD); - mActivityStarter.startActivity( - ((QAWalletCardViewInfo) cardInfo).mWalletCard.getPendingIntent().getIntent(), true); + mActivityStarter.startPendingIntentDismissingKeyguard(cardInfo.getPendingIntent()); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt index 2d3757c29ebf..12096bc06748 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlsProviderLifecycleManagerTest.kt @@ -17,6 +17,9 @@ package com.android.systemui.controls.controller import android.content.ComponentName +import android.content.Context +import android.content.Intent +import android.content.ServiceConnection import android.os.UserHandle import android.service.controls.IControlsActionCallback import android.service.controls.IControlsProvider @@ -43,6 +46,8 @@ import org.mockito.ArgumentMatchers.eq import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito.`when` +import org.mockito.Mockito.anyInt +import org.mockito.Mockito.mock import org.mockito.Mockito.never import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations @@ -57,8 +62,6 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { private lateinit var subscriberService: IControlsSubscriber.Stub @Mock private lateinit var service: IControlsProvider.Stub - @Mock - private lateinit var loadCallback: ControlsBindingController.LoadCallback @Captor private lateinit var wrapperCaptor: ArgumentCaptor<ControlActionWrapper> @@ -75,7 +78,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { fun setUp() { MockitoAnnotations.initMocks(this) - mContext.addMockService(componentName, service) + context.addMockService(componentName, service) executor = FakeExecutor(FakeSystemClock()) `when`(service.asBinder()).thenCallRealMethod() `when`(service.queryLocalInterface(ArgumentMatchers.anyString())).thenReturn(service) @@ -98,7 +101,36 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { fun testBindService() { manager.bindService() executor.runAllReady() - assertTrue(mContext.isBound(componentName)) + assertTrue(context.isBound(componentName)) + } + + @Test + fun testNullBinding() { + val mockContext = mock(Context::class.java) + lateinit var serviceConnection: ServiceConnection + `when`(mockContext.bindServiceAsUser(any(), any(), anyInt(), any())).thenAnswer { + val component = (it.arguments[0] as Intent).component + if (component == componentName) { + serviceConnection = it.arguments[1] as ServiceConnection + serviceConnection.onNullBinding(component) + true + } else { + false + } + } + + val nullManager = ControlsProviderLifecycleManager( + mockContext, + executor, + actionCallbackService, + UserHandle.of(0), + componentName + ) + + nullManager.bindService() + executor.runAllReady() + + verify(mockContext).unbindService(serviceConnection) } @Test @@ -109,7 +141,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { manager.unbindService() executor.runAllReady() - assertFalse(mContext.isBound(componentName)) + assertFalse(context.isBound(componentName)) } @Test @@ -119,7 +151,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { verify(service).load(subscriberService) - assertTrue(mContext.isBound(componentName)) + assertTrue(context.isBound(componentName)) } @Test @@ -129,7 +161,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { manager.unbindService() executor.runAllReady() - assertFalse(mContext.isBound(componentName)) + assertFalse(context.isBound(componentName)) } @Test @@ -162,7 +194,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { manager.maybeBindAndSubscribe(list, subscriberService) executor.runAllReady() - assertTrue(mContext.isBound(componentName)) + assertTrue(context.isBound(componentName)) verify(service).subscribe(list, subscriberService) } @@ -173,7 +205,7 @@ class ControlsProviderLifecycleManagerTest : SysuiTestCase() { manager.maybeBindAndSendAction(controlId, action) executor.runAllReady() - assertTrue(mContext.isBound(componentName)) + assertTrue(context.isBound(componentName)) verify(service).action(eq(controlId), capture(wrapperCaptor), eq(actionCallbackService)) assertEquals(action, wrapperCaptor.getValue().getWrappedAction()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index af624ed1ea1a..7089d093582a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -151,17 +151,17 @@ public class CommandQueueTest extends SysuiTestCase { @Test public void testShowTransient() { int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}; - mCommandQueue.showTransient(DEFAULT_DISPLAY, types); + mCommandQueue.showTransient(DEFAULT_DISPLAY, types, true /* isGestureOnSystemBar */); waitForIdleSync(); - verify(mCallbacks).showTransient(eq(DEFAULT_DISPLAY), eq(types)); + verify(mCallbacks).showTransient(eq(DEFAULT_DISPLAY), eq(types), eq(true)); } @Test public void testShowTransientForSecondaryDisplay() { int[] types = new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}; - mCommandQueue.showTransient(SECONDARY_DISPLAY, types); + mCommandQueue.showTransient(SECONDARY_DISPLAY, types, true /* isGestureOnSystemBar */); waitForIdleSync(); - verify(mCallbacks).showTransient(eq(SECONDARY_DISPLAY), eq(types)); + verify(mCallbacks).showTransient(eq(SECONDARY_DISPLAY), eq(types), eq(true)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LSShadeTransitionLoggerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LSShadeTransitionLoggerTest.kt new file mode 100644 index 000000000000..6971c63ed6d4 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LSShadeTransitionLoggerTest.kt @@ -0,0 +1,44 @@ +package com.android.systemui.statusbar + +import android.testing.AndroidTestingRunner +import android.util.DisplayMetrics +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.log.LogBuffer +import com.android.systemui.statusbar.notification.row.ExpandableView +import com.android.systemui.statusbar.phone.LSShadeTransitionLogger +import com.android.systemui.statusbar.phone.LockscreenGestureLogger +import com.android.systemui.util.mockito.mock +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.junit.MockitoJUnit + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class LSShadeTransitionLoggerTest : SysuiTestCase() { + lateinit var logger: LSShadeTransitionLogger + @Mock + lateinit var gestureLogger: LockscreenGestureLogger + @Mock + lateinit var displayMetrics: DisplayMetrics + @JvmField @Rule + val mockito = MockitoJUnit.rule() + + @Before + fun setup() { + logger = LSShadeTransitionLogger( + LogBuffer("Test", 10, 10, mock()), + gestureLogger, + displayMetrics) + } + + @Test + fun testLogDragDownStarted() { + val view: ExpandableView = mock() + // log a non-null, non row, ensure no crash + logger.logDragDownStarted(view) + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt index 89435ae164b5..01a214b40f98 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt @@ -9,6 +9,8 @@ import com.android.systemui.ExpandHelper import com.android.systemui.R import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingCollector +import com.android.systemui.dump.DumpManager +import com.android.systemui.log.LogBuffer import com.android.systemui.media.MediaHierarchyManager import com.android.systemui.plugins.FalsingManager import com.android.systemui.plugins.qs.QS @@ -18,7 +20,7 @@ import com.android.systemui.statusbar.notification.stack.AmbientState import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.phone.KeyguardBypassController -import com.android.systemui.statusbar.phone.LockscreenGestureLogger +import com.android.systemui.statusbar.phone.LSShadeTransitionLogger import com.android.systemui.statusbar.phone.NotificationPanelViewController import com.android.systemui.statusbar.phone.ScrimController import com.android.systemui.statusbar.phone.StatusBar @@ -56,7 +58,8 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { lateinit var transitionController: LockscreenShadeTransitionController lateinit var row: ExpandableNotificationRow @Mock lateinit var statusbarStateController: SysuiStatusBarStateController - @Mock lateinit var lockscreenGestureLogger: LockscreenGestureLogger + @Mock lateinit var logger: LSShadeTransitionLogger + @Mock lateinit var dumpManager: DumpManager @Mock lateinit var keyguardBypassController: KeyguardBypassController @Mock lateinit var lockScreenUserManager: NotificationLockscreenUserManager @Mock lateinit var falsingCollector: FalsingCollector @@ -66,6 +69,7 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { @Mock lateinit var scrimController: ScrimController @Mock lateinit var configurationController: ConfigurationController @Mock lateinit var falsingManager: FalsingManager + @Mock lateinit var buffer: LogBuffer @Mock lateinit var notificationPanelController: NotificationPanelViewController @Mock lateinit var nsslController: NotificationStackScrollLayoutController @Mock lateinit var depthController: NotificationShadeDepthController @@ -86,18 +90,18 @@ class LockscreenShadeTransitionControllerTest : SysuiTestCase() { .addOverride(R.bool.config_use_split_notification_shade, false) transitionController = LockscreenShadeTransitionController( statusBarStateController = statusbarStateController, - lockscreenGestureLogger = lockscreenGestureLogger, + logger = logger, keyguardBypassController = keyguardBypassController, lockScreenUserManager = lockScreenUserManager, falsingCollector = falsingCollector, ambientState = ambientState, - displayMetrics = displayMetrics, mediaHierarchyManager = mediaHierarchyManager, scrimController = scrimController, depthController = depthController, context = context, configurationController = configurationController, - falsingManager = falsingManager + falsingManager = falsingManager, + dumpManager = dumpManager ) whenever(nsslController.view).thenReturn(stackscroller) whenever(nsslController.expandHelperCallback).thenReturn(expandHelperCallback) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index 01f5654f24ef..13989d3f0ebe 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -385,7 +385,8 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mStatusBarStateController, mFalsingManager, mLockscreenShadeTransitionController, - new FalsingCollectorFake()); + new FalsingCollectorFake(), + mDumpManager); when(mKeyguardStatusViewComponentFactory.build(any())) .thenReturn(mKeyguardStatusViewComponent); when(mKeyguardStatusViewComponent.getKeyguardClockSwitchController()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java index b357c7838a45..5679490e527f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/theme/ThemeOverlayControllerTest.java @@ -210,12 +210,6 @@ public class ThemeOverlayControllerTest extends SysuiTestCase { verify(mThemeOverlayApplier) .applyCurrentUserOverlays(themeOverlays.capture(), any(), anyInt(), any()); - // Assert that we received the colors that we were expecting - assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_SYSTEM_PALETTE)) - .isEqualTo(new OverlayIdentifier("ffff0000")); - assertThat(themeOverlays.getValue().get(OVERLAY_CATEGORY_ACCENT_COLOR)) - .isEqualTo(new OverlayIdentifier("ffff0000")); - // Should not change theme after changing wallpapers, if intent doesn't have // WallpaperManager.EXTRA_FROM_FOREGROUND_APP set to true. clearInvocations(mThemeOverlayApplier); diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java index e3b07b3e8bd7..01769e52c8d3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java @@ -21,7 +21,6 @@ import static android.view.View.VISIBLE; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -96,7 +95,7 @@ public class WalletScreenControllerTest extends SysuiTestCase { @Mock UiEventLogger mUiEventLogger; @Captor - ArgumentCaptor<Intent> mIntentCaptor; + ArgumentCaptor<PendingIntent> mIntentCaptor; @Captor ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor; private WalletScreenController mController; @@ -374,10 +373,12 @@ public class WalletScreenControllerTest extends SysuiTestCase { mController.onCardClicked(walletCardViewInfo); - verify(mActivityStarter).startActivity(mIntentCaptor.capture(), eq(true)); + verify(mActivityStarter).startPendingIntentDismissingKeyguard(mIntentCaptor.capture()); - assertEquals(mWalletIntent.getAction(), mIntentCaptor.getValue().getAction()); - assertEquals(mWalletIntent.getComponent(), mIntentCaptor.getValue().getComponent()); + Intent actualIntent = mIntentCaptor.getValue().getIntent(); + + assertEquals(mWalletIntent.getAction(), actualIntent.getAction()); + assertEquals(mWalletIntent.getComponent(), actualIntent.getComponent()); verify(mUiEventLogger, times(1)).log(WalletUiEvent.QAW_CLICK_CARD); } diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 9da6d528a967..6bb5aa148e59 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -523,6 +523,8 @@ public final class CachedAppOptimizer { */ static private native void compactProcess(int pid, int compactionFlags); + static private native void cancelCompaction(); + /** * Reads the flag value from DeviceConfig to determine whether app compaction * should be enabled, and starts the freeze/compaction thread if needed. @@ -900,7 +902,7 @@ public final class CachedAppOptimizer { void unfreezeTemporarily(ProcessRecord app) { if (mUseFreezer) { synchronized (mProcLock) { - if (app.mOptRecord.isFrozen()) { + if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) { unfreezeAppLSP(app); freezeAppAsyncLSP(app); } @@ -1026,6 +1028,26 @@ public final class CachedAppOptimizer { } } + @GuardedBy({"mService", "mProcLock"}) + void onOomAdjustChanged(int oldAdj, int newAdj, ProcessRecord app) { + // Cancel any currently executing compactions + // if the process moved out of cached state + if (DefaultProcessDependencies.mPidCompacting == app.mPid && newAdj < oldAdj + && newAdj < ProcessList.CACHED_APP_MIN_ADJ) { + cancelCompaction(); + } + + // Perform a minor compaction when a perceptible app becomes the prev/home app + // Perform a major compaction when any app enters cached + if (oldAdj <= ProcessList.PERCEPTIBLE_APP_ADJ + && (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) { + compactAppSome(app); + } else if (newAdj >= ProcessList.CACHED_APP_MIN_ADJ + && newAdj <= ProcessList.CACHED_APP_MAX_ADJ) { + compactAppFull(app); + } + } + @VisibleForTesting static final class LastCompactionStats { private final long[] mRssAfterCompaction; @@ -1068,6 +1090,13 @@ public final class CachedAppOptimizer { name = proc.processName; opt.setHasPendingCompact(false); + if (mAm.mInternal.isPendingTopUid(proc.uid)) { + // In case the OOM Adjust has not yet been propagated we see if this is + // pending on becoming top app in which case we should not compact. + Slog.e(TAG_AM, "Skip compaction since UID is active for " + name); + return; + } + // don't compact if the process has returned to perceptible // and this is only a cached/home/prev compaction if ((pendingAction == COMPACT_PROCESS_SOME @@ -1477,6 +1506,8 @@ public final class CachedAppOptimizer { * Default implementation for ProcessDependencies, public vor visibility to OomAdjuster class. */ private static final class DefaultProcessDependencies implements ProcessDependencies { + public static int mPidCompacting = -1; + // Get memory RSS from process. @Override public long[] getRss(int pid) { @@ -1486,6 +1517,7 @@ public final class CachedAppOptimizer { // Compact process. @Override public void performCompaction(String action, int pid) throws IOException { + mPidCompacting = pid; if (action.equals(COMPACT_ACTION_STRING[COMPACT_ACTION_FULL])) { compactProcess(pid, COMPACT_ACTION_FILE_FLAG | COMPACT_ACTION_ANON_FLAG); } else if (action.equals(COMPACT_ACTION_STRING[COMPACT_ACTION_FILE])) { @@ -1493,6 +1525,7 @@ public final class CachedAppOptimizer { } else if (action.equals(COMPACT_ACTION_STRING[COMPACT_ACTION_ANON])) { compactProcess(pid, COMPACT_ACTION_ANON_FLAG); } + mPidCompacting = -1; } } } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 7673123c6476..88ca8a5e8356 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2606,18 +2606,9 @@ public class OomAdjuster { // don't compact during bootup if (mCachedAppOptimizer.useCompaction() && mService.mBooted) { // Cached and prev/home compaction + // reminder: here, setAdj is previous state, curAdj is upcoming state if (state.getCurAdj() != state.getSetAdj()) { - // Perform a minor compaction when a perceptible app becomes the prev/home app - // Perform a major compaction when any app enters cached - // reminder: here, setAdj is previous state, curAdj is upcoming state - if (state.getSetAdj() <= ProcessList.PERCEPTIBLE_APP_ADJ - && (state.getCurAdj() == ProcessList.PREVIOUS_APP_ADJ - || state.getCurAdj() == ProcessList.HOME_APP_ADJ)) { - mCachedAppOptimizer.compactAppSome(app); - } else if (state.getCurAdj() >= ProcessList.CACHED_APP_MIN_ADJ - && state.getCurAdj() <= ProcessList.CACHED_APP_MAX_ADJ) { - mCachedAppOptimizer.compactAppFull(app); - } + mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app); } else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE && state.getSetAdj() < ProcessList.FOREGROUND_APP_ADJ // Because these can fire independent of oom_adj/procstate changes, we need diff --git a/services/core/java/com/android/server/apphibernation/AppHibernationService.java b/services/core/java/com/android/server/apphibernation/AppHibernationService.java index 5cfcb4c5f8a8..4d025c981ce9 100644 --- a/services/core/java/com/android/server/apphibernation/AppHibernationService.java +++ b/services/core/java/com/android/server/apphibernation/AppHibernationService.java @@ -277,16 +277,16 @@ public final class AppHibernationService extends SystemService { getContext().enforceCallingOrSelfPermission( android.Manifest.permission.MANAGE_APP_HIBERNATION, "Caller does not have MANAGE_APP_HIBERNATION permission."); - userId = handleIncomingUser(userId, methodName); - if (!checkUserStatesExist(userId, methodName)) { + final int realUserId = handleIncomingUser(userId, methodName); + if (!checkUserStatesExist(realUserId, methodName)) { return; } synchronized (mLock) { - final Map<String, UserLevelState> packageStates = mUserStates.get(userId); + final Map<String, UserLevelState> packageStates = mUserStates.get(realUserId); final UserLevelState pkgState = packageStates.get(packageName); if (pkgState == null) { Slog.e(TAG, String.format("Package %s is not installed for user %s", - packageName, userId)); + packageName, realUserId)); return; } @@ -294,13 +294,17 @@ public final class AppHibernationService extends SystemService { return; } + pkgState.hibernated = isHibernating; if (isHibernating) { - hibernatePackageForUser(packageName, userId, pkgState); + mBackgroundExecutor.execute(() -> hibernatePackageForUser(packageName, realUserId)); } else { - unhibernatePackageForUser(packageName, userId, pkgState); + mBackgroundExecutor.execute( + () -> unhibernatePackageForUser(packageName, realUserId)); + pkgState.lastUnhibernatedMs = System.currentTimeMillis(); } + final UserLevelState stateSnapshot = new UserLevelState(pkgState); - final int userIdSnapshot = userId; + final int userIdSnapshot = realUserId; mBackgroundExecutor.execute(() -> { FrameworkStatsLog.write( FrameworkStatsLog.USER_LEVEL_HIBERNATION_STATE_CHANGED, @@ -308,8 +312,8 @@ public final class AppHibernationService extends SystemService { userIdSnapshot, stateSnapshot.hibernated); }); - List<UserLevelState> states = new ArrayList<>(mUserStates.get(userId).values()); - mUserDiskStores.get(userId).scheduleWriteHibernationStates(states); + List<UserLevelState> states = new ArrayList<>(mUserStates.get(realUserId).values()); + mUserDiskStores.get(realUserId).scheduleWriteHibernationStates(states); } } @@ -334,10 +338,12 @@ public final class AppHibernationService extends SystemService { return; } if (state.hibernated != isHibernating) { + state.hibernated = isHibernating; if (isHibernating) { - hibernatePackageGlobally(packageName, state); + mBackgroundExecutor.execute(() -> hibernatePackageGlobally(packageName, state)); } else { - unhibernatePackageGlobally(packageName, state); + state.savedByte = 0; + state.lastUnhibernatedMs = System.currentTimeMillis(); } List<GlobalLevelState> states = new ArrayList<>(mGlobalHibernationStates.values()); mGlobalLevelHibernationDiskStore.scheduleWriteHibernationStates(states); @@ -374,20 +380,16 @@ public final class AppHibernationService extends SystemService { } /** - * Put an app into hibernation for a given user, allowing user-level optimizations to occur. - * - * @param pkgState package hibernation state + * Put an app into hibernation for a given user, allowing user-level optimizations to occur. Do + * not hold {@link #mLock} while calling this to avoid deadlock scenarios. */ - @GuardedBy("mLock") - private void hibernatePackageForUser(@NonNull String packageName, int userId, - @NonNull UserLevelState pkgState) { + private void hibernatePackageForUser(@NonNull String packageName, int userId) { Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "hibernatePackage"); final long caller = Binder.clearCallingIdentity(); try { mIActivityManager.forceStopPackage(packageName, userId); mIPackageManager.deleteApplicationCacheFilesAsUser(packageName, userId, null /* observer */); - pkgState.hibernated = true; } catch (RemoteException e) { throw new IllegalStateException( "Failed to hibernate due to manager not being available", e); @@ -398,16 +400,11 @@ public final class AppHibernationService extends SystemService { } /** - * Remove a package from hibernation for a given user. - * - * @param pkgState package hibernation state + * Remove a package from hibernation for a given user. Do not hold {@link #mLock} while calling + * this. */ - @GuardedBy("mLock") - private void unhibernatePackageForUser(@NonNull String packageName, int userId, - UserLevelState pkgState) { + private void unhibernatePackageForUser(@NonNull String packageName, int userId) { Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "unhibernatePackage"); - pkgState.hibernated = false; - pkgState.lastUnhibernatedMs = System.currentTimeMillis(); final long caller = Binder.clearCallingIdentity(); // Deliver LOCKED_BOOT_COMPLETE AND BOOT_COMPLETE broadcast so app can re-register // their alarms/jobs/etc. @@ -458,29 +455,20 @@ public final class AppHibernationService extends SystemService { } /** - * Put a package into global hibernation, optimizing its storage at a package / APK level. + * Put a package into global hibernation, optimizing its storage at a package / APK level. Do + * not hold {@link #mLock} while calling this. */ - @GuardedBy("mLock") private void hibernatePackageGlobally(@NonNull String packageName, GlobalLevelState state) { Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "hibernatePackageGlobally"); + long savedBytes = 0; if (mOatArtifactDeletionEnabled) { - state.savedByte = Math.max( + savedBytes = Math.max( mPackageManagerInternal.deleteOatArtifactsOfPackage(packageName), 0); } - state.hibernated = true; - Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); - } - - /** - * Unhibernate a package from global hibernation. - */ - @GuardedBy("mLock") - private void unhibernatePackageGlobally(@NonNull String packageName, GlobalLevelState state) { - Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "unhibernatePackageGlobally"); - state.hibernated = false; - state.savedByte = 0; - state.lastUnhibernatedMs = System.currentTimeMillis(); + synchronized (mLock) { + state.savedByte = savedBytes; + } Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index 5944a63bd5e6..5288a04ce86e 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -239,6 +239,9 @@ public class AudioDeviceInventory { //------------------------------------------------------------ /*package*/ void dump(PrintWriter pw, String prefix) { + pw.println("\n" + prefix + "BECOMING_NOISY_INTENT_DEVICES_SET="); + BECOMING_NOISY_INTENT_DEVICES_SET.forEach(device -> { + pw.print(" 0x" + Integer.toHexString(device)); }); pw.println("\n" + prefix + "Preferred devices for strategy:"); mPreferredDevices.forEach((strategy, device) -> { pw.println(" " + prefix + "strategy:" + strategy + " device:" + device); }); @@ -1168,10 +1171,13 @@ public class AudioDeviceInventory { state == AudioService.CONNECTION_STATE_CONNECTED ? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED); if (state != AudioService.CONNECTION_STATE_DISCONNECTED) { + Log.i(TAG, "not sending NOISY: state=" + state); mmi.set(MediaMetrics.Property.DELAY_MS, 0).record(); // OK to return return 0; } if (!BECOMING_NOISY_INTENT_DEVICES_SET.contains(device)) { + Log.i(TAG, "not sending NOISY: device=0x" + Integer.toHexString(device) + + " not in set " + BECOMING_NOISY_INTENT_DEVICES_SET); mmi.set(MediaMetrics.Property.DELAY_MS, 0).record(); // OK to return return 0; } @@ -1181,18 +1187,24 @@ public class AudioDeviceInventory { if (((di.mDeviceType & AudioSystem.DEVICE_BIT_IN) == 0) && BECOMING_NOISY_INTENT_DEVICES_SET.contains(di.mDeviceType)) { devices.add(di.mDeviceType); + Log.i(TAG, "NOISY: adding 0x" + Integer.toHexString(di.mDeviceType)); } } if (musicDevice == AudioSystem.DEVICE_NONE) { musicDevice = mDeviceBroker.getDeviceForStream(AudioSystem.STREAM_MUSIC); + Log.i(TAG, "NOISY: musicDevice changing from NONE to 0x" + + Integer.toHexString(musicDevice)); } // always ignore condition on device being actually used for music when in communication // because music routing is altered in this case. // also checks whether media routing if affected by a dynamic policy or mirroring - if (((device == musicDevice) || mDeviceBroker.isInCommunication()) - && AudioSystem.isSingleAudioDeviceType(devices, device) - && !mDeviceBroker.hasMediaDynamicPolicy() + final boolean inCommunication = mDeviceBroker.isInCommunication(); + final boolean singleAudioDeviceType = AudioSystem.isSingleAudioDeviceType(devices, device); + final boolean hasMediaDynamicPolicy = mDeviceBroker.hasMediaDynamicPolicy(); + if (((device == musicDevice) || inCommunication) + && singleAudioDeviceType + && !hasMediaDynamicPolicy && (musicDevice != AudioSystem.DEVICE_OUT_REMOTE_SUBMIX)) { if (!mAudioSystem.isStreamActive(AudioSystem.STREAM_MUSIC, 0 /*not looking in past*/) && !mDeviceBroker.hasAudioFocusUsers()) { @@ -1205,6 +1217,12 @@ public class AudioDeviceInventory { } mDeviceBroker.postBroadcastBecomingNoisy(); delay = AudioService.BECOMING_NOISY_DELAY_MS; + } else { + Log.i(TAG, "not sending NOISY: device:0x" + Integer.toHexString(device) + + " musicDevice:0x" + Integer.toHexString(musicDevice) + + " inComm:" + inCommunication + + " mediaPolicy:" + hasMediaDynamicPolicy + + " singleDevice:" + singleAudioDeviceType); } mmi.set(MediaMetrics.Property.DELAY_MS, delay).record(); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d4c9b4865bd5..7cf60e8fedb2 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -9035,8 +9035,6 @@ public class AudioService extends IAudioService.Stub protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; - mAudioSystem.dump(pw); - sLifecycleLogger.dump(pw); if (mAudioHandler != null) { pw.println("\nMessage handler (watch for unhandled messages):"); @@ -9116,6 +9114,8 @@ public class AudioService extends IAudioService.Stub pw.println("mHasSpatializerEffect:" + mHasSpatializerEffect); pw.println("isSpatializerEnabled:" + isSpatializerEnabled()); pw.println("isSpatialAudioEnabled:" + isSpatialAudioEnabled()); + + mAudioSystem.dump(pw); } private void dumpSupportedSystemUsage(PrintWriter pw) { diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java index ac212eee21e6..a2ba76b6fd6a 100644 --- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java +++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java @@ -524,11 +524,28 @@ public class AudioSystemAdapter implements AudioSystem.RoutingUpdateCallback { * @param pw */ public void dump(PrintWriter pw) { + pw.println("\nAudioSystemAdapter:"); + pw.println(" mDevicesForStreamCache:"); + if (mDevicesForStreamCache != null) { + for (Integer stream : mDevicesForStreamCache.keySet()) { + pw.println("\t stream:" + stream + " device:" + + AudioSystem.getOutputDeviceName(mDevicesForStreamCache.get(stream))); + } + } + pw.println(" mDevicesForAttrCache:"); + if (mDevicesForAttrCache != null) { + for (AudioAttributes attr : mDevicesForAttrCache.keySet()) { + pw.println("\t" + attr); + for (AudioDeviceAttributes devAttr : mDevicesForAttrCache.get(attr)) { + pw.println("\t\t" + devAttr); + } + } + } + if (!ENABLE_GETDEVICES_STATS) { - // only stats in this dump + // only stats in the rest of this dump return; } - pw.println("\nAudioSystemAdapter:"); for (int i = 0; i < NB_MEASUREMENTS; i++) { pw.println(mMethodNames[i] + ": counter=" + mMethodCallCounter[i] diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 22dd2c05c157..cbc2c0c6c8ac 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -50,6 +50,8 @@ import android.os.UserHandle; import android.provider.Settings; import android.util.Log; import android.util.MathUtils; +import android.util.MutableFloat; +import android.util.MutableInt; import android.util.Slog; import android.util.TimeUtils; import android.view.Display; @@ -1323,6 +1325,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // Animate the screen brightness when the screen is on or dozing. // Skip the animation when the screen is off or suspended or transition to/from VR. + boolean brightnessAdjusted = false; if (!mPendingScreenOff) { if (mSkipScreenOnBrightnessRamp) { if (state == Display.STATE_ON) { @@ -1410,15 +1413,19 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // slider event so notify as if the system changed the brightness. userInitiatedChange = false; } - notifyBrightnessChanged(brightnessState, userInitiatedChange, + notifyBrightnessTrackerChanged(brightnessState, userInitiatedChange, hadUserBrightnessPoint); } // We save the brightness info *after* the brightness setting has been changed and // adjustments made so that the brightness info reflects the latest value. - saveBrightnessInfo(getScreenBrightnessSetting(), animateValue); + brightnessAdjusted = saveBrightnessInfo(getScreenBrightnessSetting(), animateValue); } else { - saveBrightnessInfo(getScreenBrightnessSetting()); + brightnessAdjusted = saveBrightnessInfo(getScreenBrightnessSetting()); + } + + if (brightnessAdjusted) { + postBrightnessChangeRunnable(); } // Log any changes to what is currently driving the brightness setting. @@ -1534,31 +1541,50 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call public BrightnessInfo getBrightnessInfo() { synchronized (mCachedBrightnessInfo) { return new BrightnessInfo( - mCachedBrightnessInfo.brightness, - mCachedBrightnessInfo.adjustedBrightness, - mCachedBrightnessInfo.brightnessMin, - mCachedBrightnessInfo.brightnessMax, - mCachedBrightnessInfo.hbmMode, - mCachedBrightnessInfo.highBrightnessTransitionPoint); + mCachedBrightnessInfo.brightness.value, + mCachedBrightnessInfo.adjustedBrightness.value, + mCachedBrightnessInfo.brightnessMin.value, + mCachedBrightnessInfo.brightnessMax.value, + mCachedBrightnessInfo.hbmMode.value, + mCachedBrightnessInfo.hbmTransitionPoint.value); } } - private void saveBrightnessInfo(float brightness) { - saveBrightnessInfo(brightness, brightness); + private boolean saveBrightnessInfo(float brightness) { + return saveBrightnessInfo(brightness, brightness); } - private void saveBrightnessInfo(float brightness, float adjustedBrightness) { + private boolean saveBrightnessInfo(float brightness, float adjustedBrightness) { synchronized (mCachedBrightnessInfo) { - mCachedBrightnessInfo.brightness = brightness; - mCachedBrightnessInfo.adjustedBrightness = adjustedBrightness; - mCachedBrightnessInfo.brightnessMin = mHbmController.getCurrentBrightnessMin(); - mCachedBrightnessInfo.brightnessMax = mHbmController.getCurrentBrightnessMax(); - mCachedBrightnessInfo.hbmMode = mHbmController.getHighBrightnessMode(); - mCachedBrightnessInfo.highBrightnessTransitionPoint = - mHbmController.getTransitionPoint(); + boolean changed = false; + + changed |= + mCachedBrightnessInfo.checkAndSetFloat(mCachedBrightnessInfo.brightness, + brightness); + changed |= + mCachedBrightnessInfo.checkAndSetFloat(mCachedBrightnessInfo.adjustedBrightness, + adjustedBrightness); + changed |= + mCachedBrightnessInfo.checkAndSetFloat(mCachedBrightnessInfo.brightnessMin, + mHbmController.getCurrentBrightnessMin()); + changed |= + mCachedBrightnessInfo.checkAndSetFloat(mCachedBrightnessInfo.brightnessMax, + mHbmController.getCurrentBrightnessMax()); + changed |= + mCachedBrightnessInfo.checkAndSetInt(mCachedBrightnessInfo.hbmMode, + mHbmController.getHighBrightnessMode()); + changed |= + mCachedBrightnessInfo.checkAndSetFloat(mCachedBrightnessInfo.hbmTransitionPoint, + mHbmController.getTransitionPoint()); + + return changed; } } + void postBrightnessChangeRunnable() { + mHandler.post(mOnBrightnessChangeRunnable); + } + private HighBrightnessModeController createHbmControllerLocked() { final DisplayDevice device = mLogicalDisplay.getPrimaryDisplayDeviceLocked(); final DisplayDeviceConfig ddConfig = device.getDisplayDeviceConfig(); @@ -1571,7 +1597,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call PowerManager.BRIGHTNESS_MIN, PowerManager.BRIGHTNESS_MAX, hbmData, () -> { sendUpdatePowerStateLocked(); - mHandler.post(mOnBrightnessChangeRunnable); + postBrightnessChangeRunnable(); // TODO(b/192258832): Switch the HBMChangeCallback to a listener pattern. if (mAutomaticBrightnessController != null) { mAutomaticBrightnessController.update(); @@ -2073,7 +2099,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call private void setCurrentScreenBrightness(float brightnessValue) { if (brightnessValue != mCurrentScreenBrightnessSetting) { mCurrentScreenBrightnessSetting = brightnessValue; - mHandler.post(mOnBrightnessChangeRunnable); + postBrightnessChangeRunnable(); } } @@ -2125,7 +2151,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call return true; } - private void notifyBrightnessChanged(float brightness, boolean userInitiated, + private void notifyBrightnessTrackerChanged(float brightness, boolean userInitiated, boolean hadUserDataPoint) { final float brightnessInNits = convertToNits(brightness); if (mPowerRequest.useAutoBrightness && brightnessInNits >= 0.0f @@ -2236,16 +2262,17 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call pw.println(" mColorFadeFadesConfig=" + mColorFadeFadesConfig); pw.println(" mColorFadeEnabled=" + mColorFadeEnabled); synchronized (mCachedBrightnessInfo) { - pw.println(" mCachedBrightnessInfo.brightness=" + mCachedBrightnessInfo.brightness); + pw.println(" mCachedBrightnessInfo.brightness=" + + mCachedBrightnessInfo.brightness.value); pw.println(" mCachedBrightnessInfo.adjustedBrightness=" + - mCachedBrightnessInfo.adjustedBrightness); + mCachedBrightnessInfo.adjustedBrightness.value); pw.println(" mCachedBrightnessInfo.brightnessMin=" + - mCachedBrightnessInfo.brightnessMin); + mCachedBrightnessInfo.brightnessMin.value); pw.println(" mCachedBrightnessInfo.brightnessMax=" + - mCachedBrightnessInfo.brightnessMax); - pw.println(" mCachedBrightnessInfo.hbmMode=" + mCachedBrightnessInfo.hbmMode); - pw.println(" mCachedBrightnessInfo.highBrightnessTransitionPoint=" + - mCachedBrightnessInfo.highBrightnessTransitionPoint); + mCachedBrightnessInfo.brightnessMax.value); + pw.println(" mCachedBrightnessInfo.hbmMode=" + mCachedBrightnessInfo.hbmMode.value); + pw.println(" mCachedBrightnessInfo.hbmTransitionPoint=" + + mCachedBrightnessInfo.hbmTransitionPoint.value); } pw.println(" mDisplayBlanksAfterDozeConfig=" + mDisplayBlanksAfterDozeConfig); pw.println(" mBrightnessBucketsInDozeConfig=" + mBrightnessBucketsInDozeConfig); @@ -2663,11 +2690,31 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } static class CachedBrightnessInfo { - public float brightness; - public float adjustedBrightness; - public float brightnessMin; - public float brightnessMax; - public int hbmMode; - public float highBrightnessTransitionPoint; + public MutableFloat brightness = new MutableFloat(PowerManager.BRIGHTNESS_INVALID_FLOAT); + public MutableFloat adjustedBrightness = + new MutableFloat(PowerManager.BRIGHTNESS_INVALID_FLOAT); + public MutableFloat brightnessMin = + new MutableFloat(PowerManager.BRIGHTNESS_INVALID_FLOAT); + public MutableFloat brightnessMax = + new MutableFloat(PowerManager.BRIGHTNESS_INVALID_FLOAT); + public MutableInt hbmMode = new MutableInt(BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF); + public MutableFloat hbmTransitionPoint = + new MutableFloat(HighBrightnessModeController.HBM_TRANSITION_POINT_INVALID); + + public boolean checkAndSetFloat(MutableFloat mf, float f) { + if (mf.value != f) { + mf.value = f; + return true; + } + return false; + } + + public boolean checkAndSetInt(MutableInt mi, int i) { + if (mi.value != i) { + mi.value = i; + return true; + } + return false; + } } } diff --git a/services/core/java/com/android/server/location/geofence/GeofenceManager.java b/services/core/java/com/android/server/location/geofence/GeofenceManager.java index a52c9cefb27d..5093f5dee55e 100644 --- a/services/core/java/com/android/server/location/geofence/GeofenceManager.java +++ b/services/core/java/com/android/server/location/geofence/GeofenceManager.java @@ -131,8 +131,8 @@ public class GeofenceManager extends return mPermitted; } - boolean onLocationPermissionsChanged(String packageName) { - if (getIdentity().getPackageName().equals(packageName)) { + boolean onLocationPermissionsChanged(@Nullable String packageName) { + if (packageName == null || getIdentity().getPackageName().equals(packageName)) { return onLocationPermissionsChanged(); } @@ -242,7 +242,7 @@ public class GeofenceManager extends mLocationPermissionsListener = new LocationPermissionsHelper.LocationPermissionsListener() { @Override - public void onLocationPermissionsChanged(String packageName) { + public void onLocationPermissionsChanged(@Nullable String packageName) { GeofenceManager.this.onLocationPermissionsChanged(packageName); } @@ -494,7 +494,7 @@ public class GeofenceManager extends updateRegistrations(registration -> registration.getIdentity().getUserId() == userId); } - void onLocationPermissionsChanged(String packageName) { + void onLocationPermissionsChanged(@Nullable String packageName) { updateRegistrations(registration -> registration.onLocationPermissionsChanged(packageName)); } diff --git a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java index 5e6ae68c02f2..a54047665aba 100644 --- a/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java +++ b/services/core/java/com/android/server/location/gnss/GnssListenerMultiplexer.java @@ -119,8 +119,8 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter */ protected void onGnssListenerUnregister() {} - boolean onLocationPermissionsChanged(String packageName) { - if (getIdentity().getPackageName().equals(packageName)) { + boolean onLocationPermissionsChanged(@Nullable String packageName) { + if (packageName == null || getIdentity().getPackageName().equals(packageName)) { return onLocationPermissionsChanged(); } @@ -197,7 +197,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter mLocationPermissionsListener = new LocationPermissionsHelper.LocationPermissionsListener() { @Override - public void onLocationPermissionsChanged(String packageName) { + public void onLocationPermissionsChanged(@Nullable String packageName) { GnssListenerMultiplexer.this.onLocationPermissionsChanged(packageName); } @@ -390,7 +390,7 @@ public abstract class GnssListenerMultiplexer<TRequest, TListener extends IInter updateRegistrations(registration -> registration.getIdentity().getUserId() == userId); } - private void onLocationPermissionsChanged(String packageName) { + private void onLocationPermissionsChanged(@Nullable String packageName) { updateRegistrations(registration -> registration.onLocationPermissionsChanged(packageName)); } diff --git a/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java b/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java index 2df21017156d..557ecda2ef4c 100644 --- a/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java +++ b/services/core/java/com/android/server/location/injector/LocationPermissionsHelper.java @@ -18,6 +18,7 @@ package com.android.server.location.injector; import static com.android.server.location.LocationPermissions.PERMISSION_NONE; +import android.annotation.Nullable; import android.location.util.identity.CallerIdentity; import com.android.server.location.LocationPermissions; @@ -36,9 +37,10 @@ public abstract class LocationPermissionsHelper { public interface LocationPermissionsListener { /** - * Called when something has changed about location permissions for the given package. + * Called when something has changed about location permissions for the given package. A + * null package indicates this affects every package. */ - void onLocationPermissionsChanged(String packageName); + void onLocationPermissionsChanged(@Nullable String packageName); /** * Called when something has changed about location permissions for the given uid. diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 3c5c5dd0dd14..9ed63b5ce2da 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -528,8 +528,8 @@ public class LocationProviderManager extends } @GuardedBy("mLock") - final boolean onLocationPermissionsChanged(String packageName) { - if (getIdentity().getPackageName().equals(packageName)) { + final boolean onLocationPermissionsChanged(@Nullable String packageName) { + if (packageName == null || getIdentity().getPackageName().equals(packageName)) { return onLocationPermissionsChanged(); } @@ -1373,7 +1373,7 @@ public class LocationProviderManager extends private final LocationPermissionsListener mLocationPermissionsListener = new LocationPermissionsListener() { @Override - public void onLocationPermissionsChanged(String packageName) { + public void onLocationPermissionsChanged(@Nullable String packageName) { LocationProviderManager.this.onLocationPermissionsChanged(packageName); } @@ -2366,7 +2366,7 @@ public class LocationProviderManager extends } } - private void onLocationPermissionsChanged(String packageName) { + private void onLocationPermissionsChanged(@Nullable String packageName) { synchronized (mLock) { updateRegistrations( registration -> registration.onLocationPermissionsChanged(packageName)); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 7455cecee65b..211f8d6e3ec7 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2686,7 +2686,7 @@ public class NotificationManagerService extends SystemService { } } - private void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group, + void createNotificationChannelGroup(String pkg, int uid, NotificationChannelGroup group, boolean fromApp, boolean fromListener) { Objects.requireNonNull(group); Objects.requireNonNull(pkg); @@ -3734,7 +3734,8 @@ public class NotificationManagerService extends SystemService { final int callingUid = Binder.getCallingUid(); NotificationChannelGroup groupToDelete = - mPreferencesHelper.getNotificationChannelGroup(groupId, pkg, callingUid); + mPreferencesHelper.getNotificationChannelGroupWithChannels( + pkg, callingUid, groupId, false); if (groupToDelete != null) { // Preflight for allowability final int userId = UserHandle.getUserId(callingUid); diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index 7fdeb27203bd..2f1fa2221e98 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -388,7 +388,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements if (age >= MAX_SESSION_AGE_ON_LOW_STORAGE_MILLIS) { // Aggressively close old sessions because we are running low on storage // Their staging dirs will be removed too - session.abandon(); + PackageInstallerSession root = !session.hasParentSessionId() + ? session : mSessions.get(session.getParentSessionId()); + if (!root.isDestroyed()) { + root.abandon(); + } } else { // Session is new enough, so it deserves to be kept even on low storage unclaimedStagingDirsOnVolume.remove(session.stageDir); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7a70bfe91248..c0486443b97e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4792,7 +4792,7 @@ public class PackageManagerService extends IPackageManager.Stub try { mDomainVerificationManager.printState(writer, packageName, UserHandle.USER_ALL, mSettings::getPackageLPr); - } catch (PackageManager.NameNotFoundException e) { + } catch (Exception e) { pw.println("Failure printing domain verification information"); Slog.e(TAG, "Failure printing domain verification information", e); } diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationEnforcer.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationEnforcer.java index 0b48b5c6dd70..2208e3c02c4d 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationEnforcer.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationEnforcer.java @@ -70,8 +70,11 @@ public class DomainVerificationEnforcer { break; default: if (!proxy.isCallerVerifier(callingUid)) { - throw new SecurityException( - "Caller is not allowed to query domain verification state"); + mContext.enforcePermission(android.Manifest.permission.DUMP, + Binder.getCallingPid(), callingUid, + "Caller " + callingUid + + " is not allowed to query domain verification state"); + break; } mContext.enforcePermission(android.Manifest.permission.QUERY_ALL_PACKAGES, diff --git a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java index 4f190093e0d0..2270df375245 100644 --- a/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java +++ b/services/core/java/com/android/server/pm/verify/domain/DomainVerificationService.java @@ -1193,6 +1193,7 @@ public class DomainVerificationService extends SystemService @Nullable @UserIdInt Integer userId, @NonNull Function<String, PackageSetting> pkgSettingFunction) throws NameNotFoundException { + mEnforcer.assertApprovedQuerent(mConnection.getCallingUid(), mProxy); synchronized (mLock) { mDebug.printState(writer, packageName, userId, pkgSettingFunction, mAttachedPkgStates); } diff --git a/services/core/java/com/android/server/policy/KeyCombinationManager.java b/services/core/java/com/android/server/policy/KeyCombinationManager.java index 268de3e2182b..68e078c519ba 100644 --- a/services/core/java/com/android/server/policy/KeyCombinationManager.java +++ b/services/core/java/com/android/server/policy/KeyCombinationManager.java @@ -17,11 +17,13 @@ package com.android.server.policy; import static android.view.KeyEvent.KEYCODE_POWER; +import android.os.Handler; import android.os.SystemClock; import android.util.Log; import android.util.SparseLongArray; import android.view.KeyEvent; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.ToBooleanFunction; import java.io.PrintWriter; @@ -35,13 +37,18 @@ public class KeyCombinationManager { private static final String TAG = "KeyCombinationManager"; // Store the received down time of keycode. + @GuardedBy("mLock") private final SparseLongArray mDownTimes = new SparseLongArray(2); private final ArrayList<TwoKeysCombinationRule> mRules = new ArrayList(); // Selected rules according to current key down. + private final Object mLock = new Object(); + @GuardedBy("mLock") private final ArrayList<TwoKeysCombinationRule> mActiveRules = new ArrayList(); // The rule has been triggered by current keys. + @GuardedBy("mLock") private TwoKeysCombinationRule mTriggeredRule; + private final Handler mHandler = new Handler(); // Keys in a key combination must be pressed within this interval of each other. private static final long COMBINE_KEY_DELAY_MILLIS = 150; @@ -109,6 +116,12 @@ public class KeyCombinationManager { * Return true if any active rule could be triggered by the key event, otherwise false. */ boolean interceptKey(KeyEvent event, boolean interactive) { + synchronized (mLock) { + return interceptKeyLocked(event, interactive); + } + } + + private boolean interceptKeyLocked(KeyEvent event, boolean interactive) { final boolean down = event.getAction() == KeyEvent.ACTION_DOWN; final int keyCode = event.getKeyCode(); final int count = mActiveRules.size(); @@ -154,7 +167,7 @@ public class KeyCombinationManager { return false; } Log.v(TAG, "Performing combination rule : " + rule); - rule.execute(); + mHandler.post(rule::execute); mTriggeredRule = rule; return true; }); @@ -169,7 +182,7 @@ public class KeyCombinationManager { for (int index = count - 1; index >= 0; index--) { final TwoKeysCombinationRule rule = mActiveRules.get(index); if (rule.shouldInterceptKey(keyCode)) { - rule.cancel(); + mHandler.post(rule::cancel); mActiveRules.remove(index); } } @@ -181,31 +194,37 @@ public class KeyCombinationManager { * Return the interceptTimeout to tell InputDispatcher when is ready to deliver to window. */ long getKeyInterceptTimeout(int keyCode) { - if (forAllActiveRules((rule) -> rule.shouldInterceptKey(keyCode))) { - return mDownTimes.get(keyCode) + COMBINE_KEY_DELAY_MILLIS; + synchronized (mLock) { + if (forAllActiveRules((rule) -> rule.shouldInterceptKey(keyCode))) { + return mDownTimes.get(keyCode) + COMBINE_KEY_DELAY_MILLIS; + } + return 0; } - return 0; } /** * True if the key event had been handled. */ boolean isKeyConsumed(KeyEvent event) { - if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) != 0) { - return false; + synchronized (mLock) { + if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) != 0) { + return false; + } + return mTriggeredRule != null && mTriggeredRule.shouldInterceptKey(event.getKeyCode()); } - return mTriggeredRule != null && mTriggeredRule.shouldInterceptKey(event.getKeyCode()); } /** * True if power key is the candidate. */ boolean isPowerKeyIntercepted() { - if (forAllActiveRules((rule) -> rule.shouldInterceptKey(KEYCODE_POWER))) { - // return false if only if power key pressed. - return mDownTimes.size() > 1 || mDownTimes.get(KEYCODE_POWER) == 0; + synchronized (mLock) { + if (forAllActiveRules((rule) -> rule.shouldInterceptKey(KEYCODE_POWER))) { + // return false if only if power key pressed. + return mDownTimes.size() > 1 || mDownTimes.get(KEYCODE_POWER) == 0; + } + return false; } - return false; } /** diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index cdab91bbaef8..411f3dcc1eb6 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -136,7 +136,8 @@ public interface StatusBarManagerInternal { @Behavior int behavior, InsetsVisibilities requestedVisibilities, String packageName); /** @see com.android.internal.statusbar.IStatusBar#showTransient */ - void showTransient(int displayId, @InternalInsetsType int[] types); + void showTransient(int displayId, @InternalInsetsType int[] types, + boolean isGestureOnSystemBar); /** @see com.android.internal.statusbar.IStatusBar#abortTransient */ void abortTransient(int displayId, @InternalInsetsType int[] types); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index b58ca1f4ef80..18b2a0e4ff1f 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -540,11 +540,12 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void showTransient(int displayId, @InternalInsetsType int[] types) { + public void showTransient(int displayId, @InternalInsetsType int[] types, + boolean isGestureOnSystemBar) { getUiState(displayId).showTransient(types); if (mBar != null) { try { - mBar.showTransient(displayId, types); + mBar.showTransient(displayId, types, isGestureOnSystemBar); } catch (RemoteException ex) { } } } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index d1e9d6b60038..40549548da62 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -4165,10 +4165,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp final SurfaceControl newParent = computeImeParent(); if (newParent != null && newParent != mInputMethodSurfaceParent) { mInputMethodSurfaceParent = newParent; - getPendingTransaction().reparent(mImeWindowsContainer.mSurfaceControl, newParent); + getSyncTransaction().reparent(mImeWindowsContainer.mSurfaceControl, newParent); // When surface parent is removed, the relative layer will also be removed. We need to // do a force update to make sure there is a layer set for the new parent. - assignRelativeLayerForIme(getPendingTransaction(), true /* forceUpdate */); + assignRelativeLayerForIme(getSyncTransaction(), true /* forceUpdate */); scheduleAnimation(); } } @@ -5009,8 +5009,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // exists so it get's layered above the starting window. if (imeTarget != null && !(imeTarget.mActivityRecord != null && imeTarget.mActivityRecord.hasStartingWindow())) { + final WindowToken imeControlTargetToken = + mImeControlTarget != null && mImeControlTarget.getWindow() != null + ? mImeControlTarget.getWindow().mToken : null; final boolean canImeTargetSetRelativeLayer = imeTarget.getSurfaceControl() != null - && imeTarget == mImeControlTarget + && imeTarget.mToken == imeControlTargetToken && !imeTarget.inMultiWindowMode() && imeTarget.mToken.getActivity(app -> app.isAnimating(TRANSITION | PARENTS, ANIMATION_TYPE_ALL & ~ANIMATION_TYPE_RECENTS)) == null; diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index d5d206ac5fc4..ef3c5a3df84e 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -429,7 +429,7 @@ public class DisplayPolicy { WindowState targetBar = (msg.arg1 == MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS) ? getStatusBar() : getNavigationBar(); if (targetBar != null) { - requestTransientBars(targetBar); + requestTransientBars(targetBar, true /* isGestureOnSystemBar */); } } break; @@ -480,26 +480,25 @@ public class DisplayPolicy { // TODO(b/181821798) Migrate SystemGesturesPointerEventListener to use window context. mSystemGestures = new SystemGesturesPointerEventListener(mUiContext, mHandler, new SystemGesturesPointerEventListener.Callbacks() { + @Override public void onSwipeFromTop() { synchronized (mLock) { - if (mStatusBar != null) { - requestTransientBars(mStatusBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_TOP, - false /* allowForAllPositions */); + final WindowState bar = mStatusBar != null + ? mStatusBar + : findAltBarMatchingPosition(ALT_BAR_TOP); + requestTransientBars(bar, true /* isGestureOnSystemBar */); } } @Override public void onSwipeFromBottom() { synchronized (mLock) { - if (mNavigationBar != null - && mNavigationBarPosition == NAV_BAR_BOTTOM) { - requestTransientBars(mNavigationBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_BOTTOM, - false /* allowForAllPositions */); + final WindowState bar = mNavigationBar != null + && mNavigationBarPosition == NAV_BAR_BOTTOM + ? mNavigationBar + : findAltBarMatchingPosition(ALT_BAR_BOTTOM); + requestTransientBars(bar, true /* isGestureOnSystemBar */); } } @@ -509,13 +508,8 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); - final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture && - !mSystemGestures.currentGestureStartedInRegion(excludedRegion); - if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_RIGHT - || allowSideSwipe)) { - requestTransientBars(mNavigationBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_RIGHT, allowSideSwipe); + requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_RIGHT, + ALT_BAR_RIGHT); } excludedRegion.recycle(); } @@ -526,17 +520,33 @@ public class DisplayPolicy { synchronized (mLock) { mDisplayContent.calculateSystemGestureExclusion( excludedRegion, null /* outUnrestricted */); - final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture && - !mSystemGestures.currentGestureStartedInRegion(excludedRegion); - if (mNavigationBar != null && (mNavigationBarPosition == NAV_BAR_LEFT - || allowSideSwipe)) { - requestTransientBars(mNavigationBar); - } - checkAltBarSwipeForTransientBars(ALT_BAR_LEFT, allowSideSwipe); + requestTransientBarsForSideSwipe(excludedRegion, NAV_BAR_LEFT, + ALT_BAR_LEFT); } excludedRegion.recycle(); } + private void requestTransientBarsForSideSwipe(Region excludedRegion, + int navBarSide, int altBarSide) { + final WindowState barMatchingSide = mNavigationBar != null + && mNavigationBarPosition == navBarSide + ? mNavigationBar + : findAltBarMatchingPosition(altBarSide); + final boolean allowSideSwipe = mNavigationBarAlwaysShowOnSideGesture && + !mSystemGestures.currentGestureStartedInRegion(excludedRegion); + if (barMatchingSide == null && !allowSideSwipe) { + return; + } + + // Request transient bars on the matching bar, or any bar if we always allow + // side swipes to show the bars + final boolean isGestureOnSystemBar = barMatchingSide != null; + final WindowState bar = barMatchingSide != null + ? barMatchingSide + : findTransientNavOrAltBar(); + requestTransientBars(bar, isGestureOnSystemBar); + } + @Override public void onFling(int duration) { if (mService.mPowerManagerInternal != null) { @@ -686,21 +696,39 @@ public class DisplayPolicy { mHandler.post(mGestureNavigationSettingsObserver::register); } - private void checkAltBarSwipeForTransientBars(@WindowManagerPolicy.AltBarPosition int pos, - boolean allowForAllPositions) { - if (mStatusBarAlt != null && (mStatusBarAltPosition == pos || allowForAllPositions)) { - requestTransientBars(mStatusBarAlt); + /** + * Returns the first non-null alt bar window matching the given position. + */ + private WindowState findAltBarMatchingPosition(@WindowManagerPolicy.AltBarPosition int pos) { + if (mStatusBarAlt != null && mStatusBarAltPosition == pos) { + return mStatusBarAlt; } - if (mNavigationBarAlt != null - && (mNavigationBarAltPosition == pos || allowForAllPositions)) { - requestTransientBars(mNavigationBarAlt); + if (mNavigationBarAlt != null && mNavigationBarAltPosition == pos) { + return mNavigationBarAlt; } - if (mClimateBarAlt != null && (mClimateBarAltPosition == pos || allowForAllPositions)) { - requestTransientBars(mClimateBarAlt); + if (mClimateBarAlt != null && mClimateBarAltPosition == pos) { + return mClimateBarAlt; } - if (mExtraNavBarAlt != null && (mExtraNavBarAltPosition == pos || allowForAllPositions)) { - requestTransientBars(mExtraNavBarAlt); + if (mExtraNavBarAlt != null && mExtraNavBarAltPosition == pos) { + return mExtraNavBarAlt; + } + return null; + } + + /** + * Finds the first non-null nav bar to request transient for. + */ + private WindowState findTransientNavOrAltBar() { + if (mNavigationBar != null) { + return mNavigationBar; + } + if (mNavigationBarAlt != null) { + return mNavigationBarAlt; + } + if (mExtraNavBarAlt != null) { + return mExtraNavBarAlt; } + return null; } void systemReady() { @@ -2622,8 +2650,8 @@ public class DisplayPolicy { updateSystemBarAttributes(); } - private void requestTransientBars(WindowState swipeTarget) { - if (!mService.mPolicy.isUserSetupComplete()) { + private void requestTransientBars(WindowState swipeTarget, boolean isGestureOnSystemBar) { + if (swipeTarget == null || !mService.mPolicy.isUserSetupComplete()) { // Swipe-up for navigation bar is disabled during setup return; } @@ -2659,7 +2687,8 @@ public class DisplayPolicy { if (controlTarget.canShowTransient()) { // Show transient bars if they are hidden; restore position if they are visible. - mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_SWIPE); + mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_SWIPE, + isGestureOnSystemBar); controlTarget.showInsets(restorePositionTypes, false); } else { // Restore visibilities and positions of system bars. @@ -2881,7 +2910,8 @@ public class DisplayPolicy { // we're no longer on the Keyguard and the screen is ready. We can now request the bars. mPendingPanicGestureUptime = 0; if (!isNavBarEmpty(disableFlags)) { - mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_PANIC); + mDisplayContent.getInsetsPolicy().showTransient(SHOW_TYPES_FOR_PANIC, + true /* isGestureOnSystemBar */); } } diff --git a/services/core/java/com/android/server/wm/InsetsPolicy.java b/services/core/java/com/android/server/wm/InsetsPolicy.java index 3d19f54ad132..10ae152c3365 100644 --- a/services/core/java/com/android/server/wm/InsetsPolicy.java +++ b/services/core/java/com/android/server/wm/InsetsPolicy.java @@ -159,7 +159,7 @@ class InsetsPolicy { return provider != null && provider.hasWindow() && !provider.getSource().isVisible(); } - void showTransient(@InternalInsetsType int[] types) { + void showTransient(@InternalInsetsType int[] types, boolean isGestureOnSystemBar) { boolean changed = false; for (int i = types.length - 1; i >= 0; i--) { final @InternalInsetsType int type = types[i]; @@ -176,8 +176,8 @@ class InsetsPolicy { StatusBarManagerInternal statusBarManagerInternal = mPolicy.getStatusBarManagerInternal(); if (statusBarManagerInternal != null) { - statusBarManagerInternal.showTransient( - mDisplayContent.getDisplayId(), mShowingTransientTypes.toArray()); + statusBarManagerInternal.showTransient(mDisplayContent.getDisplayId(), + mShowingTransientTypes.toArray(), isGestureOnSystemBar); } updateBarControlTarget(mFocusedWin); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index a8032f4d2954..33235d03439f 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -5041,8 +5041,7 @@ class Task extends TaskFragment { if (topFragment == f) { return; } - if (!f.isFocusableAndVisible()) { - // No need to resume activity in TaskFragment that is not visible. + if (!f.canBeResumed(null /* starting */)) { return; } resumed[0] |= f.resumeTopActivity(prev, options, deferPause); diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index ec3554a4f0f6..e0e287699299 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -38,7 +38,6 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION; import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityTaskManagerService.TAG_ROOT_TASK; import static com.android.server.wm.DisplayContent.alwaysCreateRootTask; -import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ROOT_TASK; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -1475,9 +1474,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { leafTask.forAllLeafTaskFragments((taskFrag) -> { final ActivityRecord resumedActivity = taskFrag.getResumedActivity(); - if (resumedActivity != null - && (taskFrag.getVisibility(resuming) != TASK_FRAGMENT_VISIBILITY_VISIBLE - || !taskFrag.isTopActivityFocusable())) { + if (resumedActivity != null && !taskFrag.canBeResumed(resuming)) { if (taskFrag.startPausing(false /* uiSleeping*/, resuming, "pauseBackTasks")) { someActivityPaused[0]++; } diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 916fa5be12d8..efd51e99a26a 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -1359,6 +1359,17 @@ class TaskFragment extends WindowContainer<WindowContainer> { return getVisibility(starting) != TASK_FRAGMENT_VISIBILITY_INVISIBLE; } + /** + * Returns {@code true} is the activity in this TaskFragment can be resumed. + * + * @param starting The currently starting activity or {@code null} if there is none. + */ + boolean canBeResumed(@Nullable ActivityRecord starting) { + // No need to resume activity in TaskFragment that is not visible. + return isTopActivityFocusable() + && getVisibility(starting) == TASK_FRAGMENT_VISIBILITY_VISIBLE; + } + boolean isFocusableAndVisible() { return isTopActivityFocusable() && shouldBeVisible(null /* starting */); } diff --git a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp index 4190a91710fc..94bc22a05d7a 100644 --- a/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp +++ b/services/core/jni/com_android_server_am_CachedAppOptimizer.cpp @@ -59,6 +59,9 @@ using android::base::unique_fd; namespace android { +static bool cancelRunningCompaction; +static bool compactionInProgress; + // Legacy method for compacting processes, any new code should // use compactProcess instead. static inline void compactProcessProcfs(int pid, const std::string& compactionType) { @@ -83,9 +86,18 @@ static int64_t compactMemory(const std::vector<Vma>& vmas, int pid, int madviseT // Skip compaction if failed to open pidfd with any error return -errno; } + compactionInProgress = true; + cancelRunningCompaction = false; int64_t totalBytesCompacted = 0; for (int iBase = 0; iBase < vmas.size(); iBase += UIO_MAXIOV) { + if (CC_UNLIKELY(cancelRunningCompaction)) { + // There could be a significant delay betweenwhen a compaction + // is requested and when it is handled during this time + // our OOM adjust could have improved. + cancelRunningCompaction = false; + break; + } int totalVmasToKernel = std::min(UIO_MAXIOV, (int)(vmas.size() - iBase)); for (int iVec = 0, iVma = iBase; iVec < totalVmasToKernel; ++iVec, ++iVma) { vmasToKernel[iVec].iov_base = (void*)vmas[iVma].start; @@ -95,11 +107,13 @@ static int64_t compactMemory(const std::vector<Vma>& vmas, int pid, int madviseT auto bytesCompacted = process_madvise(pidfd, vmasToKernel, totalVmasToKernel, madviseType, 0); if (CC_UNLIKELY(bytesCompacted == -1)) { + compactionInProgress = false; return -errno; } totalBytesCompacted += bytesCompacted; } + compactionInProgress = false; return totalBytesCompacted; } @@ -228,6 +242,12 @@ static void com_android_server_am_CachedAppOptimizer_compactSystem(JNIEnv *, job } } +static void com_android_server_am_CachedAppOptimizer_cancelCompaction(JNIEnv*, jobject) { + if (compactionInProgress) { + cancelRunningCompaction = true; + } +} + static void com_android_server_am_CachedAppOptimizer_compactProcess(JNIEnv*, jobject, jint pid, jint compactionFlags) { compactProcessOrFallback(pid, compactionFlags); @@ -279,6 +299,8 @@ static jstring com_android_server_am_CachedAppOptimizer_getFreezerCheckPath(JNIE static const JNINativeMethod sMethods[] = { /* name, signature, funcPtr */ + {"cancelCompaction", "()V", + (void*)com_android_server_am_CachedAppOptimizer_cancelCompaction}, {"compactSystem", "()V", (void*)com_android_server_am_CachedAppOptimizer_compactSystem}, {"compactProcess", "(II)V", (void*)com_android_server_am_CachedAppOptimizer_compactProcess}, {"freezeBinder", "(IZ)I", (void*)com_android_server_am_CachedAppOptimizer_freezeBinder}, diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index d0ca298b1219..41e605bea0a4 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -258,6 +258,7 @@ import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; +import android.os.UserManager.UserRestrictionSource; import android.os.storage.StorageManager; import android.permission.AdminPermissionControlParams; import android.permission.IPermissionManager; @@ -286,6 +287,7 @@ import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; +import android.util.DebugUtils; import android.util.IndentingPrintWriter; import android.util.Log; import android.util.Pair; @@ -13225,14 +13227,29 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { try { List<UserManager.EnforcingUser> sources = mUserManager .getUserRestrictionSources(restriction, UserHandle.of(userId)); - if (sources == null || sources.isEmpty()) { + if (sources == null) { // The restriction is not enforced. return null; - } else if (sources.size() > 1) { + } + int sizeBefore = sources.size(); + if (sizeBefore > 1) { + Slogf.d(LOG_TAG, "getEnforcingAdminAndUserDetailsInternal(%d, %s): " + + "%d sources found, excluding those set by UserManager", + userId, restriction, sizeBefore); + sources = getDevicePolicySources(sources); + } + if (sources.isEmpty()) { + // The restriction is not enforced (or is just enforced by the system) + return null; + } + + if (sources.size() > 1) { // In this case, we'll show an admin support dialog that does not // specify the admin. // TODO(b/128928355): if this restriction is enforced by multiple DPCs, return // the admin for the calling user. + Slogf.w(LOG_TAG, "getEnforcingAdminAndUserDetailsInternal(%d, %s): multiple " + + "sources for restriction %s on user %d", restriction, userId); result = new Bundle(); result.putInt(Intent.EXTRA_USER_ID, userId); return result; @@ -13278,6 +13295,32 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } /** + * Excludes restrictions imposed by UserManager. + */ + private List<UserManager.EnforcingUser> getDevicePolicySources( + List<UserManager.EnforcingUser> sources) { + int sizeBefore = sources.size(); + List<UserManager.EnforcingUser> realSources = new ArrayList<>(sizeBefore); + for (int i = 0; i < sizeBefore; i++) { + UserManager.EnforcingUser source = sources.get(i); + int type = source.getUserRestrictionSource(); + if (type != UserManager.RESTRICTION_SOURCE_PROFILE_OWNER + && type != UserManager.RESTRICTION_SOURCE_DEVICE_OWNER) { + // TODO(b/128928355): add unit test + Slogf.d(LOG_TAG, "excluding source of type %s at index %d", + userRestrictionSourceToString(type), i); + continue; + } + realSources.add(source); + } + return realSources; + } + + private static String userRestrictionSourceToString(@UserRestrictionSource int source) { + return DebugUtils.flagsToString(UserManager.class, "RESTRICTION_", source); + } + + /** * @param restriction The restriction enforced by admin. It could be any user restriction or * policy like {@link DevicePolicyManager#POLICY_DISABLE_CAMERA} and * {@link DevicePolicyManager#POLICY_DISABLE_SCREEN_CAPTURE}. diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt index 886b2e03a104..347952bcebb0 100644 --- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt +++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/verify/domain/DomainVerificationEnforcerTest.kt @@ -19,6 +19,7 @@ package com.android.server.pm.test.verify.domain import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.content.pm.PackageParser.SigningDetails import android.content.pm.PackageUserState import android.content.pm.parsing.component.ParsedActivity import android.content.pm.parsing.component.ParsedIntentInfo @@ -27,6 +28,7 @@ import android.content.pm.verify.domain.DomainVerificationState import android.os.Build import android.os.Process import android.util.ArraySet +import android.util.IndentingPrintWriter import android.util.SparseArray import androidx.test.platform.app.InstrumentationRegistry import com.android.server.pm.PackageSetting @@ -47,6 +49,7 @@ import org.mockito.Mockito.anyInt import org.mockito.Mockito.anyLong import org.mockito.Mockito.anyString import org.mockito.Mockito.eq +import org.mockito.Mockito.mock import org.mockito.Mockito.verifyNoMoreInteractions import java.io.File import java.util.UUID @@ -206,6 +209,14 @@ class DomainVerificationEnforcerTest { service(Type.QUERENT, "getInfo") { getDomainVerificationInfo(it.targetPackageName) }, + service(Type.QUERENT, "printState") { + printState(mock(IndentingPrintWriter::class.java), null, null) + }, + service(Type.QUERENT, "printStateInternal") { + printState(mock(IndentingPrintWriter::class.java), null, null) { + mockPkgSetting(it, UUID.randomUUID()) + } + }, service(Type.VERIFIER, "setStatus") { setDomainVerificationStatus( it.targetDomainSetId, @@ -311,6 +322,7 @@ class DomainVerificationEnforcerTest { } ) } + whenever(signingDetails) { SigningDetails.UNKNOWN } } fun mockPkgSetting(packageName: String, domainSetId: UUID) = spyThrowOnUnmocked( @@ -339,6 +351,7 @@ class DomainVerificationEnforcerTest { whenever(readUserState(1)) { PackageUserState() } whenever(getInstantApp(anyInt())) { false } whenever(isSystem()) { false } + whenever(signingDetails) { SigningDetails.UNKNOWN } } } @@ -385,6 +398,7 @@ class DomainVerificationEnforcerTest { val allowUserState = AtomicBoolean(false) val allowPreferredApps = AtomicBoolean(false) val allowQueryAll = AtomicBoolean(false) + val allowDump = AtomicBoolean(false) val context: Context = mockThrowOnUnmocked { initPermission( allowUserState, @@ -395,6 +409,7 @@ class DomainVerificationEnforcerTest { android.Manifest.permission.SET_PREFERRED_APPLICATIONS ) initPermission(allowQueryAll, android.Manifest.permission.QUERY_ALL_PACKAGES) + initPermission(allowDump, android.Manifest.permission.DUMP) } val target = params.construct(context) @@ -421,6 +436,10 @@ class DomainVerificationEnforcerTest { allowQueryAll.set(true) assertFails { runMethod(target, NON_VERIFIER_UID) } + + allowDump.set(true) + + runMethod(target, NON_VERIFIER_UID) } private fun approvedVerifier() { @@ -806,8 +825,12 @@ class DomainVerificationEnforcerTest { } val valueAsInt = value as? Int - if (valueAsInt != null && valueAsInt == DomainVerificationManager.STATUS_OK) { - throw AssertionError("Expected call to return false, was $value") + if (valueAsInt != null) { + if (valueAsInt == DomainVerificationManager.STATUS_OK) { + throw AssertionError("Expected call to return false, was $value") + } + } else { + throw AssertionError("Expected call to fail") } } catch (e: SecurityException) { } catch (e: PackageManager.NameNotFoundException) { @@ -819,7 +842,7 @@ class DomainVerificationEnforcerTest { // System/shell only INTERNAL, - // INTERNAL || non-legacy domain verification agent + // INTERNAL || non-legacy domain verification agent || DUMP permission QUERENT, // INTERNAL || domain verification agent diff --git a/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java b/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java index 5c7a580a2593..1c49e6e64dd8 100644 --- a/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/apphibernation/AppHibernationServiceTest.java @@ -146,12 +146,15 @@ public final class AppHibernationServiceTest { } @Test - public void testSetHibernatingForUser_packageIsHibernating() { + public void testSetHibernatingForUser_packageIsHibernating() throws Exception { // WHEN we hibernate a package for a user mAppHibernationService.setHibernatingForUser(PACKAGE_NAME_1, USER_ID_1, true); // THEN the package is marked hibernating for the user assertTrue(mAppHibernationService.isHibernatingForUser(PACKAGE_NAME_1, USER_ID_1)); + verify(mIActivityManager).forceStopPackage(PACKAGE_NAME_1, USER_ID_1); + verify(mIPackageManager).deleteApplicationCacheFilesAsUser( + eq(PACKAGE_NAME_1), eq(USER_ID_1), any()); } @Test @@ -204,6 +207,7 @@ public final class AppHibernationServiceTest { // THEN the package is marked hibernating for the user assertTrue(mAppHibernationService.isHibernatingGlobally(PACKAGE_NAME_1)); + verify(mPackageManagerInternal).deleteOatArtifactsOfPackage(PACKAGE_NAME_1); } @Test diff --git a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java index 11554c7a7dc5..6334e9d3cdc5 100644 --- a/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/uwb/UwbServiceImplTest.java @@ -82,6 +82,8 @@ public class UwbServiceImplTest { MockitoAnnotations.initMocks(this); when(mUwbInjector.getVendorService()).thenReturn(mVendorService); when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(true); + when(mUwbInjector.isPersistedUwbStateEnabled()).thenReturn(true); + when(mUwbInjector.isAirplaneModeOn()).thenReturn(false); when(mVendorService.asBinder()).thenReturn(mVendorServiceBinder); mUwbServiceImpl = new UwbServiceImpl(mContext, mUwbInjector); } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index c994b41be593..e98d077836e0 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -93,6 +93,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; +import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.ActivityManagerInternal; import android.app.AlarmManager; @@ -221,12 +222,15 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.concurrent.CountDownLatch; import java.util.function.Consumer; @SmallTest @RunWith(AndroidTestingRunner.class) @RunWithLooper +@SuppressLint("GuardedBy") // It's ok for this test to access guarded methods from the service. public class NotificationManagerServiceTest extends UiServiceTestCase { private static final String TEST_CHANNEL_ID = "NotificationManagerServiceTestChannelId"; private static final int UID_HEADLESS = 1000000; @@ -2440,7 +2444,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { .thenReturn(associations); NotificationChannelGroup ncg = new NotificationChannelGroup("a", "b/c"); mService.setPreferencesHelper(mPreferencesHelper); - when(mPreferencesHelper.getNotificationChannelGroup(eq(ncg.getId()), eq(PKG), anyInt())) + when(mPreferencesHelper.getNotificationChannelGroupWithChannels( + eq(PKG), anyInt(), eq(ncg.getId()), anyBoolean())) .thenReturn(ncg); reset(mListeners); mBinderService.deleteNotificationChannelGroup(PKG, ncg.getId()); @@ -2450,6 +2455,56 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { } @Test + public void testDeleteChannelGroupChecksForFgses() throws Exception { + List<String> associations = new ArrayList<>(); + associations.add("a"); + when(mCompanionMgr.getAssociations(PKG, UserHandle.getUserId(mUid))) + .thenReturn(associations); + CountDownLatch latch = new CountDownLatch(2); + mService.createNotificationChannelGroup( + PKG, mUid, new NotificationChannelGroup("group", "group"), true, false); + new Thread(() -> { + NotificationChannel notificationChannel = new NotificationChannel("id", "id", + NotificationManager.IMPORTANCE_HIGH); + notificationChannel.setGroup("group"); + ParceledListSlice<NotificationChannel> pls = + new ParceledListSlice(ImmutableList.of(notificationChannel)); + try { + mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + latch.countDown(); + }).start(); + new Thread(() -> { + try { + synchronized (this) { + wait(5000); + } + mService.createNotificationChannelGroup(PKG, mUid, + new NotificationChannelGroup("new", "new group"), true, false); + NotificationChannel notificationChannel = + new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH); + notificationChannel.setGroup("new"); + ParceledListSlice<NotificationChannel> pls = + new ParceledListSlice(ImmutableList.of(notificationChannel)); + try { + mBinderService.createNotificationChannelsForPackage(PKG, mUid, pls); + mBinderService.deleteNotificationChannelGroup(PKG, "group"); + } catch (RemoteException e) { + throw new RuntimeException(e); + } + } catch (Exception e) { + e.printStackTrace(); + } + latch.countDown(); + }).start(); + + latch.await(); + verify(mAmi).hasForegroundServiceNotification(anyString(), anyInt(), anyString()); + } + + @Test public void testUpdateNotificationChannelFromPrivilegedListener_success() throws Exception { mService.setPreferencesHelper(mPreferencesHelper); List<String> associations = new ArrayList<>(); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java index 07d467bc07d5..ea5bf52af905 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java @@ -291,7 +291,8 @@ public class InsetsPolicyTest extends WindowTestsBase { assertFalse(mDisplayContent.getInsetsStateController().getRawInsetsState() .getSource(ITYPE_NAVIGATION_BAR).isVisible()); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}); + policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, + true /* isGestureOnSystemBar */); waitUntilWindowAnimatorIdle(); final InsetsSourceControl[] controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow); @@ -319,7 +320,8 @@ public class InsetsPolicyTest extends WindowTestsBase { final InsetsPolicy policy = spy(mDisplayContent.getInsetsPolicy()); doNothing().when(policy).startAnimation(anyBoolean(), any()); policy.updateBarControlTarget(mAppWindow); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}); + policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, + true /* isGestureOnSystemBar */); waitUntilWindowAnimatorIdle(); final InsetsSourceControl[] controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow); @@ -351,7 +353,8 @@ public class InsetsPolicyTest extends WindowTestsBase { final InsetsPolicy policy = spy(mDisplayContent.getInsetsPolicy()); doNothing().when(policy).startAnimation(anyBoolean(), any()); policy.updateBarControlTarget(mAppWindow); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}); + policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, + true /* isGestureOnSystemBar */); waitUntilWindowAnimatorIdle(); InsetsSourceControl[] controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(mAppWindow); @@ -402,7 +405,8 @@ public class InsetsPolicyTest extends WindowTestsBase { final InsetsPolicy policy = spy(mDisplayContent.getInsetsPolicy()); doNothing().when(policy).startAnimation(anyBoolean(), any()); policy.updateBarControlTarget(app); - policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}); + policy.showTransient(new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR}, + true /* isGestureOnSystemBar */); final InsetsSourceControl[] controls = mDisplayContent.getInsetsStateController().getControlsForDispatch(app); policy.updateBarControlTarget(app2); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index f8c84df53749..94bc7f2dc0d1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -332,7 +332,8 @@ public class InsetsStateControllerTest extends WindowTestsBase { assertTrue(rotatedState.getSource(ITYPE_STATUS_BAR).isVisible()); provider.getSource().setVisible(false); - mDisplayContent.getInsetsPolicy().showTransient(new int[] { ITYPE_STATUS_BAR }); + mDisplayContent.getInsetsPolicy().showTransient(new int[] { ITYPE_STATUS_BAR }, + true /* isGestureOnSystemBar */); assertTrue(mDisplayContent.getInsetsPolicy().isTransient(ITYPE_STATUS_BAR)); assertFalse(app.getInsetsState().getSource(ITYPE_STATUS_BAR).isVisible()); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java index bfaa8150cb99..4ba3f63f5e63 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskTests.java @@ -44,6 +44,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; import static com.android.server.policy.WindowManagerPolicy.USER_ROTATION_FREE; import static com.android.server.wm.Task.FLAG_FORCE_HIDDEN_FOR_TASK_ORG; +import static com.android.server.wm.TaskFragment.TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT; import static com.google.common.truth.Truth.assertThat; @@ -66,6 +67,7 @@ import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.never; import android.app.ActivityManager; +import android.app.ActivityOptions; import android.app.TaskInfo; import android.app.WindowConfiguration; import android.content.ComponentName; @@ -1424,6 +1426,29 @@ public class TaskTests extends WindowTestsBase { verify(task2).moveToFrontInner(anyString(), isNull()); } + @Test + public void testResumeTask_doNotResumeTaskFragmentBehindTranslucent() { + final Task task = createTask(mDisplayContent); + final TaskFragment tfBehind = createTaskFragmentWithParentTask( + task, false /* createEmbeddedTask */); + final TaskFragment tfFront = createTaskFragmentWithParentTask( + task, false /* createEmbeddedTask */); + spyOn(tfFront); + doReturn(true).when(tfFront).isTranslucent(any()); + + // TaskFragment behind another translucent TaskFragment should not be resumed. + assertEquals(TASK_FRAGMENT_VISIBILITY_VISIBLE_BEHIND_TRANSLUCENT, + tfBehind.getVisibility(null /* starting */)); + assertTrue(tfBehind.isFocusable()); + assertFalse(tfBehind.canBeResumed(null /* starting */)); + + spyOn(tfBehind); + task.resumeTopActivityUncheckedLocked(null /* prev */, ActivityOptions.makeBasic(), + false /* deferPause */); + + verify(tfBehind, never()).resumeTopActivity(any(), any(), anyBoolean()); + } + private Task getTestTask() { final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build(); return task.getBottomMostTask(); diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java index 049966c7310d..4dffe7e8345b 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java @@ -428,6 +428,25 @@ public class ZOrderingTests extends WindowTestsBase { assertWindowHigher(mImeWindow, imeAppTarget); } + @Test + public void testAssignWindowLayers_ForImeOnPopupImeLayeringTarget() { + final WindowState imeAppTarget = createWindow(null, TYPE_APPLICATION, + mAppWindow.mActivityRecord, "imeAppTarget"); + mDisplayContent.setImeInputTarget(imeAppTarget); + mDisplayContent.setImeLayeringTarget(imeAppTarget); + mDisplayContent.setImeControlTarget(imeAppTarget); + + // Set a popup IME layering target and keeps the original IME control target behinds it. + final WindowState popupImeTargetWin = createWindow(imeAppTarget, + TYPE_APPLICATION_SUB_PANEL, mAppWindow.mActivityRecord, "popupImeTargetWin"); + mDisplayContent.setImeLayeringTarget(popupImeTargetWin); + mDisplayContent.updateImeParent(); + + // Ime should on top of the popup IME layering target window. + mDisplayContent.assignChildLayers(mTransaction); + assertWindowHigher(mImeWindow, popupImeTargetWin); + } + @Test public void testAssignWindowLayers_ForNegativelyZOrderedSubtype() { diff --git a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java index 0c65cc40bd82..286cff90daab 100644 --- a/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java +++ b/services/usb/java/com/android/server/usb/UsbUserPermissionManager.java @@ -688,6 +688,8 @@ class UsbUserPermissionManager { String packageName, PendingIntent pi, int uid) { + boolean throwException = false; + // compare uid with packageName to foil apps pretending to be someone else try { ApplicationInfo aInfo = mContext.getPackageManager().getApplicationInfo(packageName, 0); @@ -695,11 +697,13 @@ class UsbUserPermissionManager { Slog.w(TAG, "package " + packageName + " does not match caller's uid " + uid); EventLog.writeEvent(SNET_EVENT_LOG_ID, "180104273", -1, ""); - throw new IllegalArgumentException("package " + packageName - + " not found"); + throwException = true; } } catch (PackageManager.NameNotFoundException e) { - throw new IllegalArgumentException("package " + packageName + " not found"); + throwException = true; + } finally { + if (throwException) + throw new IllegalArgumentException("package " + packageName + " not found"); } requestPermissionDialog(device, accessory, canBeDefault, packageName, uid, mContext, pi); diff --git a/services/uwb/java/com/android/server/uwb/UwbInjector.java b/services/uwb/java/com/android/server/uwb/UwbInjector.java index 64f1da1c8e16..a7a0500483c2 100644 --- a/services/uwb/java/com/android/server/uwb/UwbInjector.java +++ b/services/uwb/java/com/android/server/uwb/UwbInjector.java @@ -21,10 +21,13 @@ import static android.content.PermissionChecker.PERMISSION_GRANTED; import android.annotation.NonNull; import android.content.AttributionSource; +import android.content.ContentResolver; import android.content.Context; import android.content.PermissionChecker; import android.os.IBinder; import android.os.ServiceManager; +import android.provider.Settings; +import android.uwb.AdapterState; import android.uwb.IUwbAdapter; @@ -80,4 +83,23 @@ public class UwbInjector { mContext, UWB_RANGING, -1, attributionSource, message); return permissionCheckResult == PERMISSION_GRANTED; } + + /** Returns true if UWB state saved in Settings is enabled. */ + public boolean isPersistedUwbStateEnabled() { + final ContentResolver cr = mContext.getContentResolver(); + try { + return Settings.Global.getInt(cr, Settings.Global.UWB_ENABLED) + == AdapterState.STATE_ENABLED_ACTIVE; + } catch (Settings.SettingNotFoundException e) { + Settings.Global.putInt(cr, Settings.Global.UWB_ENABLED, + AdapterState.STATE_ENABLED_ACTIVE); + return true; + } + } + + /** Returns true if airplane mode is turned on. */ + public boolean isAirplaneModeOn() { + return Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, 0) == 1; + } } diff --git a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java index 4dd26a66cf0e..889e182af46b 100644 --- a/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java +++ b/services/uwb/java/com/android/server/uwb/UwbServiceImpl.java @@ -18,13 +18,19 @@ package com.android.server.uwb; import android.annotation.NonNull; import android.content.AttributionSource; +import android.content.BroadcastReceiver; +import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Binder; import android.os.IBinder; import android.os.PersistableBundle; import android.os.RemoteException; +import android.provider.Settings; import android.util.ArrayMap; import android.util.Log; +import android.uwb.AdapterState; import android.uwb.IUwbAdapter; import android.uwb.IUwbAdapterStateCallbacks; import android.uwb.IUwbRangingCallbacks; @@ -225,13 +231,20 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec mVendorUwbAdapter = null; } - private synchronized IUwbAdapter getVendorUwbAdapter() throws IllegalStateException { + private synchronized IUwbAdapter getVendorUwbAdapter() + throws IllegalStateException, RemoteException { if (mVendorUwbAdapter != null) return mVendorUwbAdapter; mVendorUwbAdapter = mUwbInjector.getVendorService(); if (mVendorUwbAdapter == null) { throw new IllegalStateException("No vendor service found!"); } Log.i(TAG, "Retrieved vendor service"); + long token = Binder.clearCallingIdentity(); + try { + mVendorUwbAdapter.setEnabled(isEnabled()); + } finally { + Binder.restoreCallingIdentity(token); + } linkToVendorServiceDeath(); return mVendorUwbAdapter; } @@ -239,6 +252,7 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec UwbServiceImpl(@NonNull Context context, @NonNull UwbInjector uwbInjector) { mContext = context; mUwbInjector = uwbInjector; + registerAirplaneModeReceiver(); } private void enforceUwbPrivilegedPermission() { @@ -320,6 +334,34 @@ public class UwbServiceImpl extends IUwbAdapter.Stub implements IBinder.DeathRec @Override public synchronized void setEnabled(boolean enabled) throws RemoteException { - getVendorUwbAdapter().setEnabled(enabled); + persistUwbState(enabled); + getVendorUwbAdapter().setEnabled(isEnabled()); + } + + private void persistUwbState(boolean enabled) { + final ContentResolver cr = mContext.getContentResolver(); + int state = enabled ? AdapterState.STATE_ENABLED_ACTIVE : AdapterState.STATE_DISABLED; + Settings.Global.putInt(cr, Settings.Global.UWB_ENABLED, state); + } + + private void registerAirplaneModeReceiver() { + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + handleAirplaneModeEvent(); + } + }, new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); + } + + private void handleAirplaneModeEvent() { + try { + getVendorUwbAdapter().setEnabled(isEnabled()); + } catch (RemoteException | IllegalStateException e) { + Log.e(TAG, "Unable to set UWB Adapter state.", e); + } + } + + private boolean isEnabled() { + return mUwbInjector.isPersistedUwbStateEnabled() && !mUwbInjector.isAirplaneModeOn(); } } diff --git a/telephony/java/android/telephony/data/QosBearerFilter.java b/telephony/java/android/telephony/data/QosBearerFilter.java index 54930d0266b7..fdb61ba6c606 100644 --- a/telephony/java/android/telephony/data/QosBearerFilter.java +++ b/telephony/java/android/telephony/data/QosBearerFilter.java @@ -18,6 +18,7 @@ package android.telephony.data; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.Nullable; import android.net.InetAddresses; import android.net.LinkAddress; import android.os.Parcel; @@ -38,11 +39,10 @@ import java.util.Objects; * @hide */ public final class QosBearerFilter implements Parcelable { - - private List<LinkAddress> localAddresses; - private List<LinkAddress> remoteAddresses; - private PortRange localPort; - private PortRange remotePort; + private @NonNull List<LinkAddress> localAddresses; + private @NonNull List<LinkAddress> remoteAddresses; + private @Nullable PortRange localPort; + private @Nullable PortRange remotePort; /** @hide */ @Retention(RetentionPolicy.SOURCE) @@ -59,13 +59,12 @@ public final class QosBearerFilter implements Parcelable { public static final int QOS_PROTOCOL_AH = android.hardware.radio.V1_6.QosProtocol.AH; public static final int QOS_MIN_PORT = android.hardware.radio.V1_6.QosPortRange.MIN; /** - * Hardcoded inplace of android.hardware.radio.V1_6.QosPortRange.MAX as it + * Hardcoded in place of android.hardware.radio.V1_6.QosPortRange.MAX as it * returns -1 due to uint16_t to int conversion in java. (TODO: Fix the HAL) */ public static final int QOS_MAX_PORT = 65535; // android.hardware.radio.V1_6.QosPortRange.MIN; - @QosProtocol - private int protocol; + private @QosProtocol int protocol; private int typeOfServiceMask; @@ -88,8 +87,7 @@ public final class QosBearerFilter implements Parcelable { public static final int QOS_FILTER_DIRECTION_BIDIRECTIONAL = android.hardware.radio.V1_6.QosFilterDirection.BIDIRECTIONAL; - @QosBearerFilterDirection - private int filterDirection; + private @QosBearerFilterDirection int filterDirection; /** * Specified the order in which the filter needs to be matched. @@ -106,9 +104,10 @@ public final class QosBearerFilter implements Parcelable { filterDirection = QOS_FILTER_DIRECTION_BIDIRECTIONAL; } - public QosBearerFilter(List<LinkAddress> localAddresses, List<LinkAddress> remoteAddresses, - PortRange localPort, PortRange remotePort, int protocol, int tos, - long flowLabel, long spi, int direction, int precedence) { + public QosBearerFilter(@NonNull List<LinkAddress> localAddresses, + @NonNull List<LinkAddress> remoteAddresses, @Nullable PortRange localPort, + @Nullable PortRange remotePort, @QosProtocol int protocol, int tos, long flowLabel, + long spi, @QosBearerFilterDirection int direction, int precedence) { this.localAddresses = localAddresses; this.remoteAddresses = remoteAddresses; this.localPort = localPort; @@ -121,19 +120,19 @@ public final class QosBearerFilter implements Parcelable { this.precedence = precedence; } - public List<LinkAddress> getLocalAddresses() { + public @NonNull List<LinkAddress> getLocalAddresses() { return localAddresses; } - public List<LinkAddress> getRemoteAddresses() { + public @NonNull List<LinkAddress> getRemoteAddresses() { return remoteAddresses; } - public PortRange getLocalPortRange() { + public @Nullable PortRange getLocalPortRange() { return localPort; } - public PortRange getRemotePortRange() { + public @Nullable PortRange getRemotePortRange() { return remotePort; } @@ -327,8 +326,8 @@ public final class QosBearerFilter implements Parcelable { && localAddresses.containsAll(other.localAddresses) && remoteAddresses.size() == other.remoteAddresses.size() && remoteAddresses.containsAll(other.remoteAddresses) - && localPort.equals(other.localPort) - && remotePort.equals(other.remotePort) + && Objects.equals(localPort, other.localPort) + && Objects.equals(remotePort, other.remotePort) && protocol == other.protocol && typeOfServiceMask == other.typeOfServiceMask && flowLabel == other.flowLabel |