diff options
27 files changed, 442 insertions, 294 deletions
diff --git a/core/java/android/view/contentcapture/ContentCaptureSession.java b/core/java/android/view/contentcapture/ContentCaptureSession.java index c6332686bf7f..cc47f09d4e8d 100644 --- a/core/java/android/view/contentcapture/ContentCaptureSession.java +++ b/core/java/android/view/contentcapture/ContentCaptureSession.java @@ -341,11 +341,7 @@ public abstract class ContentCaptureSession implements AutoCloseable { } } - try { - flush(FLUSH_REASON_SESSION_FINISHED); - } finally { - onDestroy(); - } + onDestroy(); } abstract void onDestroy(); diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index d8ac779ddc27..bcb914208958 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -263,7 +263,13 @@ public final class MainContentCaptureSession extends ContentCaptureSession { @Override void onDestroy() { mHandler.removeMessages(MSG_FLUSH); - mHandler.post(() -> destroySession()); + mHandler.post(() -> { + try { + flush(FLUSH_REASON_SESSION_FINISHED); + } finally { + destroySession(); + } + }); } /** @@ -571,9 +577,11 @@ public final class MainContentCaptureSession extends ContentCaptureSession { private ParceledListSlice<ContentCaptureEvent> clearEvents() { // NOTE: we must save a reference to the current mEvents and then set it to to null, // otherwise clearing it would clear it in the receiving side if the service is also local. - final List<ContentCaptureEvent> events = mEvents == null - ? Collections.EMPTY_LIST - : new ArrayList<>(mEvents); + if (mEvents == null) { + return new ParceledListSlice<>(Collections.EMPTY_LIST); + } + + final List<ContentCaptureEvent> events = new ArrayList<>(mEvents); mEvents.clear(); return new ParceledListSlice<>(events); } diff --git a/core/res/res/values-or/strings.xml b/core/res/res/values-or/strings.xml index b6e60d7f3cfb..b609827b9918 100644 --- a/core/res/res/values-or/strings.xml +++ b/core/res/res/values-or/strings.xml @@ -1458,10 +1458,8 @@ <string name="permdesc_requestDeletePackages" msgid="6133633516423860381">"ପ୍ୟାକେଜ୍ଗୁଡ଼ିକ ଡିଲିଟ୍ କରିବା ପାଇଁ ଅନୁରୋଧ କରିବାକୁ ଏକ ଆପ୍ଲିକେଶନକୁ ଅନୁମତି ଦେଇଥାଏ।"</string> <string name="permlab_requestIgnoreBatteryOptimizations" msgid="7646611326036631439">"ବ୍ୟାଟେରୀ ଅନୁକୂଳନ ଏଡ଼ାଇବା ପାଇଁ ପଚାରନ୍ତୁ"</string> <string name="permdesc_requestIgnoreBatteryOptimizations" msgid="634260656917874356">"ଆପ୍ ପାଇଁ ବ୍ୟାଟେରୀ ଅନୁକୂଳନ ଏଡ଼ାଇବାର ଅନୁମତି ମାଗିବା ନିମନ୍ତେ ଆପ୍କୁ ଅନୁମତି ଦେଇଥାଏ।"</string> - <!-- no translation found for permlab_queryAllPackages (2928450604653281650) --> - <skip /> - <!-- no translation found for permdesc_queryAllPackages (5339069855520996010) --> - <skip /> + <string name="permlab_queryAllPackages" msgid="2928450604653281650">"ସବୁ ପ୍ୟାକେଜ୍ ବିଷୟରେ କ୍ୱେରୀ କରନ୍ତୁ"</string> + <string name="permdesc_queryAllPackages" msgid="5339069855520996010">"ଇନଷ୍ଟଲ୍ କରାଯାଇଥିବା ସମସ୍ତ ପ୍ୟାକେଜକୁ ଦେଖିବା ପାଇଁ ଏକ ଆପକୁ ଅନୁମତି ଦିଏ।"</string> <string name="tutorial_double_tap_to_zoom_message_short" msgid="1842872462124648678">"ଜୁମ୍ ନିୟନ୍ତ୍ରଣ ପାଇଁ ଦୁଇଥର ଟାପ୍ କରନ୍ତୁ"</string> <string name="gadget_host_error_inflating" msgid="2449961590495198720">"ୱିଜେଟ୍ ଯୋଡ଼ିପାରିବ ନାହିଁ।"</string> <string name="ime_action_go" msgid="5536744546326495436">"ଯାଆନ୍ତୁ"</string> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java index 6451b94caaba..324a6e27a242 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipTaskOrganizer.java @@ -835,11 +835,14 @@ public class PipTaskOrganizer implements ShellTaskOrganizer.TaskListener, WindowContainerTransaction wct) { // note that this can be called when swipe-to-home or fixed-rotation is happening. // Skip this entirely if that's the case. - if ((mInSwipePipToHomeTransition || mWaitForFixedRotation) && fromRotation) { + final boolean waitForFixedRotationOnEnteringPip = mWaitForFixedRotation + && (mState != State.ENTERED_PIP); + if ((mInSwipePipToHomeTransition || waitForFixedRotationOnEnteringPip) && fromRotation) { if (DEBUG) { Log.d(TAG, "Skip onMovementBoundsChanged on rotation change" + " mInSwipePipToHomeTransition=" + mInSwipePipToHomeTransition - + " mWaitForFixedRotation=" + mWaitForFixedRotation); + + " mWaitForFixedRotation=" + mWaitForFixedRotation + + " mState=" + mState); } return; } diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml index 55de3775bcad..7d9b4d78ce2a 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout-v31/collapsing_toolbar_base_layout.xml @@ -21,8 +21,7 @@ android:id="@+id/content_parent" android:layout_width="match_parent" android:layout_height="match_parent" - android:fitsSystemWindows="true" - android:transitionGroup="true"> + android:fitsSystemWindows="true"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/app_bar" diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java index 8c2621d3e4ec..3a7fe3b92e78 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/SettingsTransitionActivity.java @@ -16,22 +16,8 @@ package com.android.settingslib.collapsingtoolbar; -import static com.android.settingslib.transition.SettingsTransitionHelper.EXTRA_PAGE_TRANSITION_TYPE; - -import android.app.ActivityOptions; -import android.content.Intent; -import android.os.Bundle; -import android.util.Log; -import android.view.Window; -import android.widget.Toolbar; - -import androidx.annotation.Nullable; -import androidx.core.os.BuildCompat; import androidx.fragment.app.FragmentActivity; -import com.android.settingslib.transition.SettingsTransitionHelper; -import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType; - /** * A base Activity for Settings-specific page transition. Activities extending it will get * Settings transition applied. @@ -39,57 +25,7 @@ import com.android.settingslib.transition.SettingsTransitionHelper.TransitionTyp public abstract class SettingsTransitionActivity extends FragmentActivity { private static final String TAG = "SettingsTransitionActivity"; - private Toolbar mToolbar; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - if (isSettingsTransitionEnabled()) { - getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); - SettingsTransitionHelper.applyForwardTransition(this); - SettingsTransitionHelper.applyBackwardTransition(this); - } - - super.onCreate(savedInstanceState); - } - - @Override - public void setActionBar(@Nullable Toolbar toolbar) { - super.setActionBar(toolbar); - - mToolbar = toolbar; - } - - @Override - public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) { - final int transitionType = intent.getIntExtra(EXTRA_PAGE_TRANSITION_TYPE, - TransitionType.TRANSITION_SHARED_AXIS); - if (!isSettingsTransitionEnabled() || - transitionType == TransitionType.TRANSITION_NONE) { - super.startActivityForResult(intent, requestCode, options); - return; - } - - super.startActivityForResult(intent, requestCode, - createActivityOptionsBundleForTransition(options)); - } - protected boolean isSettingsTransitionEnabled() { - return BuildCompat.isAtLeastS(); - } - - @Nullable - private Bundle createActivityOptionsBundleForTransition(@Nullable Bundle options) { - if (mToolbar == null) { - Log.w(TAG, "setActionBar(Toolbar) is not called. Cannot apply settings transition!"); - return options; - } - final Bundle transitionOptions = ActivityOptions.makeSceneTransitionAnimation(this, - mToolbar, "shared_element_view").toBundle(); - if (options == null) { - return transitionOptions; - } - final Bundle mergedOptions = new Bundle(options); - mergedOptions.putAll(transitionOptions); - return mergedOptions; + return false; } } diff --git a/packages/SettingsLib/SettingsTransition/Android.bp b/packages/SettingsLib/SettingsTransition/Android.bp index d8cd556ba85d..f06a9a7c0f43 100644 --- a/packages/SettingsLib/SettingsTransition/Android.bp +++ b/packages/SettingsLib/SettingsTransition/Android.bp @@ -11,7 +11,6 @@ android_library { name: "SettingsLibSettingsTransition", srcs: ["src/**/*.java"], - resource_dirs: ["res"], static_libs: [ "com.google.android.material_material", diff --git a/packages/SettingsLib/SettingsTransition/res/values/dimens.xml b/packages/SettingsLib/SettingsTransition/res/values/dimens.xml deleted file mode 100644 index 0630ca85b621..000000000000 --- a/packages/SettingsLib/SettingsTransition/res/values/dimens.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- 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. ---> - -<resources> - <dimen name="settings_shared_axis_x_slide_distance">96dp</dimen> -</resources>
\ No newline at end of file diff --git a/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java b/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java index a6eeb8867346..540f8c2ce1f5 100644 --- a/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java +++ b/packages/SettingsLib/SettingsTransition/src/com/android/settingslib/transition/SettingsTransitionHelper.java @@ -16,21 +16,11 @@ package com.android.settingslib.transition; -import androidx.annotation.IntDef; import android.app.Activity; -import android.content.Context; -import android.util.Log; -import android.view.Window; -import android.view.animation.AnimationUtils; -import android.view.animation.Interpolator; -import androidx.core.os.BuildCompat; +import androidx.annotation.IntDef; import androidx.fragment.app.Fragment; -import com.google.android.material.transition.platform.FadeThroughProvider; -import com.google.android.material.transition.platform.MaterialSharedAxis; -import com.google.android.material.transition.platform.SlideDistanceProvider; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -59,31 +49,6 @@ public class SettingsTransitionHelper { public static final String EXTRA_PAGE_TRANSITION_TYPE = "page_transition_type"; private static final String TAG = "SettingsTransitionHelper"; - private static final long DURATION = 450L; - private static final float FADE_THROUGH_THRESHOLD = 0.22F; - - private static MaterialSharedAxis createSettingsSharedAxis(Context context, boolean forward) { - final MaterialSharedAxis transition = new MaterialSharedAxis(MaterialSharedAxis.X, forward); - transition.excludeTarget(android.R.id.statusBarBackground, true); - transition.excludeTarget(android.R.id.navigationBarBackground, true); - - final SlideDistanceProvider forwardDistanceProvider = - (SlideDistanceProvider) transition.getPrimaryAnimatorProvider(); - final int distance = context.getResources().getDimensionPixelSize( - R.dimen.settings_shared_axis_x_slide_distance); - forwardDistanceProvider.setSlideDistance(distance); - transition.setDuration(DURATION); - - final FadeThroughProvider fadeThroughProvider = - (FadeThroughProvider) transition.getSecondaryAnimatorProvider(); - fadeThroughProvider.setProgressThreshold(FADE_THROUGH_THRESHOLD); - - final Interpolator interpolator = - AnimationUtils.loadInterpolator(context, R.interpolator.fast_out_extra_slow_in); - transition.setInterpolator(interpolator); - - return transition; - } /** * Apply the forward transition to the {@link Activity}, including Exit Transition and Enter @@ -92,23 +57,16 @@ public class SettingsTransitionHelper { * The Exit Transition takes effect when leaving the page, while the Enter Transition is * triggered when the page is launched/entering. */ - public static void applyForwardTransition(Activity activity) { - if (!isSettingsTransitionEnabled()) { - return; - } - if (activity == null) { - Log.w(TAG, "applyForwardTransition: Invalid activity!"); - return; - } - final Window window = activity.getWindow(); - if (window == null) { - Log.w(TAG, "applyForwardTransition: Invalid window!"); - return; - } - final MaterialSharedAxis forward = createSettingsSharedAxis(activity, true); - window.setExitTransition(forward); - window.setEnterTransition(forward); - } + public static void applyForwardTransition(Activity activity) {} + + /** + * Apply the forward transition to the {@link Fragment}, including Exit Transition and Enter + * Transition. + * + * The Exit Transition takes effect when leaving the page, while the Enter Transition is + * triggered when the page is launched/entering. + */ + public static void applyForwardTransition(Fragment fragment) {} /** * Apply the backward transition to the {@link Activity}, including Return Transition and @@ -118,43 +76,7 @@ public class SettingsTransitionHelper { * to close. Reenter Transition will be used to move Views in to the scene when returning from a * previously-started Activity. */ - public static void applyBackwardTransition(Activity activity) { - if (!isSettingsTransitionEnabled()) { - return; - } - if (activity == null) { - Log.w(TAG, "applyBackwardTransition: Invalid activity!"); - return; - } - final Window window = activity.getWindow(); - if (window == null) { - Log.w(TAG, "applyBackwardTransition: Invalid window!"); - return; - } - final MaterialSharedAxis backward = createSettingsSharedAxis(activity, false); - window.setReturnTransition(backward); - window.setReenterTransition(backward); - } - - /** - * Apply the forward transition to the {@link Fragment}, including Exit Transition and Enter - * Transition. - * - * The Exit Transition takes effect when leaving the page, while the Enter Transition is - * triggered when the page is launched/entering. - */ - public static void applyForwardTransition(Fragment fragment) { - if (!isSettingsTransitionEnabled()) { - return; - } - if (fragment == null) { - Log.w(TAG, "applyForwardTransition: Invalid fragment!"); - return; - } - final MaterialSharedAxis forward = createSettingsSharedAxis(fragment.getContext(), true); - fragment.setExitTransition(forward); - fragment.setEnterTransition(forward); - } + public static void applyBackwardTransition(Activity activity) {} /** * Apply the backward transition to the {@link Fragment}, including Return Transition and @@ -164,20 +86,5 @@ public class SettingsTransitionHelper { * to close. Reenter Transition will be used to move Views in to the scene when returning from a * previously-started Fragment. */ - public static void applyBackwardTransition(Fragment fragment) { - if (!isSettingsTransitionEnabled()) { - return; - } - if (fragment == null) { - Log.w(TAG, "applyBackwardTransition: Invalid fragment!"); - return; - } - final MaterialSharedAxis backward = createSettingsSharedAxis(fragment.getContext(), false); - fragment.setReturnTransition(backward); - fragment.setReenterTransition(backward); - } - - private static boolean isSettingsTransitionEnabled() { - return BuildCompat.isAtLeastS(); - } + public static void applyBackwardTransition(Fragment fragment) {} } diff --git a/packages/Shell/res/values-az/strings.xml b/packages/Shell/res/values-az/strings.xml index 15853c2cc270..23a1ad7abd7c 100644 --- a/packages/Shell/res/values-az/strings.xml +++ b/packages/Shell/res/values-az/strings.xml @@ -35,7 +35,7 @@ <string name="bugreport_add_details_to_zip_failed" msgid="1302931926486712371">"Zip faylı üçün baq hesabat detalları əlavə edilmədi"</string> <string name="bugreport_unnamed" msgid="2800582406842092709">"adsız"</string> <string name="bugreport_info_action" msgid="2158204228510576227">"Detallar"</string> - <string name="bugreport_screenshot_action" msgid="8677781721940614995">"displey görüntüsü"</string> + <string name="bugreport_screenshot_action" msgid="8677781721940614995">"Skrinşot"</string> <string name="bugreport_screenshot_taken" msgid="5684211273096253120">"Displey görüntüsü uğurla çəkildi."</string> <string name="bugreport_screenshot_failed" msgid="5853049140806834601">"Displey görüntüsü əlçatan deyil."</string> <string name="bugreport_info_dialog_title" msgid="1355948594292983332">"Baq hesabatı <xliff:g id="ID">#%d</xliff:g> detalları"</string> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 492e673a6f5c..f8d06ce76c24 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -480,12 +480,10 @@ <string name="user_add_user" msgid="4336657383006913022">"Voeg gebruiker by"</string> <string name="user_new_user_name" msgid="2019166282704195789">"Nuwe gebruiker"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"Verwyder gas?"</string> - <!-- no translation found for guest_reset_guest_dialog_title (8904781614074479690) --> - <skip /> + <string name="guest_reset_guest_dialog_title" msgid="8904781614074479690">"Stel gassessie terug?"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Alle programme en data in hierdie sessie sal uitgevee word."</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"Verwyder"</string> - <!-- no translation found for guest_reset_guest_dialog_remove (4359825585658228699) --> - <skip /> + <string name="guest_reset_guest_dialog_remove" msgid="4359825585658228699">"Stel terug"</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"Welkom terug, gas!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"Wiil jy jou sessie voortsit?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Begin van voor af"</string> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 72936da5d4fe..fa528fd9037a 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -480,12 +480,10 @@ <string name="user_add_user" msgid="4336657383006913022">"ব্যৱহাৰকাৰী যোগ কৰক"</string> <string name="user_new_user_name" msgid="2019166282704195789">"নতুন ব্যৱহাৰকাৰী"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"অতিথি আঁতৰাবনে?"</string> - <!-- no translation found for guest_reset_guest_dialog_title (8904781614074479690) --> - <skip /> + <string name="guest_reset_guest_dialog_title" msgid="8904781614074479690">"অতিথিৰ ছেশ্বন ৰিছেট কৰিবনে?"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"এই ছেশ্বনৰ সকলো এপ্ আৰু ডেটা মচা হ\'ব।"</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"আঁতৰাওক"</string> - <!-- no translation found for guest_reset_guest_dialog_remove (4359825585658228699) --> - <skip /> + <string name="guest_reset_guest_dialog_remove" msgid="4359825585658228699">"ৰিছেট কৰক"</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"অতিথি, আপোনাক পুনৰ স্বাগতম!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"আপুনি আপোনাৰ ছেশ্বন অব্যাহত ৰাখিব বিচাৰেনে?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"আকৌ আৰম্ভ কৰক"</string> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index e67d0a36efa1..c3b96a40023d 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -89,7 +89,7 @@ <string name="screenshot_failed_to_capture_text" msgid="7818288545874407451">"Skrinşot çəkməyə tətbiq və ya təşkilat tərəfindən icazə verilmir"</string> <string name="screenshot_edit_label" msgid="8754981973544133050">"Redaktə edin"</string> <string name="screenshot_edit_description" msgid="3333092254706788906">"Skrinşota düzəliş edin"</string> - <string name="screenshot_scroll_label" msgid="2930198809899329367">"Daha çoxunu əhatə edin"</string> + <string name="screenshot_scroll_label" msgid="2930198809899329367">"Genişləndirin"</string> <string name="screenshot_dismiss_description" msgid="4702341245899508786">"Ekran şəklini ötürün"</string> <string name="screenshot_preview_description" msgid="7606510140714080474">"Ekran şəklinə önbaxış"</string> <string name="screenshot_top_boundary_pct" msgid="2520148599096479332">"Yuxarı sərhəd <xliff:g id="PERCENT">%1$d</xliff:g> faiz"</string> @@ -100,7 +100,7 @@ <string name="screenrecord_background_processing_label" msgid="7244617554884238898">"Ekran çəkilişi emal edilir"</string> <string name="screenrecord_channel_description" msgid="4147077128486138351">"Ekranın video çəkimi ərzində silinməyən bildiriş"</string> <string name="screenrecord_start_label" msgid="1750350278888217473">"Yazmağa başlanılsın?"</string> - <string name="screenrecord_description" msgid="1123231719680353736">"Yazarkən Android Sistemi ekranınızda görünən və ya cihazınızda göstərilən istənilən həssas məlumatı qeydə ala bilər. Buraya parollar, ödəniş məlumatı, fotolar, mesajlar və audio daxildir."</string> + <string name="screenrecord_description" msgid="1123231719680353736">"Ekranda görünən və ya cihazda oxudulan şəxsi məlumat (parol, bank hesabı, mesaj, fotoşəkil və sair) videoyazıya düşə bilər."</string> <string name="screenrecord_audio_label" msgid="6183558856175159629">"Audio yazın"</string> <string name="screenrecord_device_audio_label" msgid="9016927171280567791">"Cihaz audiosu"</string> <string name="screenrecord_device_audio_description" msgid="4922694220572186193">"Cihazınızdan gələn musiqi, zənglər və zəng melodiyaları kimi səslər"</string> @@ -109,7 +109,7 @@ <string name="screenrecord_start" msgid="330991441575775004">"Başlayın"</string> <string name="screenrecord_ongoing_screen_only" msgid="4459670242451527727">"Ekran yazılır"</string> <string name="screenrecord_ongoing_screen_and_audio" msgid="5351133763125180920">"Ekran və audio yazılır"</string> - <string name="screenrecord_taps_label" msgid="1595690528298857649">"Ekranda toxunuşları göstərin"</string> + <string name="screenrecord_taps_label" msgid="1595690528298857649">"Ekrana toxunuş göstərilsin"</string> <string name="screenrecord_stop_text" msgid="6549288689506057686">"Dayandırmaq üçün toxunun"</string> <string name="screenrecord_stop_label" msgid="72699670052087989">"Dayandırın"</string> <string name="screenrecord_pause_label" msgid="6004054907104549857">"Dayandırın"</string> @@ -480,12 +480,10 @@ <string name="user_add_user" msgid="4336657383006913022">"İstifadəçi əlavə edin"</string> <string name="user_new_user_name" msgid="2019166282704195789">"Yeni istifadəçi"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"Qonaq silinsin?"</string> - <!-- no translation found for guest_reset_guest_dialog_title (8904781614074479690) --> - <skip /> + <string name="guest_reset_guest_dialog_title" msgid="8904781614074479690">"Qonaq sessiyası sıfırlansın?"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Bu sessiyada bütün tətbiqlər və data silinəcək."</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"Yığışdır"</string> - <!-- no translation found for guest_reset_guest_dialog_remove (4359825585658228699) --> - <skip /> + <string name="guest_reset_guest_dialog_remove" msgid="4359825585658228699">"Sıfırlayın"</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"Xoş gəlmisiniz!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"Sessiya davam etsin?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Yenidən başlayın"</string> @@ -609,15 +607,15 @@ <string name="accessibility_output_chooser" msgid="7807898688967194183">"Çıxış cihazına keçin"</string> <string name="screen_pinning_title" msgid="9058007390337841305">"Tətbiq bərkidilib"</string> <string name="screen_pinning_description" msgid="8699395373875667743">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın."</string> - <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və Əsas səhifə düymələrinə basıb saxlayın."</string> - <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Bu, onu çıxarana qədər görünəcək. Çıxarmaq üçün yuxarı sürüşdürün & basıb saxlayın."</string> - <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri düyməsinə basıb saxlayın."</string> - <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Əsas səhifə düyməsinə basıb saxlayın."</string> - <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Şəxsi məlumatlar (məsələn, kontaktlar və e-poçt məzmunu) əlçatan ola bilər."</string> + <string name="screen_pinning_description_recents_invisible" msgid="4564466648700390037">"\"Geri\" və \"Əsas ekran\" düymələrinin davamlı basılması ilə çıxarılana qədər tətbiq göz önündə qalır."</string> + <string name="screen_pinning_description_gestural" msgid="7246323931831232068">"Yuxarı sürüşdürülüb saxlanılana ilə çıxarılana qədər tətbiq göz önündə qalır."</string> + <string name="screen_pinning_description_accessible" msgid="7386449191953535332">"\"İcmal\" düyməsinin davamlı basılması ilə çıxarılana qədər tətbiq göz önündə qalır."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="2857071808674481986">"\"Əsas ekran\" düyməsinin davamlı basılması ilə çıxarılana qədər tətbiq göz önündə qalır."</string> + <string name="screen_pinning_exposes_personal_data" msgid="8189852022981524789">"Şəxsi məlumatlar (məsələn, kontaktlar və e-poçt məzmunu) ekranda görünə bilər."</string> <string name="screen_pinning_can_open_other_apps" msgid="7529756813231421455">"Bərkidilmiş tətbiq digər tətbiqləri aça bilər."</string> <string name="screen_pinning_toast" msgid="8177286912533744328">"Bu tətbiqi çıxarmaq üçün Geri və İcmal düymələrinə basıb saxlayın"</string> <string name="screen_pinning_toast_recents_invisible" msgid="6850978077443052594">"Bu tətbiqi çıxarmaq üçün Geri və Əsas ekran düymələrinə basıb saxlayın"</string> - <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Bu tətbiqi çıxarmaq üçün yuxarı sürüşdürüb saxlayın"</string> + <string name="screen_pinning_toast_gesture_nav" msgid="170699893395336705">"Tətbiqi çıxarmaq üçün yuxarı sürüşdürüb saxlayın"</string> <string name="screen_pinning_positive" msgid="3285785989665266984">"Anladım!"</string> <string name="screen_pinning_negative" msgid="6882816864569211666">"Yox, çox sağ olun"</string> <string name="screen_pinning_start" msgid="7483998671383371313">"Tətbiq bərkidildi"</string> @@ -1048,7 +1046,7 @@ <string name="accessibility_floating_button_action_move_out_edge_and_show" msgid="8354760891651663326">"Kənara daşıyıb göstərin"</string> <string name="accessibility_floating_button_action_double_tap_to_toggle" msgid="7976492639670692037">"keçirin"</string> <string name="quick_controls_title" msgid="7095074621086860062">"Əsas səhifə nizamlayıcıları"</string> - <string name="controls_providers_title" msgid="6879775889857085056">"Nizamlayıcıları əlavə etmək üçün tətbiq seçin"</string> + <string name="controls_providers_title" msgid="6879775889857085056">"Kontrol əlavə etmək üçün tətbiq seçin"</string> <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380"> <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> nizamlayıcı əlavə edilib.</item> <item quantity="one"><xliff:g id="NUMBER_0">%s</xliff:g> nizamlayıcı əlavə edilib.</item> @@ -1062,8 +1060,8 @@ <string name="accessibility_control_move" msgid="8980344493796647792">"<xliff:g id="NUMBER">%d</xliff:g> mövqeyinə keçirin"</string> <string name="controls_favorite_default_title" msgid="967742178688938137">"Nizamlayıcılar"</string> <string name="controls_favorite_subtitle" msgid="6481675111056961083">"Sürətli Ayarlardan giriş üçün nizamlayıcıları seçin"</string> - <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Nizamlayıcıları yenidən tənzimləmək üçün tutub sürüşdürün"</string> - <string name="controls_favorite_removed" msgid="5276978408529217272">"Bütün nizamlayıcılar silindi"</string> + <string name="controls_favorite_rearrange" msgid="5616952398043063519">"Vidcetləri daşıyaraq yerini dəyişin"</string> + <string name="controls_favorite_removed" msgid="5276978408529217272">"Kontrol vidcetləri silindi"</string> <string name="controls_favorite_toast_no_changes" msgid="7094494210840877931">"Dəyişikliklər yadda saxlanmadı"</string> <string name="controls_favorite_see_other_apps" msgid="7709087332255283460">"Digər tətbiqlərə baxın"</string> <string name="controls_favorite_load_error" msgid="5126216176144877419">"Nizamlayıcıları yükləmək mümkün olmadı. <xliff:g id="APP">%s</xliff:g> tətbiqinə toxunaraq tətbiq ayarlarının dəyişmədiyinə əmin olun."</string> @@ -1105,8 +1103,8 @@ <string name="controls_error_failed" msgid="960228639198558525">"Xəta, yenidən cəhd edin"</string> <string name="controls_in_progress" msgid="4421080500238215939">"Davam edir"</string> <string name="controls_added_tooltip" msgid="5866098408470111984">"Yeni nizamlayıcılara baxmaq üçün Sürətli Ayarları açın"</string> - <string name="controls_menu_add" msgid="4447246119229920050">"Nizamlayıcılar əlavə edin"</string> - <string name="controls_menu_edit" msgid="890623986951347062">"Nizamlayıcıları redaktə edin"</string> + <string name="controls_menu_add" msgid="4447246119229920050">"Vidcet əlavə edin"</string> + <string name="controls_menu_edit" msgid="890623986951347062">"Vidcetlərə düzəliş edin"</string> <string name="media_output_dialog_add_output" msgid="5642703238877329518">"Nəticələri əlavə edin"</string> <string name="media_output_dialog_group" msgid="5571251347877452212">"Qrup"</string> <string name="media_output_dialog_single_device" msgid="3102758980643351058">"1 cihaz seçilib"</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 56bec427a090..3f9269af1f50 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -480,12 +480,10 @@ <string name="user_add_user" msgid="4336657383006913022">"Добавяне на потребител"</string> <string name="user_new_user_name" msgid="2019166282704195789">"Нов потребител"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"Да се премахне ли гостът?"</string> - <!-- no translation found for guest_reset_guest_dialog_title (8904781614074479690) --> - <skip /> + <string name="guest_reset_guest_dialog_title" msgid="8904781614074479690">"Да се нулира ли сесията като гост?"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Всички приложения и данни в тази сесия ще бъдат изтрити."</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"Премахване"</string> - <!-- no translation found for guest_reset_guest_dialog_remove (4359825585658228699) --> - <skip /> + <string name="guest_reset_guest_dialog_remove" msgid="4359825585658228699">"Нулиране"</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"Добре дошли отново в сесията като гост!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"Искате ли да продължите сесията си?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Започване отначало"</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index b3caef3d695a..b2f0fd259702 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1048,8 +1048,7 @@ <string name="magnification_mode_switch_state_window" msgid="8597100249594076965">"הגדלת חלק מהמסך"</string> <string name="magnification_mode_switch_click_label" msgid="2786203505805898199">"מעבר"</string> <string name="accessibility_floating_button_migration_tooltip" msgid="4431046858918714564">"לחצן הנגישות החליף את תנועת הנגישות\n\n"<annotation id="link">"להצגת ההגדרות"</annotation></string> - <!-- no translation found for accessibility_floating_button_switch_migration_tooltip (6248529129221218770) --> - <skip /> + <string name="accessibility_floating_button_switch_migration_tooltip" msgid="6248529129221218770">"ניתן להחליף את תנועת הנגישות בלחצן\n\n"<annotation id="link">"הגדרות"</annotation></string> <string name="accessibility_floating_button_docking_tooltip" msgid="6814897496767461517">"כדי להסתיר זמנית את הלחצן, יש להזיז אותו לקצה"</string> <string name="accessibility_floating_button_action_move_top_left" msgid="6253520703618545705">"העברה לפינה השמאלית העליונה"</string> <string name="accessibility_floating_button_action_move_top_right" msgid="6106225581993479711">"העברה לפינה הימנית העליונה"</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index f503b38fdad2..89be1299e836 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -484,12 +484,10 @@ <string name="user_add_user" msgid="4336657383006913022">"Додати користувача"</string> <string name="user_new_user_name" msgid="2019166282704195789">"Новий користувач"</string> <string name="guest_exit_guest_dialog_title" msgid="5015697561580641422">"Видалити гостя?"</string> - <!-- no translation found for guest_reset_guest_dialog_title (8904781614074479690) --> - <skip /> + <string name="guest_reset_guest_dialog_title" msgid="8904781614074479690">"Скинути сеанс у режимі \"Гість\"?"</string> <string name="guest_exit_guest_dialog_message" msgid="8183450985628495709">"Усі додатки й дані з цього сеансу буде видалено."</string> <string name="guest_exit_guest_dialog_remove" msgid="7505817591242703757">"Вийти"</string> - <!-- no translation found for guest_reset_guest_dialog_remove (4359825585658228699) --> - <skip /> + <string name="guest_reset_guest_dialog_remove" msgid="4359825585658228699">"Скинути"</string> <string name="guest_wipe_session_title" msgid="7147965814683990944">"З поверненням!"</string> <string name="guest_wipe_session_message" msgid="3393823610257065457">"Продовжити сеанс?"</string> <string name="guest_wipe_session_wipe" msgid="8056836584445473309">"Почати знову"</string> diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index a8b493d68a74..364ac42985f1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -11554,8 +11554,31 @@ public class PackageManagerService extends IPackageManager.Stub if (getInstantAppPackageName(Binder.getCallingUid()) != null) { return; } + final List<String> names = new ArrayList<>(); + final List<ProviderInfo> infos = new ArrayList<>(); + final int callingUserId = UserHandle.getCallingUserId(); mComponentResolver.querySyncProviders( - outNames, outInfo, mSafeMode, UserHandle.getCallingUserId()); + names, infos, mSafeMode, callingUserId); + synchronized (mLock) { + for (int i = infos.size() - 1; i >= 0; i--) { + final ProviderInfo providerInfo = infos.get(i); + final PackageSetting ps = mSettings.getPackageLPr(providerInfo.packageName); + final ComponentName component = + new ComponentName(providerInfo.packageName, providerInfo.name); + if (!shouldFilterApplicationLocked(ps, Binder.getCallingUid(), component, + TYPE_PROVIDER, callingUserId)) { + continue; + } + infos.remove(i); + names.remove(i); + } + } + if (!names.isEmpty()) { + outNames.addAll(names); + } + if (!infos.isEmpty()) { + outInfo.addAll(infos); + } } @Override @@ -12988,6 +13011,15 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void dumpProfiles(String packageName) { + /* Only the shell, root, or the app user should be able to dump profiles. */ + final int callingUid = Binder.getCallingUid(); + final String[] callerPackageNames = getPackagesForUid(callingUid); + if (callingUid != Process.SHELL_UID + && callingUid != Process.ROOT_UID + && !ArrayUtils.contains(callerPackageNames, packageName)) { + throw new SecurityException("dumpProfiles"); + } + AndroidPackage pkg; synchronized (mLock) { pkg = mPackages.get(packageName); @@ -12995,13 +13027,6 @@ public class PackageManagerService extends IPackageManager.Stub throw new IllegalArgumentException("Unknown package: " + packageName); } } - /* Only the shell, root, or the app user should be able to dump profiles. */ - int callingUid = Binder.getCallingUid(); - if (callingUid != Process.SHELL_UID && - callingUid != Process.ROOT_UID && - callingUid != pkg.getUid()) { - throw new SecurityException("dumpProfiles"); - } synchronized (mInstallLock) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dump profiles"); @@ -17127,10 +17152,7 @@ public class PackageManagerService extends IPackageManager.Stub callerPackageName); synchronized (mLock) { PackageSetting ps = mSettings.getPackageLPr(packageName); - if (ps == null) { - throw new IllegalArgumentException("Unknown target package " + packageName); - } - if (shouldFilterApplicationLocked( + if (ps == null || shouldFilterApplicationLocked( ps, Binder.getCallingUid(), UserHandle.getCallingUserId())) { throw new IllegalArgumentException("Unknown target package " + packageName); } @@ -23191,16 +23213,17 @@ public class PackageManagerService extends IPackageManager.Stub if (UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) { return; } + final String[] callerPackageNames = getPackagesForUid(callingUid); + if (!ArrayUtils.contains(callerPackageNames, pkg)) { + throw new SecurityException("Calling uid " + callingUid + + " does not own package " + pkg); + } final int callingUserId = UserHandle.getUserId(callingUid); PackageInfo pi = getPackageInfo(pkg, 0, callingUserId); if (pi == null) { throw new IllegalArgumentException("Unknown package " + pkg + " on user " + callingUserId); } - if (!UserHandle.isSameApp(pi.applicationInfo.uid, callingUid)) { - throw new SecurityException("Calling uid " + callingUid - + " does not own package " + pkg); - } } @Override @@ -24016,6 +24039,13 @@ public class PackageManagerService extends IPackageManager.Stub final int permission = mContext.checkCallingOrSelfPermission( android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); + if (!allowedByPermission + && !ArrayUtils.contains(getPackagesForUid(callingUid), packageName)) { + throw new SecurityException( + "Permission Denial: attempt to change stopped state from pid=" + + Binder.getCallingPid() + + ", uid=" + callingUid + ", package=" + packageName); + } enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, true /* checkShell */, "stop package"); boolean shouldUnhibernate = false; @@ -24026,8 +24056,7 @@ public class PackageManagerService extends IPackageManager.Stub shouldUnhibernate = true; } if (!shouldFilterApplicationLocked(ps, callingUid, userId) - && mSettings.setPackageStoppedStateLPw(this, packageName, stopped, - allowedByPermission, callingUid, userId)) { + && mSettings.setPackageStoppedStateLPw(this, packageName, stopped, userId)) { scheduleWritePackageRestrictionsLocked(userId); } } @@ -26461,16 +26490,12 @@ public class PackageManagerService extends IPackageManager.Stub } synchronized(mLock) { final AndroidPackage pkg = mPackages.get(packageName); - if (pkg == null) { + if (pkg == null + || shouldFilterApplicationLocked(getPackageSetting(pkg.getPackageName()), + Binder.getCallingUid(), UserHandle.getCallingUserId())) { Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } - final PackageSetting ps = getPackageSetting(pkg.getPackageName()); - if (shouldFilterApplicationLocked( - ps, Binder.getCallingUid(), UserHandle.getCallingUserId())) { - Slog.w(TAG, "KeySet requested for filtered package: " + packageName); - throw new IllegalArgumentException("Unknown package: " + packageName); - } final KeySetManagerService ksms = mSettings.getKeySetManagerService(); return new KeySet(ksms.getKeySetByAliasAndPackageNameLPr(packageName, alias)); } @@ -26485,14 +26510,10 @@ public class PackageManagerService extends IPackageManager.Stub final int callingUid = Binder.getCallingUid(); final int callingUserId = UserHandle.getUserId(callingUid); final AndroidPackage pkg = mPackages.get(packageName); - if (pkg == null) { - Slog.w(TAG, "KeySet requested for unknown package: " + packageName); - throw new IllegalArgumentException("Unknown package: " + packageName); - } - final PackageSetting ps = getPackageSetting(pkg.getPackageName()); - if (shouldFilterApplicationLocked(ps, callingUid, callingUserId)) { - // filter and pretend the package doesn't exist - Slog.w(TAG, "KeySet requested for filtered package: " + packageName + if (pkg == null + || shouldFilterApplicationLocked(getPackageSetting(pkg.getPackageName()), + callingUid, callingUserId)) { + Slog.w(TAG, "KeySet requested for unknown package: " + packageName + ", uid:" + callingUid); throw new IllegalArgumentException("Unknown package: " + packageName); } @@ -27932,7 +27953,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public List<String> getMimeGroup(String packageName, String mimeGroup) { - return PackageManagerService.this.getMimeGroup(packageName, mimeGroup); + return PackageManagerService.this.getMimeGroupInternal(packageName, mimeGroup); } @Override @@ -28558,9 +28579,11 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void setMimeGroup(String packageName, String mimeGroup, List<String> mimeTypes) { - boolean changed = mSettings.getPackageLPr(packageName) - .setMimeGroup(mimeGroup, mimeTypes); - + enforceOwnerRights(packageName, Binder.getCallingUid()); + final boolean changed; + synchronized (mLock) { + changed = mSettings.getPackageLPr(packageName).setMimeGroup(mimeGroup, mimeTypes); + } if (changed) { applyMimeGroupChanges(packageName, mimeGroup); } @@ -28568,7 +28591,14 @@ public class PackageManagerService extends IPackageManager.Stub @Override public List<String> getMimeGroup(String packageName, String mimeGroup) { - return mSettings.getPackageLPr(packageName).getMimeGroup(mimeGroup); + enforceOwnerRights(packageName, Binder.getCallingUid()); + return getMimeGroupInternal(packageName, mimeGroup); + } + + private List<String> getMimeGroupInternal(String packageName, String mimeGroup) { + synchronized (mLock) { + return mSettings.getPackageLPr(packageName).getMimeGroup(mimeGroup); + } } @Override diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 7aa1c3ab8154..26aebbc1ea93 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4188,18 +4188,11 @@ public final class Settings implements Watchable, Snappable { } boolean setPackageStoppedStateLPw(PackageManagerService pm, String packageName, - boolean stopped, boolean allowedByPermission, int uid, int userId) { - int appId = UserHandle.getAppId(uid); + boolean stopped, int userId) { final PackageSetting pkgSetting = mPackages.get(packageName); if (pkgSetting == null) { throw new IllegalArgumentException("Unknown package: " + packageName); } - if (!allowedByPermission && (appId != pkgSetting.appId)) { - throw new SecurityException( - "Permission Denial: attempt to change stopped state from pid=" - + Binder.getCallingPid() - + ", uid=" + uid + ", package uid=" + pkgSetting.appId); - } if (DEBUG_STOPPED) { if (stopped) { RuntimeException e = new RuntimeException("here"); diff --git a/services/core/java/com/android/server/pm/TEST_MAPPING b/services/core/java/com/android/server/pm/TEST_MAPPING index 47cce9f9e019..878eb920717e 100644 --- a/services/core/java/com/android/server/pm/TEST_MAPPING +++ b/services/core/java/com/android/server/pm/TEST_MAPPING @@ -13,6 +13,9 @@ "name": "CtsAppEnumerationTestCases" }, { + "name": "AppEnumerationInternalTests" + }, + { "name": "CtsMatchFlagTestCases" }, { diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 542ec809c484..2cebc3be4b71 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1221,6 +1221,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A TopResumedActivityChangeItem.obtain(onTop)); } catch (RemoteException e) { // If process died, whatever. + Slog.w(TAG, "Failed to send top-resumed=" + onTop + " to " + this, e); return false; } return true; diff --git a/services/tests/PackageManagerServiceTests/appenumeration/Android.bp b/services/tests/PackageManagerServiceTests/appenumeration/Android.bp new file mode 100644 index 000000000000..479ef8e5f188 --- /dev/null +++ b/services/tests/PackageManagerServiceTests/appenumeration/Android.bp @@ -0,0 +1,36 @@ +// 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 { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +android_test { + name: "AppEnumerationInternalTests", + srcs: [ + "src/**/*.java", + ], + static_libs: [ + "compatibility-device-util-axt", + "androidx.test.runner", + "truth-prebuilt", + ], + platform_apis: true, + test_suites: ["device-tests"], +} diff --git a/packages/SettingsLib/SettingsTransition/res/interpolator/fast_out_extra_slow_in.xml b/services/tests/PackageManagerServiceTests/appenumeration/AndroidManifest.xml index a2bbd2be777d..2039aaa20945 100644 --- a/packages/SettingsLib/SettingsTransition/res/interpolator/fast_out_extra_slow_in.xml +++ b/services/tests/PackageManagerServiceTests/appenumeration/AndroidManifest.xml @@ -12,8 +12,16 @@ ~ 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 + ~ limitations under the License. --> -<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android" - android:pathData="M 0,0 C 0.05, 0, 0.133333, 0.06, 0.166666, 0.4 C 0.208333, 0.82, 0.25, 1, 1, 1"/> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.server.pm.test.appenumeration"> + + <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" + android:targetPackage="com.android.server.pm.test.appenumeration" + android:label="Package Manager Service Tests for app enumeration"> + </instrumentation> + +</manifest> + diff --git a/services/tests/PackageManagerServiceTests/appenumeration/AndroidTest.xml b/services/tests/PackageManagerServiceTests/appenumeration/AndroidTest.xml new file mode 100644 index 000000000000..6f168a3888b3 --- /dev/null +++ b/services/tests/PackageManagerServiceTests/appenumeration/AndroidTest.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + ~ 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. + --> + +<configuration description="Runs Package Manager Service App Enumeration Tests."> + <option name="test-suite-tag" value="apct" /> + <option name="test-suite-tag" value="apct-instrumentation" /> + <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> + <option name="cleanup-apks" value="true" /> + <option name="test-file-name" value="AppEnumerationInternalTests.apk" /> + </target_preparer> + + <!-- Create place to store apks --> + <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer"> + <option name="run-command" value="mkdir -p /data/local/tmp/appenumerationtests" /> + <option name="teardown-command" value="rm -rf /data/local/tmp/appenumerationtests"/> + </target_preparer> + + <!-- Load additional APKs onto device --> + <target_preparer class="com.android.compatibility.common.tradefed.targetprep.FilePusher"> + <option name="push" value="AppEnumerationSyncProviderTestApp.apk->/data/local/tmp/appenumerationtests/AppEnumerationSyncProviderTestApp.apk" /> + </target_preparer> + + <option name="test-tag" value="AppEnumerationInternalTest" /> + <test class="com.android.tradefed.testtype.AndroidJUnitTest"> + <option name="package" value="com.android.server.pm.test.appenumeration" /> + <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" /> + <option name="hidden-api-checks" value="false" /> + </test> +</configuration> diff --git a/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/AppEnumerationInternalTests.java b/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/AppEnumerationInternalTests.java new file mode 100644 index 000000000000..933784560410 --- /dev/null +++ b/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/AppEnumerationInternalTests.java @@ -0,0 +1,98 @@ +/* + * 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.server.pm.test.appenumeration; + +import static com.android.compatibility.common.util.ShellUtils.runShellCommand; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.AppGlobals; +import android.content.pm.IPackageManager; +import android.content.pm.ProviderInfo; + +import androidx.test.runner.AndroidJUnit4; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Application enumeration tests for the internal apis of package manager service. + */ +@RunWith(AndroidJUnit4.class) +public class AppEnumerationInternalTests { + private static final String TEST_DATA_PATH = "/data/local/tmp/appenumerationtests/"; + private static final String SYNC_PROVIDER_APK_PATH = + TEST_DATA_PATH + "AppEnumerationSyncProviderTestApp.apk"; + private static final String SYNC_PROVIDER_PKG_NAME = "com.android.appenumeration.syncprovider"; + private static final String SYNC_PROVIDER_AUTHORITY = SYNC_PROVIDER_PKG_NAME; + + private IPackageManager mIPackageManager; + + @Before + public void setup() { + mIPackageManager = AppGlobals.getPackageManager(); + } + + @After + public void tearDown() throws Exception { + uninstallPackage(SYNC_PROVIDER_PKG_NAME); + } + + @Test + public void querySyncProviders_canSeeForceQueryable() throws Exception { + final List<String> names = new ArrayList<>(); + final List<ProviderInfo> infos = new ArrayList<>(); + installPackage(SYNC_PROVIDER_APK_PATH, true /* forceQueryable */); + mIPackageManager.querySyncProviders(names, infos); + + assertThat(names).contains(SYNC_PROVIDER_AUTHORITY); + assertThat(infos.stream().map(info -> info.packageName).collect(Collectors.toList())) + .contains(SYNC_PROVIDER_PKG_NAME); + } + + @Test + public void querySyncProviders_cannotSeeSyncProvider() throws Exception { + final List<String> names = new ArrayList<>(); + final List<ProviderInfo> infos = new ArrayList<>(); + installPackage(SYNC_PROVIDER_APK_PATH, false /* forceQueryable */); + mIPackageManager.querySyncProviders(names, infos); + + assertThat(names).doesNotContain(SYNC_PROVIDER_AUTHORITY); + assertThat(infos.stream().map(info -> info.packageName).collect(Collectors.toList())) + .doesNotContain(SYNC_PROVIDER_PKG_NAME); + } + + private static void installPackage(String apkPath, boolean forceQueryable) { + final StringBuilder cmd = new StringBuilder("pm install "); + if (forceQueryable) { + cmd.append("--force-queryable "); + } + cmd.append(apkPath); + final String result = runShellCommand(cmd.toString()); + assertThat(result.trim()).contains("Success"); + } + + private static void uninstallPackage(String packageName) { + runShellCommand("pm uninstall " + packageName); + } +} diff --git a/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/Android.bp b/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/Android.bp new file mode 100644 index 000000000000..64239b4c6b2d --- /dev/null +++ b/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/Android.bp @@ -0,0 +1,36 @@ +// 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 { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +android_test_helper_app { + name: "AppEnumerationSyncProviderTestApp", + srcs: ["src/**/*.java"], + manifest: "AndroidManifest-syncprovider.xml", + dex_preopt: { + enabled: false, + }, + optimize: { + enabled: false, + }, + test_suites: ["device-tests"], + platform_apis: true, +} diff --git a/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/AndroidManifest-syncprovider.xml b/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/AndroidManifest-syncprovider.xml new file mode 100644 index 000000000000..de8439384b54 --- /dev/null +++ b/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/AndroidManifest-syncprovider.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + 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. + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.appenumeration.syncprovider"> + <application> + <provider android:name="com.android.appenumeration.testapp.DummyProvider" + android:authorities="com.android.appenumeration.syncprovider" + android:syncable="true" android:exported="true"> + <intent-filter> + <action android:name="com.android.appenumeration.action.PROVIDER"/> + </intent-filter> + </provider> + </application> +</manifest> diff --git a/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/src/com/android/appenumeration/testapp/DummyProvider.java b/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/src/com/android/appenumeration/testapp/DummyProvider.java new file mode 100644 index 000000000000..e8b610969c2f --- /dev/null +++ b/services/tests/PackageManagerServiceTests/appenumeration/test-apps/target/src/com/android/appenumeration/testapp/DummyProvider.java @@ -0,0 +1,55 @@ +/* + * 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.appenumeration.testapp; + +import android.content.ContentProvider; +import android.content.ContentValues; +import android.database.Cursor; +import android.net.Uri; + +public class DummyProvider extends ContentProvider { + @Override + public boolean onCreate() { + return true; + } + + @Override + public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, + String sortOrder) { + return null; + } + + @Override + public Uri insert(Uri uri, ContentValues values) { + return null; + } + + @Override + public int delete(Uri uri, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { + return 0; + } + + @Override + public String getType(Uri uri) { + return "text/plain"; + } +} |