diff options
26 files changed, 139 insertions, 52 deletions
diff --git a/PermissionController/res/values-ar/strings.xml b/PermissionController/res/values-ar/strings.xml index 142070884..445c7af55 100644 --- a/PermissionController/res/values-ar/strings.xml +++ b/PermissionController/res/values-ar/strings.xml @@ -337,7 +337,7 @@ <string name="app_perms_7d_access_all_files" msgid="8246193786397635824">"تم الوصول آخر مرة بتاريخ <xliff:g id="TIME_DATE_0">%1$s</xliff:g> في <xliff:g id="TIME_DATE_1">%2$s</xliff:g> • جميع الملفات"</string> <string name="app_perms_content_provider_24h_all_files" msgid="573104317727770850">"تم الوصول في آخر 24 ساعة • كل الملفات"</string> <string name="app_perms_content_provider_7d_all_files" msgid="7962416229708835558">"تم الوصول في آخر 7 أيام • جميع الملفات"</string> - <string name="no_permissions_allowed" msgid="6081976856354669209">"لم يتم منح أي أذونات."</string> + <string name="no_permissions_allowed" msgid="6081976856354669209">"لم يتم منح أي أذونات"</string> <string name="no_permissions_denied" msgid="8159923922804043282">"لم يتم رفض أي أذونات."</string> <string name="no_apps_allowed" msgid="7718822655254468631">"لم يتم السماح لأي تطبيقات."</string> <string name="no_apps_allowed_full" msgid="8011716991498934104">"ما من تطبيقات تم منحها إذن الوصول إلى جميع الملفات."</string> diff --git a/PermissionController/res/values-ca/strings.xml b/PermissionController/res/values-ca/strings.xml index efc256729..bee1d35dc 100644 --- a/PermissionController/res/values-ca/strings.xml +++ b/PermissionController/res/values-ca/strings.xml @@ -206,7 +206,7 @@ <string name="unused_apps_label_v2" msgid="7058776770056517980">"Activitat a l\'app en pausa si no s\'usa"</string> <string name="unused_apps_label_v3" msgid="693340578642156657">"Gestiona l\'aplicació si no s\'utilitza"</string> <string name="unused_apps_summary" msgid="8839466950318403115">"Suprimeix els permisos i els fitxers temporals, i atura les notificacions"</string> - <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Suprimeix els permisos i els fitxers temporals, atura les notificacions i arxiva l\'aplicació"</string> + <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Suprimeix els permisos, elimina els fitxers temporals, atura les notificacions i arxiva l\'aplicació"</string> <string name="auto_revoke_summary" msgid="5867548789805911683">"Per protegir les teves dades, els permisos d\'aquesta aplicació se suprimiran si no la utilitzes durant uns mesos."</string> <string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Si l\'aplicació no s\'utilitza durant uns mesos, se suprimiran els permisos següents per protegir les teves dades: <xliff:g id="PERMS">%1$s</xliff:g>"</string> <string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Per protegir les teves dades, s\'han suprimit els permisos de les aplicacions que no has utilitzat durant els darrers mesos."</string> diff --git a/PermissionController/res/values-et/strings.xml b/PermissionController/res/values-et/strings.xml index 2d2cdfd25..4917f776b 100644 --- a/PermissionController/res/values-et/strings.xml +++ b/PermissionController/res/values-et/strings.xml @@ -204,9 +204,9 @@ <string name="auto_revoke_label" msgid="5068393642936571656">"Eemalda load, kui rakendust ei kasutata"</string> <string name="unused_apps_label" msgid="2595428768404901064">"Eemalda load ja vabasta ruumi"</string> <string name="unused_apps_label_v2" msgid="7058776770056517980">"Tegevusetuna rakenduse tegevuste peatamine"</string> - <string name="unused_apps_label_v3" msgid="693340578642156657">"Kasutamata rakenduse haldamine"</string> + <string name="unused_apps_label_v3" msgid="693340578642156657">"Halda kasutamata rakendusi"</string> <string name="unused_apps_summary" msgid="8839466950318403115">"Eemaldatakse load, kustutatakse ajutised failid ja peatatakse märguanded"</string> - <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Lubade eemaldamine, ajutiste failide kustutamine, märguannete peatamine ja rakenduse arhiivimine"</string> + <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Eemalda load, kustuta ajutised failid, peata märguanded ja arhiivi rakendus"</string> <string name="auto_revoke_summary" msgid="5867548789805911683">"Teie andmete kaitsmiseks eemaldatakse selle rakenduse load, kui seda mõne kuu jooksul ei kasutata."</string> <string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Teie andmete kaitsmiseks eemaldatakse selle rakenduse järgmised load, kui rakendust mõne kuu jooksul ei kasutata: <xliff:g id="PERMS">%1$s</xliff:g>"</string> <string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Teie andmete kaitsmiseks eemaldati load rakendustelt, mida te ei ole mõne kuu jooksul kasutanud."</string> diff --git a/PermissionController/res/values-fa/strings.xml b/PermissionController/res/values-fa/strings.xml index a525ae20f..6a9a67315 100644 --- a/PermissionController/res/values-fa/strings.xml +++ b/PermissionController/res/values-fa/strings.xml @@ -414,9 +414,9 @@ <string name="phone_call_uses_microphone" msgid="233569591461187177">"در <b>تماس تلفنی</b> از میکروفون استفاده میشود"</string> <string name="phone_call_uses_microphone_and_camera" msgid="6291898755681748189">"در <b>تماس تصویری</b> از دوربین و میکروفون استفاده میشود"</string> <string name="phone_call_uses_camera" msgid="2048417022147857418">"در <b>تماس تصویری</b> از دوربین استفاده میشود"</string> - <string name="system_uses_microphone" msgid="576672130318877143">"سرویس سیستم به میکروفون دسترسی دارد"</string> - <string name="system_uses_microphone_and_camera" msgid="5124478304275138804">"سرویس سیستم به دوربین و میکروفون دسترسی دارد"</string> - <string name="system_uses_camera" msgid="1911223105234441470">"سرویس سیستم به دوربین دسترسی دارد"</string> + <string name="system_uses_microphone" msgid="576672130318877143">"خدمات سیستم به میکروفون دسترسی دارد"</string> + <string name="system_uses_microphone_and_camera" msgid="5124478304275138804">"خدمات سیستم به دوربین و میکروفون دسترسی دارد"</string> + <string name="system_uses_camera" msgid="1911223105234441470">"خدمات سیستم به دوربین دسترسی دارد"</string> <string name="other_use" msgid="6564855051022776692">"استفادههای دیگر:"</string> <string name="ongoing_usage_dialog_ok" msgid="103556809118460072">"متوجه شدم"</string> <string name="ongoing_usage_dialog_title" msgid="683836493556628569">"استفاده اخیر از <xliff:g id="TYPES_LIST">%s</xliff:g>"</string> diff --git a/PermissionController/res/values-hu/strings.xml b/PermissionController/res/values-hu/strings.xml index 66597ce82..943418f1e 100644 --- a/PermissionController/res/values-hu/strings.xml +++ b/PermissionController/res/values-hu/strings.xml @@ -204,7 +204,7 @@ <string name="auto_revoke_label" msgid="5068393642936571656">"Engedélyek eltávolítása, ha nem használja az alkalmazást"</string> <string name="unused_apps_label" msgid="2595428768404901064">"Engedélytörlés és tárhely-felszabadítás"</string> <string name="unused_apps_label_v2" msgid="7058776770056517980">"App szüneteltetése, ha nem használja"</string> - <string name="unused_apps_label_v3" msgid="693340578642156657">"Használaton kívüli alkalmazás kezelése"</string> + <string name="unused_apps_label_v3" msgid="693340578642156657">"Nem használt alkalmazás kezelése"</string> <string name="unused_apps_summary" msgid="8839466950318403115">"Engedélyek eltávolítása, ideiglenes fájlok törlése és értesítések leállítása"</string> <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Engedélyek eltávolítása, ideiglenes fájlok törlése, értesítések leállítása és az alkalmazás archiválása"</string> <string name="auto_revoke_summary" msgid="5867548789805911683">"Az adatok védelme érdekében az ennek az alkalmazásnak adott engedélyek visszavonásra kerülnek, ha néhány hónapon át nem használja az alkalmazást."</string> diff --git a/PermissionController/res/values-in/strings.xml b/PermissionController/res/values-in/strings.xml index a41fe862d..b79dc1b78 100644 --- a/PermissionController/res/values-in/strings.xml +++ b/PermissionController/res/values-in/strings.xml @@ -50,12 +50,12 @@ <string name="permission_revoked_all" msgid="3397649017727222283">"semua dinonaktifkan"</string> <string name="permission_revoked_none" msgid="9213345075484381180">"tidak ada yang dinonaktifkan"</string> <string name="grant_dialog_button_allow" msgid="5314677880021102550">"Izinkan"</string> - <string name="grant_dialog_button_allow_always" msgid="4485552579273565981">"Izinkan sepanjang waktu"</string> + <string name="grant_dialog_button_allow_always" msgid="4485552579273565981">"Selalu izinkan"</string> <string name="grant_dialog_button_allow_foreground" msgid="501896824973636533">"Saat aplikasi digunakan"</string> <string name="grant_dialog_button_change_to_precise_location" msgid="3273115879467236033">"Ubah ke lokasi presisi"</string> <string name="grant_dialog_button_keey_approximate_location" msgid="438025182769080011">"Tetap gunakan perkiraan"</string> <string name="grant_dialog_button_allow_one_time" msgid="2618088516449706391">"Hanya kali ini"</string> - <string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"Izinkan sepanjang waktu"</string> + <string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"Selalu izinkan"</string> <string name="grant_dialog_button_allow_all_files" msgid="4955436994954829894">"Izinkan pengelolaan semua file"</string> <string name="grant_dialog_button_allow_media_only" msgid="4832877658422573832">"Izinkan akses ke file media"</string> <string name="app_permissions_breadcrumb" msgid="5136969550489411650">"Aplikasi"</string> @@ -109,7 +109,7 @@ <!-- no translation found for background_access_chooser_dialog_choices:0 (1351721623256561996) --> <!-- no translation found for background_access_chooser_dialog_choices:1 (9127301153688725448) --> <!-- no translation found for background_access_chooser_dialog_choices:2 (4305536986042401191) --> - <string name="permission_access_always" msgid="1474641821883823446">"Izinkan sepanjang waktu"</string> + <string name="permission_access_always" msgid="1474641821883823446">"Selalu izinkan"</string> <string name="permission_access_only_foreground" msgid="7801170728159326195">"Izinkan saat aplikasi digunakan"</string> <string name="permission_access_never" msgid="4647014230217936900">"Jangan izinkan"</string> <string name="loading" msgid="4789365003890741082">"Memuat…"</string> @@ -186,8 +186,8 @@ <string name="app_permission_button_allow" msgid="5808039516494774647">"Izinkan"</string> <string name="app_permission_button_allow_all_files" msgid="1792232272599018825">"Izinkan pengelolaan semua file"</string> <string name="app_permission_button_allow_media_only" msgid="2834282724426046154">"Izinkan akses hanya ke media"</string> - <string name="app_permission_button_allow_always" msgid="4573292371734011171">"Izinkan sepanjang waktu"</string> - <string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"Izinkan hanya saat aplikasi digunakan"</string> + <string name="app_permission_button_allow_always" msgid="4573292371734011171">"Selalu izinkan"</string> + <string name="app_permission_button_allow_foreground" msgid="1991570451498943207">"Izinkan saat aplikasi digunakan"</string> <string name="app_permission_button_always_allow_all" msgid="4905699259378428855">"Selalu izinkan semua"</string> <string name="app_permission_button_ask" msgid="3342950658789427">"Selalu tanya"</string> <string name="app_permission_button_deny" msgid="6016454069832050300">"Jangan izinkan"</string> @@ -206,7 +206,7 @@ <string name="unused_apps_label_v2" msgid="7058776770056517980">"Jeda aktivitas aplikasi jika tak dipakai"</string> <string name="unused_apps_label_v3" msgid="693340578642156657">"Kelola aplikasi jika tidak digunakan"</string> <string name="unused_apps_summary" msgid="8839466950318403115">"Hapus izin dan file sementara, serta hentikan notifikasi"</string> - <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Menghapus izin dan file sementara, menghentikan notifikasi, serta mengarsipkan aplikasi"</string> + <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Hapus izin dan file sementara, hentikan notifikasi, dan arsipkan aplikasi"</string> <string name="auto_revoke_summary" msgid="5867548789805911683">"Untuk melindungi data Anda, izin aplikasi ini akan dihapus jika aplikasi tidak digunakan dalam beberapa bulan."</string> <string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Untuk melindungi data Anda, izin berikut akan dihapus jika aplikasi tidak digunakan dalam beberapa bulan: <xliff:g id="PERMS">%1$s</xliff:g>"</string> <string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Untuk melindungi data Anda, izin dari aplikasi yang tidak digunakan dalam beberapa bulan telah dihapus."</string> diff --git a/PermissionController/res/values-ja/strings.xml b/PermissionController/res/values-ja/strings.xml index c551c7ebe..b599bd0cc 100644 --- a/PermissionController/res/values-ja/strings.xml +++ b/PermissionController/res/values-ja/strings.xml @@ -56,8 +56,8 @@ <string name="grant_dialog_button_keey_approximate_location" msgid="438025182769080011">"おおよその位置情報を保持"</string> <string name="grant_dialog_button_allow_one_time" msgid="2618088516449706391">"今回のみ"</string> <string name="grant_dialog_button_allow_background" msgid="8236044729434367833">"常に許可"</string> - <string name="grant_dialog_button_allow_all_files" msgid="4955436994954829894">"すべてのファイルの管理を許可"</string> - <string name="grant_dialog_button_allow_media_only" msgid="4832877658422573832">"メディア ファイルへのアクセスを許可"</string> + <string name="grant_dialog_button_allow_all_files" msgid="4955436994954829894">"すべての管理を許可"</string> + <string name="grant_dialog_button_allow_media_only" msgid="4832877658422573832">"アクセスのみ許可"</string> <string name="app_permissions_breadcrumb" msgid="5136969550489411650">"アプリ"</string> <string name="app_permissions" msgid="3369917736607944781">"アプリの権限"</string> <string name="unused_apps" msgid="2058057455175955094">"使用されていないアプリ"</string> @@ -86,7 +86,7 @@ <string name="app_permissions_group_summary" msgid="8788419008958284002">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="COUNT_1">%2$d</xliff:g> 個のアプリを許可"</string> <string name="app_permissions_group_summary2" msgid="4329922444840521150">"<xliff:g id="COUNT_0">%1$d</xliff:g>/<xliff:g id="COUNT_1">%2$d</xliff:g> 件のアプリを許可"</string> <string name="menu_show_system" msgid="4254021607027872504">"システムアプリを表示"</string> - <string name="menu_hide_system" msgid="3855390843744028465">"システムアプリを表示しない"</string> + <string name="menu_hide_system" msgid="3855390843744028465">"システムアプリを非表示"</string> <string name="menu_show_7_days_data" msgid="8979611198508523706">"過去 7 日間を表示"</string> <string name="menu_show_24_hours_data" msgid="8228054833323380780">"過去 24 時間を表示"</string> <string name="manage_permission" msgid="2895385393037061964">"権限の管理"</string> diff --git a/PermissionController/res/values-pt-rPT/strings.xml b/PermissionController/res/values-pt-rPT/strings.xml index 787399bcf..4e2529ad2 100644 --- a/PermissionController/res/values-pt-rPT/strings.xml +++ b/PermissionController/res/values-pt-rPT/strings.xml @@ -206,7 +206,7 @@ <string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausar atividade de apps, se não usadas"</string> <string name="unused_apps_label_v3" msgid="693340578642156657">"Gerir app, se não for usada"</string> <string name="unused_apps_summary" msgid="8839466950318403115">"Remova autorizações, elimine ficheiros temporários e pare notificações"</string> - <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remova autorizações, elimine ficheiros temporários, pare notificações e arquive a app"</string> + <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Remove autorizações, elimina ficheiros temporários, pára notificações e arquiva a app"</string> <string name="auto_revoke_summary" msgid="5867548789805911683">"Para proteger os seus dados, as autorizações desta app serão removidas se a mesma não for utilizada durante alguns meses."</string> <string name="auto_revoke_summary_with_permissions" msgid="389712086597285013">"Para proteger os seus dados, se a app não for utilizada há alguns meses, serão removidas as seguintes autorizações: <xliff:g id="PERMS">%1$s</xliff:g>"</string> <string name="auto_revoked_apps_page_summary" msgid="6594753657893756536">"Para proteger os seus dados, foram removidas as autorizações para as apps que não utiliza há alguns meses."</string> diff --git a/PermissionController/res/values-sv/strings.xml b/PermissionController/res/values-sv/strings.xml index 53cb70695..723a38ed8 100644 --- a/PermissionController/res/values-sv/strings.xml +++ b/PermissionController/res/values-sv/strings.xml @@ -204,7 +204,7 @@ <string name="auto_revoke_label" msgid="5068393642936571656">"Ta bort behörigheter om en app inte används"</string> <string name="unused_apps_label" msgid="2595428768404901064">"Ta bort behörigheter och frigör utrymme"</string> <string name="unused_apps_label_v2" msgid="7058776770056517980">"Pausa appaktivitet om appen inte används"</string> - <string name="unused_apps_label_v3" msgid="693340578642156657">"Hantera appen om den är oanvänd"</string> + <string name="unused_apps_label_v3" msgid="693340578642156657">"Hantera appen om den inte används"</string> <string name="unused_apps_summary" msgid="8839466950318403115">"Ta bort behörigheter, radera tillfälliga filer och hindra aviseringar"</string> <string name="unused_apps_summary_v2" msgid="5011313200815115802">"Ta bort behörigheter, radera tillfälliga filer, hindra aviseringar och arkivera appen"</string> <string name="auto_revoke_summary" msgid="5867548789805911683">"Behörigheter tas bort av säkerhetsskäl från den här appen om den inte används på några månader."</string> diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt index 826e57ece..40ee75636 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageDetailsViewModel.kt @@ -32,6 +32,7 @@ import android.graphics.drawable.Drawable import android.os.Build import android.os.Bundle import android.os.UserHandle +import android.os.UserManager import androidx.annotation.RequiresApi import androidx.lifecycle.AbstractSavedStateViewModelFactory import androidx.lifecycle.SavedStateHandle @@ -85,6 +86,8 @@ class PermissionUsageDetailsViewModel( private val roleManager = Utils.getSystemServiceSafe(application.applicationContext, RoleManager::class.java) + private val userManager = + Utils.getSystemServiceSafe(application.applicationContext, UserManager::class.java) /** Updates whether system app permissions usage should be displayed in the UI. */ fun updateShowSystemAppsToggle(showSystem: Boolean) { @@ -191,6 +194,7 @@ class PermissionUsageDetailsViewModel( ): List<AppPermissionAccessUiInfo> { return allLightHistoricalPackageOpsLiveData .getLightHistoricalPackageOps() + ?.filter { Utils.shouldShowInSettings(it.userHandle, userManager) } ?.flatMap { it.clusterAccesses(startTime, showSystem) } ?.sortedBy { -1 * it.discreteAccesses.first().accessTimeMs } ?.map { it.buildAppPermissionAccessUiInfo() } @@ -488,7 +492,8 @@ class PermissionUsageDetailsViewModel( ?.let { getPackageLabel( it.proxy!!.packageName!!, - UserHandle.getUserHandleForUid(it.proxy.uid)) + UserHandle.getUserHandleForUid(it.proxy.uid) + ) } /** Returns the attribution label for the permission access, if any. */ diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt index fa5b1b685..fc8deab79 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/model/v31/PermissionUsageViewModel.kt @@ -22,6 +22,7 @@ import android.app.role.RoleManager import android.os.Build import android.os.Bundle import android.os.UserHandle +import android.os.UserManager import androidx.annotation.RequiresApi import androidx.lifecycle.AbstractSavedStateViewModelFactory import androidx.lifecycle.AndroidViewModel @@ -55,6 +56,8 @@ class PermissionUsageViewModel( private val state: SavedStateHandle, app: Application, ) : AndroidViewModel(app) { + private val userManager = + Utils.getSystemServiceSafe(app.applicationContext, UserManager::class.java) private val roleManager = Utils.getSystemServiceSafe(app.applicationContext, RoleManager::class.java) private val exemptedPackages: Set<String> = Utils.getExemptedPackages(roleManager) @@ -114,7 +117,10 @@ class PermissionUsageViewModel( } val eligibleLightPackageOpsList: List<LightPackageOps> = - getAllLightPackageOps()?.filterOutExemptedApps() ?: listOf() + getAllLightPackageOps()?.filterOutExemptedApps()?.filter { + Utils.shouldShowInSettings(it.userHandle, userManager) + } + ?: listOf() for (lightPackageOps: LightPackageOps in eligibleLightPackageOpsList) { val permGroupsToLastAccess: List<Map.Entry<String, Long>> = diff --git a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java index fdeb2ed2a..5f23829b0 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/ui/wear/ReviewPermissionsWearFragment.java @@ -179,7 +179,10 @@ public class ReviewPermissionsWearFragment extends PreferenceFragmentCompat } else { preference.setEnabled(true); } - + if (preference.getParent() != null) { + // Remove first if already added. + preference.getParent().removePreference(preference); + } if (group.isReviewRequired()) { if (!isPackageUpdated) { // An app just being installed, which means all groups requiring reviews. diff --git a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java index 2c36c0adc..dffc49aa2 100644 --- a/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java +++ b/PermissionController/src/com/android/permissioncontroller/permission/utils/Utils.java @@ -68,6 +68,7 @@ import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.pm.ResolveInfo; +import android.content.pm.UserProperties; import android.content.res.Resources; import android.content.res.Resources.Theme; import android.graphics.Bitmap; @@ -1591,4 +1592,30 @@ public final class Utils { @NonNull ApplicationInfo applicationInfo) { return context.getPackageManager().getApplicationLabel(applicationInfo).toString(); } + + /** + * Returns whether the given user should be shown in the Settings UI in SdkLevel V+. This method + * will always return true for SdkLevels below V. + * + * @param userHandle The user for which to check whether it should be shown or not. + * @return true if it should be shown, false otherwise. + */ + public static boolean shouldShowInSettings(UserHandle userHandle, UserManager userManager) { + return !SdkLevel.isAtLeastV() || shouldShowInSettingsInternal(userHandle, userManager); + } + + /** + * Returns whether the given user should be shown in the Settings UI. + * + * @param userHandle The user for which to check whether it should be shown or not. + * @return true if it should be shown, false otherwise. + */ + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) + @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.VANILLA_ICE_CREAM) + private static boolean shouldShowInSettingsInternal( + UserHandle userHandle, UserManager userManager) { + var userProperties = userManager.getUserProperties(userHandle); + return !userManager.isQuietModeEnabled(userHandle) + || userProperties.getShowInQuietMode() != UserProperties.SHOW_IN_QUIET_MODE_HIDDEN; + } } diff --git a/SafetyCenter/Resources/res/values-de-v35/strings.xml b/SafetyCenter/Resources/res/values-de-v35/strings.xml index b3573e2a8..3cff5bf65 100644 --- a/SafetyCenter/Resources/res/values-de-v35/strings.xml +++ b/SafetyCenter/Resources/res/values-de-v35/strings.xml @@ -19,7 +19,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="cellular_network_security_title" msgid="2986431282931510973">"Sicherheit von Mobilfunknetzen"</string> <string name="cellular_network_security_summary" msgid="7319307247487475572">"Netzwerktyp, Verschlüsselung, Benachrichtigungseinstellungen"</string> - <string name="private_space_title" msgid="6158245041481535879">"Privater Bereich"</string> + <string name="private_space_title" msgid="6158245041481535879">"Privates Profil"</string> <string name="private_space_summary" msgid="529869826714610294">"Privaten Bereich einrichten und mehr"</string> - <string name="private_space_search_terms" msgid="4820808478299116258">"Privater Bereich"</string> + <string name="private_space_search_terms" msgid="4820808478299116258">"Privates Profil"</string> </resources> diff --git a/SafetyCenter/Resources/res/values-ja/strings.xml b/SafetyCenter/Resources/res/values-ja/strings.xml index 6e67998f4..b31b1690a 100644 --- a/SafetyCenter/Resources/res/values-ja/strings.xml +++ b/SafetyCenter/Resources/res/values-ja/strings.xml @@ -30,9 +30,9 @@ <string name="permission_usage_title" msgid="3633779688945350407">"プライバシー ダッシュボード"</string> <string name="permission_usage_summary" msgid="5323079206029964468">"権限を最近使用したアプリが表示されます"</string> <string name="permission_usage_search_terms" msgid="3852343592870257104">"プライバシー, プライバシー ダッシュボード"</string> - <string name="permission_manager_title" msgid="5277347862821255015">"権限マネージャー"</string> + <string name="permission_manager_title" msgid="5277347862821255015">"権限マネージャ"</string> <string name="permission_manager_summary" msgid="8099852107340970790">"アプリのデータアクセスを管理します"</string> - <string name="permission_manager_search_terms" msgid="2895147613099694722">"権限, 権限マネージャー"</string> + <string name="permission_manager_search_terms" msgid="2895147613099694722">"権限, 権限マネージャ"</string> <string name="privacy_controls_title" msgid="5322875777945432395">"プライバシー管理"</string> <string name="privacy_controls_summary" msgid="2402066941190435424">"マイク、カメラなどへのデバイス アクセスを管理します"</string> <string name="privacy_controls_search_terms" msgid="3774472175934304165">"プライバシー, プライバシー管理"</string> diff --git a/framework-s/api/system-current.txt b/framework-s/api/system-current.txt index b4dfafba2..527407bf3 100644 --- a/framework-s/api/system-current.txt +++ b/framework-s/api/system-current.txt @@ -7,6 +7,7 @@ package android.app.ecm { method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isClearRestrictionAllowed(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public boolean isRestricted(@NonNull String, @NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; method @RequiresPermission(android.Manifest.permission.MANAGE_ENHANCED_CONFIRMATION_STATES) public void setClearRestrictionAllowed(@NonNull String) throws android.content.pm.PackageManager.NameNotFoundException; + field public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG = "android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG"; } } diff --git a/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java index 52e220bc0..86aa222c6 100644 --- a/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java +++ b/framework-s/java/android/app/ecm/EnhancedConfirmationManager.java @@ -16,9 +16,12 @@ package android.app.ecm; +import static android.annotation.SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION; + import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.RequiresPermission; +import android.annotation.SdkConstant; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TargetApi; @@ -37,6 +40,7 @@ import android.util.ArraySet; import androidx.annotation.NonNull; import java.lang.annotation.Retention; +import java.util.concurrent.atomic.AtomicInteger; /** * This class provides the core API for ECM (Enhanced Confirmation Mode). ECM is a feature that @@ -192,6 +196,13 @@ public final class EnhancedConfirmationManager { * appropriate RequiresPermission annotation. */ + /** + * Shows the "Restricted setting" dialog. Opened when a setting is blocked. + */ + @SdkConstant(BROADCAST_INTENT_ACTION) + public static final String ACTION_SHOW_ECM_RESTRICTED_SETTING_DIALOG = + "android.app.ecm.action.SHOW_ECM_RESTRICTED_SETTING_DIALOG"; + /** A map of ECM states to their corresponding app op states */ @Retention(java.lang.annotation.RetentionPolicy.SOURCE) @IntDef(prefix = {"ECM_STATE_"}, value = {EcmState.ECM_STATE_NOT_GUARDED, @@ -218,6 +229,8 @@ public final class EnhancedConfirmationManager { private final @NonNull IEnhancedConfirmationManager mService; + private static final AtomicInteger sNextRequestCode = new AtomicInteger(1); + /** * @hide */ @@ -335,8 +348,8 @@ public final class EnhancedConfirmationManager { Intent intent = new Intent(Settings.ACTION_SHOW_RESTRICTED_SETTING_DIALOG); intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); intent.putExtra(Intent.EXTRA_UID, getPackageUid(packageName)); - // TODO(b/323225971): Pass settingIdentifier to dialog - return PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE); + return PendingIntent.getActivity(mContext, sNextRequestCode.getAndIncrement(), + intent, PendingIntent.FLAG_IMMUTABLE); } private int getPackageUid(String packageName) throws NameNotFoundException { diff --git a/framework/java/android/permission/PermissionState.java b/framework/java/android/permission/PermissionStateUnused.java index e810db8ec..21b21cc27 100644 --- a/framework/java/android/permission/PermissionState.java +++ b/framework/java/android/permission/PermissionStateUnused.java @@ -19,4 +19,4 @@ package android.permission; /** * @hide */ -public class PermissionState {} +public class PermissionStateUnused {} diff --git a/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt b/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt index c67707f5f..579b03f9c 100644 --- a/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt +++ b/tests/cts/permission/src/android/permission/cts/RevokePermissionTest.kt @@ -50,15 +50,6 @@ class RevokePermissionTest { @Test @AppModeFull(reason = "Instant apps can't revoke permissions.") - fun testRevokePermissionNotRequested() { - testRevoke( - packageName = APP_PKG_NAME, - permission = CAMERA - ) - } - - @Test - @AppModeFull(reason = "Instant apps can't revoke permissions.") fun testRevokeFakePermission() { val fakePermissionName = "FAKE_PERMISSION" testRevoke( @@ -94,16 +85,6 @@ class RevokePermissionTest { @Test @AppModeFull(reason = "Instant apps can't revoke permissions.") - fun testRevokePermissionNotRequestedWithReason() { - testRevoke( - packageName = APP_PKG_NAME, - permission = CAMERA, - reason = "test reason" - ) - } - - @Test - @AppModeFull(reason = "Instant apps can't revoke permissions.") fun testRevokeFakePermissionWithReason() { val fakePermissionName = "FAKE_PERMISSION" testRevoke( diff --git a/tests/cts/permissionmultidevice/AndroidManifest.xml b/tests/cts/permissionmultidevice/AndroidManifest.xml index e7c993d57..9bad85813 100644 --- a/tests/cts/permissionmultidevice/AndroidManifest.xml +++ b/tests/cts/permissionmultidevice/AndroidManifest.xml @@ -20,6 +20,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="android.permissionmultidevice.cts"> + <uses-feature android:name="android.software.companion_device_setup" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> diff --git a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt index 0eff95a3d..e8d35e614 100644 --- a/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt +++ b/tests/cts/permissionmultidevice/TestUtils/src/android/permissionmultidevice/cts/FakeVirtualDeviceRule.kt @@ -26,6 +26,7 @@ class FakeVirtualDeviceRule : FakeAssociationRule() { private lateinit var virtualDeviceManager: VirtualDeviceManager lateinit var virtualDevice: VirtualDeviceManager.VirtualDevice + lateinit var deviceDisplayName: String var virtualDisplayId: Int = -1 override fun before() { @@ -57,6 +58,10 @@ class FakeVirtualDeviceRule : FakeAssociationRule() { ) Truth.assertThat(display).isNotNull() virtualDisplayId = display!!.display.displayId + deviceDisplayName = + virtualDeviceManager + .getDisplayNameForPersistentDeviceId(virtualDevice.persistentDeviceId!!) + .toString() } } diff --git a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt index 09f4c7f08..b3efa36cb 100644 --- a/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt +++ b/tests/cts/permissionmultidevice/src/android/permissionmultidevice/cts/DeviceAwarePermissionGrantTest.kt @@ -94,7 +94,7 @@ class DeviceAwarePermissionGrantTest { Display.DEFAULT_DISPLAY, mFakeVirtualDeviceRule.virtualDevice.deviceId, true, - DEFAULT_REMOTE_DEVICE_NAME, + mFakeVirtualDeviceRule.deviceDisplayName, expectPermissionGrantedOnDefaultDevice = false, expectPermissionGrantedOnRemoteDevice = true ) @@ -120,7 +120,7 @@ class DeviceAwarePermissionGrantTest { mFakeVirtualDeviceRule.virtualDisplayId, mFakeVirtualDeviceRule.virtualDevice.deviceId, true, - DEFAULT_REMOTE_DEVICE_NAME, + mFakeVirtualDeviceRule.deviceDisplayName, expectPermissionGrantedOnDefaultDevice = false, expectPermissionGrantedOnRemoteDevice = true ) @@ -199,7 +199,6 @@ class DeviceAwarePermissionGrantTest { const val APP_APK_PATH_STREAMING = "${APK_DIRECTORY}/CtsAccessRemoteDeviceCamera.apk" const val APP_PACKAGE_NAME = "android.permissionmultidevice.cts.accessremotedevicecamera" const val PERMISSION_MESSAGE_ID = "com.android.permissioncontroller:id/permission_message" - const val DEFAULT_REMOTE_DEVICE_NAME = "remote device" const val ALLOW_BUTTON = "com.android.permissioncontroller:id/permission_allow_foreground_only_button" const val DEVICE_ID_DEFAULT = 0 diff --git a/tests/cts/permissionpolicy/res/raw/android_manifest.xml b/tests/cts/permissionpolicy/res/raw/android_manifest.xml index 7ee20f918..7231a1838 100644 --- a/tests/cts/permissionpolicy/res/raw/android_manifest.xml +++ b/tests/cts/permissionpolicy/res/raw/android_manifest.xml @@ -843,6 +843,19 @@ android:description="@string/permdesc_writeContacts" android:protectionLevel="dangerous" /> + <!-- Allows an app to update the verification status of E2EE contact keys owned by other apps. + <p>This permission is only granted to system apps. + <p>Protection level: signature|privileged + @SystemApi + @hide + @FlaggedApi("android.provider.user_keys") + --> + <permission android:name="android.permission.WRITE_VERIFICATION_STATE_E2EE_CONTACT_KEYS" + android:permissionGroup="android.permission-group.UNDEFINED" + android:label="@string/permlab_writeVerificationStateE2eeContactKeys" + android:description="@string/permdesc_writeVerificationStateE2eeContactKeys" + android:protectionLevel="signature|privileged" /> + <!-- Allows an application to set default account for new contacts. <p> This permission is only granted to system applications fulfilling the Contacts app role. <p>Protection level: internal|role @@ -2543,6 +2556,13 @@ android:description="@string/permdesc_detectScreenCapture" android:protectionLevel="normal" /> + <!-- Allows an application to get notified when it is being recorded. + <p>Protection level: normal + @FlaggedApi("com.android.window.flags.screen_recording_callbacks") + --> + <permission android:name="android.permission.DETECT_SCREEN_RECORDING" + android:protectionLevel="normal" /> + <!-- ======================================== --> <!-- Permissions for factory reset protection --> <!-- ======================================== --> diff --git a/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt index 83f53b252..42017a51e 100644 --- a/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt +++ b/tests/cts/permissionui/src/android/permissionui/cts/EnhancedConfirmationManagerTest.kt @@ -32,6 +32,7 @@ import androidx.test.platform.app.InstrumentationRegistry import com.android.compatibility.common.util.SystemUtil.eventually import com.android.compatibility.common.util.SystemUtil.runWithShellPermissionIdentity import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotEquals import org.junit.Assert.assertTrue import org.junit.Rule import org.junit.Test @@ -119,6 +120,19 @@ class EnhancedConfirmationManagerTest : BaseUsePermissionTest() { } } + @RequiresFlagsEnabled(Flags.FLAG_ENHANCED_CONFIRMATION_MODE_APIS_ENABLED) + @Test + fun getRestrictedSettingDialogIntentReturnsUniqueObjects() { + installPackageWithInstallSourceAndMetadataFromDownloadedFile(apkName) + + val pendingIntent1 = + ecm.getRestrictedSettingDialogIntent(APP_PACKAGE_NAME, PROTECTED_SETTING) + val pendingIntent2 = + ecm.getRestrictedSettingDialogIntent(APP_PACKAGE_NAME, PROTECTED_SETTING) + + assertNotEquals(pendingIntent1, pendingIntent2) + } + companion object { private const val NON_PROTECTED_SETTING = "example_setting_which_is_not_protected" private const val PROTECTED_SETTING = "android:bind_accessibility_service" diff --git a/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt b/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt index 0f1356ca4..6afcff85a 100644 --- a/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt +++ b/tests/hostside/safetycenter/helper-app/src/android/safetycenter/hostside/device/SafetyCenterInteractionLoggingHelperTests.kt @@ -23,6 +23,7 @@ import android.safetycenter.SafetyCenterManager.EXTRA_SAFETY_SOURCE_ID import android.safetycenter.SafetyCenterManager.EXTRA_SAFETY_SOURCE_ISSUE_ID import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.compatibility.common.util.UiAutomatorUtils2 import com.android.safetycenter.testing.SafetyCenterActivityLauncher.launchSafetyCenterActivity import com.android.safetycenter.testing.SafetyCenterActivityLauncher.launchSafetyCenterQsActivity import com.android.safetycenter.testing.SafetyCenterActivityLauncher.openPageAndExit @@ -34,6 +35,7 @@ import com.android.safetycenter.testing.SafetyCenterTestRule import com.android.safetycenter.testing.SafetySourceTestData import com.android.safetycenter.testing.SafetySourceTestData.Companion.INFORMATION_ISSUE_ID import com.android.safetycenter.testing.UiTestHelper.waitAllTextDisplayed +import org.junit.After import org.junit.Before import org.junit.Rule import org.junit.Test @@ -63,6 +65,14 @@ class SafetyCenterInteractionLoggingHelperTests { SafetyCenterFlags.showSubpages = true } + @After + fun tearDown() { + // When an assertion fails, it will end up leaving the previous view open, which screws + // with the logging assertions made by this test (polluting with view events from whatever + // view was left open). Here we preemptively clear whatever's open to get back to home + UiAutomatorUtils2.getUiDevice().pressHome() + } + @Test fun openSafetyCenter() { context.launchSafetyCenterActivity {} @@ -74,7 +84,7 @@ class SafetyCenterInteractionLoggingHelperTests { safetyCenterTestHelper.setData(SINGLE_SOURCE_ID, safetySourceTestData.informationWithIssue) context.launchSafetyCenterQsActivity { - openPageAndExit("Settings") { waitAllTextDisplayed("OK") } + openPageAndExit("Settings") { waitAllTextDisplayed(safetySourceTestData.informationIssue.title) } } } diff --git a/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt b/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt index 91222d045..42a2a8a89 100644 --- a/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt +++ b/tests/hostside/safetycenter/src/android/safetycenter/hostside/SafetyCenterInteractionLoggingHostTest.kt @@ -34,6 +34,7 @@ import java.security.MessageDigest import org.junit.After import org.junit.Assume.assumeTrue import org.junit.Before +import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -90,6 +91,7 @@ class SafetyCenterInteractionLoggingHostTest : BaseHostJUnit4Test() { } } + @Ignore // TODO: b/323269529 - Deflake this test @Test fun openSafetyCenterFullFromQs_recordsViewEventWithCorrectSource() { helperAppRule.runTest(TEST_CLASS_NAME, "openSafetyCenterFullFromQs") |