diff options
35 files changed, 510 insertions, 272 deletions
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 08e95a267d7f..c3ec09466de6 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -5935,6 +5935,10 @@ public abstract class Context { * more general access to the URI's content provider then this check will * always fail. * + * <strong>Note:</strong> On SDK Version {@link android.os.Build.VERSION_CODES#S}, + * calling this method from a secondary-user's context will incorrectly return + * {@link PackageManager#PERMISSION_DENIED} for all {code uris}. + * * @param uris The list of URIs that is being checked. * @param pid The process ID being checked against. Must be > 0. * @param uid The user ID being checked against. A uid of 0 is the root diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index a55484b89177..00abc759278f 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2242,6 +2242,21 @@ public final class Settings { public static final String ACTION_TETHER_SETTINGS = "android.settings.TETHER_SETTINGS"; /** + * Activity Action: Show screen that lets user configure wifi tethering. + * <p> + * In some cases, a matching Activity may not exist, so ensure you safeguard against this. + * <p> + * Input: Nothing + * <p> + * Output: Nothing + * + * @hide + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_WIFI_TETHER_SETTING = + "com.android.settings.WIFI_TETHER_SETTINGS"; + + /** * Broadcast to trigger notification of asking user to enable MMS. * Need to specify {@link #EXTRA_ENABLE_MMS_DATA_REQUEST_REASON} and {@link #EXTRA_SUB_ID}. * diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 7e286f042384..a817119a735f 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -8618,7 +8618,7 @@ public class BatteryStatsImpl extends BatteryStats { * inactive so can be dropped. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) - public boolean reset(long uptimeUs, long realtimeUs) { + public boolean reset(long uptimeUs, long realtimeUs, int resetReason) { boolean active = false; mOnBatteryBackgroundTimeBase.init(uptimeUs, realtimeUs); @@ -8688,7 +8688,11 @@ public class BatteryStatsImpl extends BatteryStats { resetIfNotNull(mBluetoothControllerActivity, false, realtimeUs); resetIfNotNull(mModemControllerActivity, false, realtimeUs); - MeasuredEnergyStats.resetIfNotNull(mUidMeasuredEnergyStats); + if (resetReason == RESET_REASON_MEASURED_ENERGY_BUCKETS_CHANGE) { + mUidMeasuredEnergyStats = null; + } else { + MeasuredEnergyStats.resetIfNotNull(mUidMeasuredEnergyStats); + } resetIfNotNull(mUserCpuTime, false, realtimeUs); resetIfNotNull(mSystemCpuTime, false, realtimeUs); @@ -11371,7 +11375,7 @@ public class BatteryStatsImpl extends BatteryStats { mNumConnectivityChange = 0; for (int i=0; i<mUidStats.size(); i++) { - if (mUidStats.valueAt(i).reset(uptimeUs, elapsedRealtimeUs)) { + if (mUidStats.valueAt(i).reset(uptimeUs, elapsedRealtimeUs, resetReason)) { mUidStats.valueAt(i).detachFromTimeBase(); mUidStats.remove(mUidStats.keyAt(i)); i--; diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java index 9b51a8ef6410..bb307a0d29d8 100644 --- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java +++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java @@ -21,13 +21,18 @@ import android.os.BatteryStats; import android.os.BatteryUsageStats; import android.os.BatteryUsageStatsQuery; import android.os.UidBatteryConsumer; +import android.util.Slog; import android.util.SparseArray; +import java.util.Arrays; + /** * Calculates the amount of power consumed by custom energy consumers (i.e. consumers of type * {@link android.hardware.power.stats.EnergyConsumerType#OTHER}). */ public class CustomMeasuredPowerCalculator extends PowerCalculator { + private static final String TAG = "CustomMeasuredPowerCalc"; + public CustomMeasuredPowerCalculator(PowerProfile powerProfile) { } @@ -76,9 +81,9 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator { if (totalPowerMah == null) { newTotalPowerMah = new double[customMeasuredPowerMah.length]; } else if (totalPowerMah.length != customMeasuredPowerMah.length) { - newTotalPowerMah = new double[customMeasuredPowerMah.length]; - System.arraycopy(totalPowerMah, 0, newTotalPowerMah, 0, - customMeasuredPowerMah.length); + Slog.wtf(TAG, "Number of custom energy components is not the same for all apps: " + + totalPowerMah.length + ", " + customMeasuredPowerMah.length); + newTotalPowerMah = Arrays.copyOf(totalPowerMah, customMeasuredPowerMah.length); } else { newTotalPowerMah = totalPowerMah; } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java index b851f0ad3414..0135fe84909a 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsSensorTest.java @@ -403,7 +403,7 @@ public class BatteryStatsSensorTest extends TestCase { assertNotNull(sensor.getSensorBackgroundTime()); // Reset the stats. Since the sensor is still running, we should still see the timer - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); sensor = uid.getSensorStats().get(SENSOR_ID); assertNotNull(sensor); @@ -413,7 +413,7 @@ public class BatteryStatsSensorTest extends TestCase { bi.noteStopSensorLocked(UID, SENSOR_ID); // Now the sensor timer has stopped so this reset should also take out the sensor. - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); sensor = uid.getSensorStats().get(SENSOR_ID); assertNull(sensor); @@ -465,7 +465,7 @@ public class BatteryStatsSensorTest extends TestCase { // Reset the stats. Since the sensor is still running, we should still see the timer // but still with 0 times. - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); @@ -504,7 +504,7 @@ public class BatteryStatsSensorTest extends TestCase { // Reset the stats. Since the sensor is still running, we should still see the timer // but with 0 times. - bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000); + bi.getUidStatsLocked(UID).reset(clocks.uptime * 1000, clocks.realtime * 1000, 0); assertEquals(0, timer.getTotalTimeLocked(1000*clocks.realtime, which)); assertEquals(0, timer.getTotalDurationMsLocked(clocks.realtime)); assertEquals(0, bgTimer.getTotalTimeLocked(1000*clocks.realtime, which)); diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml index 50bfbe07b205..89739f6f6fc4 100644 --- a/packages/SettingsLib/res/values-as/arrays.xml +++ b/packages/SettingsLib/res/values-as/arrays.xml @@ -228,7 +228,7 @@ <item msgid="8612549335720461635">"৪কে. (সুৰক্ষিত)"</item> <item msgid="7322156123728520872">"৪কে. (বৰ্ধিত)"</item> <item msgid="7735692090314849188">"৪কে. (বৰ্ধিত, সুৰক্ষিত)"</item> - <item msgid="7346816300608639624">"৭২০পি., ১০৮০পি. (দ্বৈত স্ক্ৰীণ)"</item> + <item msgid="7346816300608639624">"৭২০পি., ১০৮০পি. (দ্বৈত স্ক্ৰীন)"</item> </string-array> <string-array name="enable_opengl_traces_entries"> <item msgid="4433736508877934305">"নাই"</item> @@ -243,7 +243,7 @@ </string-array> <string-array name="track_frame_time_entries"> <item msgid="634406443901014984">"অফ হৈ আছে"</item> - <item msgid="1288760936356000927">"স্ক্ৰীণত দণ্ড হিচাপে"</item> + <item msgid="1288760936356000927">"স্ক্ৰীনত দণ্ড হিচাপে"</item> <item msgid="5023908510820531131">"<xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>ত"</item> </string-array> <string-array name="debug_hw_overdraw_entries"> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 1ae3452ac847..9f9b11d1e3b1 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -238,7 +238,7 @@ <string name="bugreport_in_power" msgid="8664089072534638709">"বাগ ৰিপৰ্টৰ শ্ৱৰ্টকাট"</string> <string name="bugreport_in_power_summary" msgid="1885529649381831775">"পাৱাৰ মেনুত বাগ প্ৰতিবেদন গ্ৰহণ কৰিবলৈ এটা বুটাম দেখুৱাওক"</string> <string name="keep_screen_on" msgid="1187161672348797558">"জাগ্ৰত কৰি ৰাখক"</string> - <string name="keep_screen_on_summary" msgid="1510731514101925829">"চ্চাৰ্জ হৈ থকাৰ সময়ত স্ক্ৰীণ কেতিয়াও সুপ্ত অৱস্থালৈ নাযায়"</string> + <string name="keep_screen_on_summary" msgid="1510731514101925829">"চ্চাৰ্জ হৈ থকাৰ সময়ত স্ক্ৰীন কেতিয়াও সুপ্ত অৱস্থালৈ নাযায়"</string> <string name="bt_hci_snoop_log" msgid="7291287955649081448">"ব্লুটুথ HCI স্নুপ ল’গ সক্ষম কৰক"</string> <string name="bt_hci_snoop_log_summary" msgid="6808538971394092284">"ব্লুটুথ পেকেট সংগ্ৰহ কৰক। (এই ছেটিংটো সলনি কৰাৰ পিছত ব্লুটুথ ট’গল কৰক)"</string> <string name="oem_unlock_enable" msgid="5334869171871566731">"ঔইএম আনলক"</string> @@ -331,9 +331,9 @@ <string name="media_category" msgid="8122076702526144053">"মিডিয়া"</string> <string name="debug_monitoring_category" msgid="1597387133765424994">"নিৰীক্ষণ কৰি থকা হৈছে"</string> <string name="strict_mode" msgid="889864762140862437">"কঠোৰ ম’ড সক্ষম কৰা হৈছে"</string> - <string name="strict_mode_summary" msgid="1838248687233554654">"যেতিয়া এপসমূহে মুখ্য থ্ৰেডত দীঘলীয়া কাৰ্যকলাপ চলাই, তেতিয়া স্ক্ৰীণ ফ্লাশ্ব কৰক"</string> + <string name="strict_mode_summary" msgid="1838248687233554654">"যেতিয়া এপ্সমূহে মুখ্য থ্ৰেডত দীঘলীয়া কাৰ্যকলাপ চলাই, তেতিয়া স্ক্ৰীন ফ্লাশ্ব কৰক"</string> <string name="pointer_location" msgid="7516929526199520173">"পইণ্টাৰৰ অৱস্থান"</string> - <string name="pointer_location_summary" msgid="957120116989798464">"চলিত স্পৰ্শ-বিষয়ক তথ্যসহ স্ক্ৰীণ অভাৰলে\'"</string> + <string name="pointer_location_summary" msgid="957120116989798464">"চলিত স্পৰ্শ-বিষয়ক তথ্যসহ স্ক্ৰীন অভাৰলে’"</string> <string name="show_touches" msgid="8437666942161289025">"টেপসমূহ দেখুৱাওক"</string> <string name="show_touches_summary" msgid="3692861665994502193">"টিপিলে দৃশ্যায়িত ফীডবেক দিয়ক"</string> <string name="show_screen_updates" msgid="2078782895825535494">"পৃষ্ঠভাগৰ আপডেইট দেখুৱাওক"</string> @@ -344,7 +344,7 @@ <string name="show_hw_layers_updates_summary" msgid="5850955890493054618">"হাৰ্ডৱেৰ লেয়াৰ আপডেইট হওতে সিঁহতক সেউজীয়া ৰঙেৰে ফ্লাশ্ব কৰক"</string> <string name="debug_hw_overdraw" msgid="8944851091008756796">"GPU অভাৰড্ৰ ডিবাগ কৰক"</string> <string name="disable_overlays" msgid="4206590799671557143">"HW অ’ভাৰলে অক্ষম কৰক"</string> - <string name="disable_overlays_summary" msgid="1954852414363338166">"স্ক্ৰীণ কম্প’জিট কৰাৰ বাবে সদায় জিপিইউ ব্যৱহাৰ কৰক"</string> + <string name="disable_overlays_summary" msgid="1954852414363338166">"স্ক্ৰীন কম্প’জিট কৰাৰ বাবে সদায় জিপিইউ ব্যৱহাৰ কৰক"</string> <string name="simulate_color_space" msgid="1206503300335835151">"ৰঙৰ ঠাই ছিমিউলেইট কৰক"</string> <string name="enable_opengl_traces_title" msgid="4638773318659125196">"OpenGL ট্ৰেছ সক্ষম কৰক"</string> <string name="usb_audio_disable_routing" msgid="3367656923544254975">"ইউএছবি অডিঅ\' ৰাউটিং অক্ষম কৰক"</string> @@ -352,7 +352,7 @@ <string name="debug_layout" msgid="1659216803043339741">"লেআউটৰ সময় দেখুৱাওক"</string> <string name="debug_layout_summary" msgid="8825829038287321978">"ক্লিপ বাউণ্ড, মাৰ্জিন আদিসমূহ দেখুৱাওক"</string> <string name="force_rtl_layout_all_locales" msgid="8690762598501599796">"আৰটিএল চানেকিৰ দিশ বলেৰে সলনি কৰক"</string> - <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"সকলো ভাষাৰ বাবে স্ক্ৰীণৰ চানেকিৰ দিশ RTLলৈ বলেৰে সলনি কৰক"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="6663016859517239880">"সকলো ভাষাৰ বাবে স্ক্ৰীনৰ চানেকিৰ দিশ RTLলৈ বলেৰে সলনি কৰক"</string> <string name="window_blurs" msgid="6831008984828425106">"ৱিণ্ড’ স্তৰত অস্পষ্ট কৰাৰ অনুমতি দিয়ক"</string> <string name="force_msaa" msgid="4081288296137775550">"বল ৪গুণ MSAA"</string> <string name="force_msaa_summary" msgid="9070437493586769500">"OpenGL ES 2.0 এপত ৪গুণ MSAA সক্ষম কৰক"</string> @@ -373,7 +373,7 @@ <string name="show_all_anrs" msgid="9160563836616468726">"নেপথ্য এএনআৰবোৰ দেখুৱাওক"</string> <string name="show_all_anrs_summary" msgid="8562788834431971392">"নেপথ্য এপসমূহৰ বাবে এপে সঁহাৰি দিয়া নাই ডায়ল\'গ প্ৰদৰ্শন কৰক"</string> <string name="show_notification_channel_warnings" msgid="3448282400127597331">"জাননী চ্চেনেলৰ সকীয়নিসমূহ দেখুৱাওক"</string> - <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীণত সকীয়নি প্ৰদৰ্শন হয়"</string> + <string name="show_notification_channel_warnings_summary" msgid="68031143745094339">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীনত সকীয়নি প্ৰদৰ্শন হয়"</string> <string name="force_allow_on_external" msgid="9187902444231637880">"বাহ্যিক সঞ্চয়াগাৰত এপক বলেৰে অনুমতি দিয়ক"</string> <string name="force_allow_on_external_summary" msgid="8525425782530728238">"মেনিফেষ্টৰ মান যিয়েই নহওক, বাহ্যিক সঞ্চয়াগাৰত লিখিবলৈ যিকোনো এপক উপযুক্ত কৰি তোলে"</string> <string name="force_resizable_activities" msgid="7143612144399959606">"বলেৰে কাৰ্যকলাপসমূহৰ আকাৰ সলনি কৰিব পৰা কৰক"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index 921caba34e13..108d86d185e0 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -286,7 +286,7 @@ <string name="wifi_scan_throttling_summary" msgid="2577105472017362814">"Réduit la décharge de la batterie et améliore les performances du réseau"</string> <string name="wifi_enhanced_mac_randomization_summary" msgid="1210663439867489931">"Quand ce mode est activé, l\'adresse MAC de cet appareil peut changer chaque fois qu\'il se connecte à un réseau Wi-Fi où le changement aléatoire d\'adresse MAC est activé"</string> <string name="wifi_metered_label" msgid="8737187690304098638">"Facturé à l\'usage"</string> - <string name="wifi_unmetered_label" msgid="6174142840934095093">"Non facturé à l\'usage"</string> + <string name="wifi_unmetered_label" msgid="6174142840934095093">"Sans compteur"</string> <string name="select_logd_size_title" msgid="1604578195914595173">"Tailles des tampons de l\'enregistreur"</string> <string name="select_logd_size_dialog_title" msgid="2105401994681013578">"Tailles enreg. par tampon journal"</string> <string name="dev_logpersist_clear_warning_title" msgid="8631859265777337991">"Effacer l\'espace de stockage persistant de l\'enregistreur ?"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index cbf92af607d2..0f381c966932 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -542,7 +542,7 @@ <string name="delete_blob_text" msgid="2819192607255625697">"Ортақ деректерді жою"</string> <string name="delete_blob_confirmation_text" msgid="7807446938920827280">"Осы ортақ деректерді шынымен жойғыңыз келе ме?"</string> <string name="user_add_user_item_summary" msgid="5748424612724703400">"Пайдаланушылардың өздерінің қолданбалары мен мазмұны болады"</string> - <string name="user_add_profile_item_summary" msgid="5418602404308968028">"Өз есептік жазбаңыздан қолданбалар мен мазмұнға қол жетімділікті шектеуіңізге болады"</string> + <string name="user_add_profile_item_summary" msgid="5418602404308968028">"Өз аккаунтыңыздан қолданбалар мен мазмұнға қол жетімділікті шектеуіңізге болады"</string> <string name="user_add_user_item_title" msgid="2394272381086965029">"Пайдаланушы"</string> <string name="user_add_profile_item_title" msgid="3111051717414643029">"Шектелген профайл"</string> <string name="user_add_user_title" msgid="5457079143694924885">"Жаңа пайдаланушы қосылсын ба?"</string> diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml index 801c037684f9..195fc47e8c64 100644 --- a/packages/SettingsLib/res/values-ko/arrays.xml +++ b/packages/SettingsLib/res/values-ko/arrays.xml @@ -28,7 +28,7 @@ <item msgid="2837871868181677206">"IP 주소를 가져오는 중..."</item> <item msgid="4613015005934755724">"연결됨"</item> <item msgid="3763530049995655072">"일시 정지됨"</item> - <item msgid="7852381437933824454">"연결을 끊는 중…"</item> + <item msgid="7852381437933824454">"연결 해제 중…"</item> <item msgid="5046795712175415059">"연결 끊김"</item> <item msgid="2473654476624070462">"실패"</item> <item msgid="9146847076036105115">"차단됨"</item> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index 97ad0a0ef347..c455c14b1226 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -65,7 +65,7 @@ <string name="wifi_passpoint_expired" msgid="6540867261754427561">"만료됨"</string> <string name="preference_summary_default_combination" msgid="2644094566845577901">"<xliff:g id="STATE">%1$s</xliff:g>/<xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> <string name="bluetooth_disconnected" msgid="7739366554710388701">"연결 끊김"</string> - <string name="bluetooth_disconnecting" msgid="7638892134401574338">"연결을 끊는 중…"</string> + <string name="bluetooth_disconnecting" msgid="7638892134401574338">"연결 해제 중…"</string> <string name="bluetooth_connecting" msgid="5871702668260192755">"연결 중…"</string> <string name="bluetooth_connected" msgid="8065345572198502293">"연결됨<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string> <string name="bluetooth_pairing" msgid="4269046942588193600">"페어링 중..."</string> diff --git a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml index b841419c1c75..d286832631ba 100644 --- a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml +++ b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml @@ -39,7 +39,7 @@ android:layout_width="wrap_content" android:layout_height="32dp" android:textColor="?android:attr/textColorPrimary" - android:fontFamily="google-sans" + android:fontFamily="@*android:string/config_headlineFontFamily" android:textSize="24sp"/> <TextView @@ -50,7 +50,7 @@ android:layout_marginTop="4dp" android:ellipsize="end" android:maxLines="1" - android:fontFamily="google-sans" + android:fontFamily="@*android:string/config_headlineFontFamily" android:textSize="14sp"/> </LinearLayout> @@ -87,24 +87,49 @@ android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout - android:id="@+id/internet_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout + android:id="@+id/ethernet_layout" + style="@style/InternetDialog.Network" + android:background="@drawable/settingslib_switch_bar_bg_on" + android:visibility="gone"> + + <FrameLayout + android:layout_width="24dp" + android:layout_height="24dp" + android:layout_gravity="center_vertical|start" + android:clickable="false"> + <ImageView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:autoMirrored="true" + android:src="@drawable/stat_sys_ethernet_fully" + android:tint="@color/connected_network_primary_color"/> + </FrameLayout> + + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="start|center_vertical" + android:orientation="vertical" + android:clickable="false"> + <TextView + android:text="@string/ethernet_label" + style="@style/InternetDialog.NetworkTitle.Active"/> + <TextView + android:text="@string/to_switch_networks_disconnect_ethernet" + style="@style/InternetDialog.NetworkSummary.Active"/> + </LinearLayout> + </LinearLayout> + + <LinearLayout android:id="@+id/mobile_network_layout" - android:layout_width="match_parent" - android:layout_height="88dp" - android:clickable="true" - android:focusable="true" - android:background="?android:attr/selectableItemBackground" - android:layout_gravity="center_vertical|start" - android:orientation="horizontal" - android:layout_marginEnd="@dimen/internet_dialog_network_layout_margin" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:paddingStart="22dp" - android:paddingEnd="22dp"> + style="@style/InternetDialog.Network"> <FrameLayout android:layout_width="24dp" @@ -121,7 +146,6 @@ <LinearLayout android:layout_weight="1" - android:id="@+id/mobile_network_list" android:orientation="vertical" android:clickable="false" android:layout_width="wrap_content" @@ -129,28 +153,10 @@ android:gravity="start|center_vertical"> <TextView android:id="@+id/mobile_title" - android:textDirection="locale" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:layout_marginEnd="7dp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:ellipsize="end" - android:textColor="?android:attr/textColorPrimary" - android:textSize="16sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkTitle"/> <TextView android:id="@+id/mobile_summary" - android:textDirection="locale" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:layout_marginEnd="34dp" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:ellipsize="end" - android:textColor="?android:attr/textColorTertiary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkSummary"/> </LinearLayout> <FrameLayout @@ -172,17 +178,9 @@ <LinearLayout android:id="@+id/turn_on_wifi_layout" - android:layout_width="match_parent" + style="@style/InternetDialog.Network" android:layout_height="72dp" - android:clickable="true" - android:focusable="true" - android:background="?android:attr/selectableItemBackground" - android:gravity="center" - android:orientation="horizontal" - android:layout_marginEnd="@dimen/internet_dialog_network_layout_margin" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:paddingStart="22dp" - android:paddingEnd="22dp"> + android:gravity="center"> <FrameLayout android:layout_weight="1" @@ -193,13 +191,10 @@ <TextView android:id="@+id/wifi_toggle_title" android:text="@string/turn_on_wifi" - android:textDirection="locale" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="start|center_vertical" - android:textColor="?android:attr/textColorPrimary" - android:textSize="16sp" - android:fontFamily="google-sans"/> + android:textAppearance="@style/TextAppearance.InternetDialog"/> </FrameLayout> <FrameLayout @@ -222,18 +217,12 @@ <LinearLayout android:id="@+id/wifi_connected_layout" - android:layout_width="match_parent" + style="@style/InternetDialog.Network" android:layout_height="72dp" - android:layout_gravity="center_vertical|start" - android:clickable="true" - android:focusable="true" - android:visibility="gone" - android:background="?android:attr/selectableItemBackground" - android:orientation="horizontal" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:layout_marginEnd="@dimen/internet_dialog_network_layout_margin" android:paddingStart="20dp" - android:paddingEnd="24dp"> + android:paddingEnd="24dp" + android:background="@drawable/settingslib_switch_bar_bg_on" + android:visibility="gone"> <FrameLayout android:layout_width="24dp" @@ -248,7 +237,6 @@ </FrameLayout> <LinearLayout - android:id="@+id/wifi_connected_list" android:orientation="vertical" android:clickable="false" android:layout_width="wrap_content" @@ -258,26 +246,11 @@ android:gravity="start|center_vertical"> <TextView android:id="@+id/wifi_connected_title" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:ellipsize="end" - android:textColor="?android:attr/textColorPrimary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkTitle.Active" + android:textSize="14sp"/> <TextView android:id="@+id/wifi_connected_summary" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical|start" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin" - android:ellipsize="end" - android:textColor="?android:attr/textColorTertiary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + style="@style/InternetDialog.NetworkSummary.Active"/> </LinearLayout> <FrameLayout @@ -340,13 +313,11 @@ android:layout_marginStart="@dimen/internet_dialog_network_layout_margin"> <TextView android:text="@string/see_all_networks" - android:textDirection="locale" android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="start|center_vertical" - android:textColor="?android:attr/textColorPrimary" - android:textSize="14sp" - android:fontFamily="google-sans"/> + android:textAppearance="@style/TextAppearance.InternetDialog" + android:textSize="14sp"/> </FrameLayout> </LinearLayout> @@ -366,7 +337,7 @@ android:textColor="?android:attr/textColorPrimary" android:text="@string/inline_done_button" android:textSize="14sp" - android:fontFamily="google-sans"/> + android:fontFamily="@*android:string/config_headlineFontFamily"/> </FrameLayout> </LinearLayout> </androidx.core.widget.NestedScrollView> diff --git a/packages/SystemUI/res/layout/internet_list_item.xml b/packages/SystemUI/res/layout/internet_list_item.xml index 05352c507e7e..868331ec830f 100644 --- a/packages/SystemUI/res/layout/internet_list_item.xml +++ b/packages/SystemUI/res/layout/internet_list_item.xml @@ -24,21 +24,15 @@ <LinearLayout android:id="@+id/wifi_list" - android:layout_width="match_parent" + style="@style/InternetDialog.Network" android:layout_height="72dp" - android:layout_gravity="center_vertical|start" - android:clickable="true" - android:focusable="true" - android:background="?android:attr/selectableItemBackground" - android:orientation="horizontal" android:paddingStart="20dp" - android:paddingEnd="40dp"> + android:paddingEnd="24dp"> <FrameLayout android:layout_width="24dp" android:layout_height="24dp" android:clickable="false" - android:layout_gravity="center_vertical|start" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin"> + android:layout_gravity="center_vertical|start"> <ImageView android:id="@+id/wifi_icon" android:layout_width="wrap_content" @@ -52,31 +46,16 @@ android:clickable="false" android:layout_width="wrap_content" android:layout_height="72dp" + android:layout_marginEnd="30dp" android:layout_weight="1" - android:gravity="start|center_vertical" - android:layout_marginStart="@dimen/internet_dialog_network_layout_margin"> + android:gravity="start|center_vertical"> <TextView android:id="@+id/wifi_title" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="20dp" - android:gravity="start|center_vertical" - android:ellipsize="end" - android:textColor="?android:attr/textColorPrimary" - android:textSize="14sp" - android:fontFamily="google-sans" - android:layout_marginEnd="18dp"/> + style="@style/InternetDialog.NetworkTitle" + android:textSize="14sp"/> <TextView android:id="@+id/wifi_summary" - android:textDirection="locale" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="start|center_vertical" - android:ellipsize="end" - android:textColor="?android:attr/textColorSecondary" - android:textSize="14sp" - android:fontFamily="google-sans" - android:layout_marginEnd="18dp"/> + style="@style/InternetDialog.NetworkSummary"/> </LinearLayout> <FrameLayout diff --git a/packages/SystemUI/res/layout/keyguard_qs_user_switch.xml b/packages/SystemUI/res/layout/keyguard_qs_user_switch.xml index a21a63c3e7c3..9cf09ff328c4 100644 --- a/packages/SystemUI/res/layout/keyguard_qs_user_switch.xml +++ b/packages/SystemUI/res/layout/keyguard_qs_user_switch.xml @@ -15,19 +15,25 @@ ~ limitations under the License --> <!-- This is a view that shows a user switcher in Keyguard. --> -<com.android.systemui.statusbar.phone.UserAvatarView +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res-auto" android:id="@+id/keyguard_qs_user_switch_view" - android:layout_width="@dimen/kg_framed_avatar_size" - android:layout_height="@dimen/kg_framed_avatar_size" - android:layout_centerHorizontal="true" - android:layout_gravity="top|end" - android:layout_marginEnd="16dp" - systemui:avatarPadding="0dp" - systemui:badgeDiameter="18dp" - systemui:badgeMargin="1dp" - systemui:frameColor="@color/kg_user_avatar_frame" - systemui:framePadding="0dp" - systemui:frameWidth="0dp"> -</com.android.systemui.statusbar.phone.UserAvatarView> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_gravity="end"> + <com.android.systemui.statusbar.phone.UserAvatarView + android:id="@+id/kg_multi_user_avatar" + android:layout_width="@dimen/kg_framed_avatar_size" + android:layout_height="@dimen/kg_framed_avatar_size" + android:layout_centerHorizontal="true" + android:layout_gravity="top|end" + android:layout_marginEnd="16dp" + systemui:avatarPadding="0dp" + systemui:badgeDiameter="18dp" + systemui:badgeMargin="1dp" + systemui:frameColor="@color/kg_user_avatar_frame" + systemui:framePadding="0dp" + systemui:frameWidth="0dp"> + </com.android.systemui.statusbar.phone.UserAvatarView> +</FrameLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml index 461505f12ce6..ffcc3a821d36 100644 --- a/packages/SystemUI/res/values-night/styles.xml +++ b/packages/SystemUI/res/values-night/styles.xml @@ -48,4 +48,16 @@ <item name="android:windowLightStatusBar">false</item> </style> + <style name="TextAppearance.InternetDialog.Active"> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">16sp</item> + <item name="android:textColor">@color/connected_network_primary_color</item> + <item name="android:textDirection">locale</item> + </style> + + <style name="TextAppearance.InternetDialog.Secondary.Active"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">@color/connected_network_secondary_color</item> + </style> + </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index ebf6e4888de4..6019b0e9ed9e 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -3027,4 +3027,6 @@ <string name="wifi_failed_connect_message">Failed to connect to network</string> <!-- Provider Model: Title to see all the networks [CHAR LIMIT=50] --> <string name="see_all_networks">See all</string> + <!-- Summary for warning to disconnect ethernet first then switch to other networks. [CHAR LIMIT=60] --> + <string name="to_switch_networks_disconnect_ethernet">To switch networks, disconnect ethernet</string> </resources> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index d25474255bfc..8a809e46fe99 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -951,4 +951,60 @@ <item name="android:maxHeight">4dp</item> </style> + <!-- Internet Dialog --> + <style name="InternetDialog"> + <item name="android:layout_width">wrap_content</item> + <item name="android:layout_height">wrap_content</item> + <item name="android:layout_gravity">center_vertical|start</item> + <item name="android:layout_marginStart">@dimen/internet_dialog_network_layout_margin</item> + </style> + + <style name="InternetDialog.Network"> + <item name="android:layout_width">match_parent</item> + <item name="android:layout_height">88dp</item> + <item name="android:layout_marginEnd">@dimen/internet_dialog_network_layout_margin</item> + <item name="android:paddingStart">22dp</item> + <item name="android:paddingEnd">22dp</item> + <item name="android:orientation">horizontal</item> + <item name="android:focusable">true</item> + <item name="android:clickable">true</item> + </style> + + <style name="InternetDialog.NetworkTitle"> + <item name="android:layout_marginEnd">7dp</item> + <item name="android:ellipsize">end</item> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog</item> + </style> + + <style name="InternetDialog.NetworkTitle.Active"> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Active</item> + </style> + + <style name="InternetDialog.NetworkSummary"> + <item name="android:layout_marginEnd">34dp</item> + <item name="android:ellipsize">end</item> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Secondary</item> + </style> + + <style name="InternetDialog.NetworkSummary.Active"> + <item name="android:textAppearance">@style/TextAppearance.InternetDialog.Secondary.Active + </item> + </style> + + <style name="TextAppearance.InternetDialog"> + <item name="android:fontFamily">@*android:string/config_headlineFontFamily</item> + <item name="android:textSize">16sp</item> + <item name="android:textColor">?android:attr/textColorPrimary</item> + <item name="android:textDirection">locale</item> + </style> + + <style name="TextAppearance.InternetDialog.Secondary"> + <item name="android:textSize">14sp</item> + <item name="android:textColor">?android:attr/textColorTertiary</item> + </style> + + <style name="TextAppearance.InternetDialog.Active"/> + + <style name="TextAppearance.InternetDialog.Secondary.Active"/> + </resources> diff --git a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardQsUserSwitchComponent.java b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardQsUserSwitchComponent.java index 3a0357d2a284..4331f52eb1a2 100644 --- a/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardQsUserSwitchComponent.java +++ b/packages/SystemUI/src/com/android/keyguard/dagger/KeyguardQsUserSwitchComponent.java @@ -16,7 +16,8 @@ package com.android.keyguard.dagger; -import com.android.systemui.statusbar.phone.UserAvatarView; +import android.widget.FrameLayout; + import com.android.systemui.statusbar.policy.KeyguardQsUserSwitchController; import dagger.BindsInstance; @@ -31,8 +32,7 @@ public interface KeyguardQsUserSwitchComponent { /** Simple factory for {@link KeyguardUserSwitcherComponent}. */ @Subcomponent.Factory interface Factory { - KeyguardQsUserSwitchComponent build( - @BindsInstance UserAvatarView userAvatarView); + KeyguardQsUserSwitchComponent build(@BindsInstance FrameLayout userAvatarContainer); } /** Builds a {@link KeyguardQsUserSwitchController}. */ diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt index e232316b8a94..2630f119de00 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleController.kt @@ -16,6 +16,7 @@ package com.android.systemui.biometrics +import android.animation.ValueAnimator import android.content.Context import android.content.res.Configuration import android.graphics.PointF @@ -26,6 +27,8 @@ import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.settingslib.Utils import com.android.systemui.R +import com.android.systemui.animation.Interpolators +import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.statusbar.CircleReveal import com.android.systemui.statusbar.LightRevealEffect import com.android.systemui.statusbar.NotificationShadeWindowController @@ -36,12 +39,15 @@ import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.StatusBar import com.android.systemui.statusbar.phone.dagger.StatusBarComponent.StatusBarScope import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.ViewController import java.io.PrintWriter import javax.inject.Inject import javax.inject.Provider import com.android.systemui.plugins.statusbar.StatusBarStateController +private const val WAKE_AND_UNLOCK_FADE_DURATION = 180L + /*** * Controls the ripple effect that shows when authentication is successful. * The ripple uses the accent color of the current theme. @@ -53,6 +59,8 @@ class AuthRippleController @Inject constructor( private val authController: AuthController, private val configurationController: ConfigurationController, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, + private val keyguardStateController: KeyguardStateController, + private val wakefulnessLifecycle: WakefulnessLifecycle, private val commandRegistry: CommandRegistry, private val notificationShadeWindowController: NotificationShadeWindowController, private val bypassController: KeyguardBypassController, @@ -60,7 +68,11 @@ class AuthRippleController @Inject constructor( private val udfpsControllerProvider: Provider<UdfpsController>, private val statusBarStateController: StatusBarStateController, rippleView: AuthRippleView? -) : ViewController<AuthRippleView>(rippleView) { +) : ViewController<AuthRippleView>(rippleView), KeyguardStateController.Callback, + WakefulnessLifecycle.Observer { + + @VisibleForTesting + internal var startLightRevealScrimOnKeyguardFadingAway = false var fingerprintSensorLocation: PointF? = null private var faceSensorLocation: PointF? = null private var circleReveal: LightRevealEffect? = null @@ -87,6 +99,8 @@ class AuthRippleController @Inject constructor( udfpsController?.addCallback(udfpsControllerCallback) configurationController.addCallback(configurationChangedListener) keyguardUpdateMonitor.registerCallback(keyguardUpdateMonitorCallback) + keyguardStateController.addCallback(this) + wakefulnessLifecycle.addObserver(this) commandRegistry.registerCommand("auth-ripple") { AuthRippleCommand() } } @@ -96,6 +110,8 @@ class AuthRippleController @Inject constructor( authController.removeCallback(authControllerCallback) keyguardUpdateMonitor.removeCallback(keyguardUpdateMonitorCallback) configurationController.removeCallback(configurationChangedListener) + keyguardStateController.removeCallback(this) + wakefulnessLifecycle.removeObserver(this) commandRegistry.unregisterCommand("auth-ripple") notificationShadeWindowController.setForcePluginOpen(false, this) @@ -123,30 +139,48 @@ class AuthRippleController @Inject constructor( private fun showUnlockedRipple() { notificationShadeWindowController.setForcePluginOpen(true, this) - val biometricUnlockMode = biometricUnlockController.mode - val useCircleReveal = circleReveal != null && - (biometricUnlockMode == BiometricUnlockController.MODE_WAKE_AND_UNLOCK || - biometricUnlockMode == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_PULSING || - biometricUnlockMode == BiometricUnlockController.MODE_WAKE_AND_UNLOCK_FROM_DREAM) + val useCircleReveal = circleReveal != null && biometricUnlockController.isWakeAndUnlock val lightRevealScrim = statusBar.lightRevealScrim if (useCircleReveal) { lightRevealScrim?.revealEffect = circleReveal!! + startLightRevealScrimOnKeyguardFadingAway = true } mView.startUnlockedRipple( /* end runnable */ Runnable { notificationShadeWindowController.setForcePluginOpen(false, this) - }, - /* circleReveal */ - if (useCircleReveal) { - lightRevealScrim - } else { - null } ) } + override fun onKeyguardFadingAwayChanged() { + if (keyguardStateController.isKeyguardFadingAway) { + val lightRevealScrim = statusBar.lightRevealScrim + if (startLightRevealScrimOnKeyguardFadingAway && lightRevealScrim != null) { + val revealAnimator = ValueAnimator.ofFloat(.1f, 1f).apply { + interpolator = Interpolators.LINEAR_OUT_SLOW_IN + duration = RIPPLE_ANIMATION_DURATION + startDelay = keyguardStateController.keyguardFadingAwayDelay + addUpdateListener { animator -> + if (lightRevealScrim.revealEffect != circleReveal) { + // if the something else took over the reveal, let's do nothing. + return@addUpdateListener + } + lightRevealScrim.revealAmount = animator.animatedValue as Float + } + } + revealAnimator.start() + startLightRevealScrimOnKeyguardFadingAway = false + } + } + } + + override fun onStartedGoingToSleep() { + // reset the light reveal start in case we were pending an unlock + startLightRevealScrimOnKeyguardFadingAway = false + } + fun updateSensorLocation() { fingerprintSensorLocation = authController.fingerprintSensorLocation faceSensorLocation = authController.faceAuthSensorLocation @@ -318,4 +352,8 @@ class AuthRippleController @Inject constructor( help(pw) } } + + companion object { + const val RIPPLE_ANIMATION_DURATION: Long = 1533 + } } diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt index 1113579e417c..c6d26ffb9957 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/AuthRippleView.kt @@ -26,13 +26,10 @@ import android.graphics.PointF import android.util.AttributeSet import android.view.View import android.view.animation.PathInterpolator -import com.android.internal.R.attr.interpolator import com.android.internal.graphics.ColorUtils import com.android.systemui.animation.Interpolators -import com.android.systemui.statusbar.LightRevealScrim import com.android.systemui.statusbar.charging.RippleShader -private const val RIPPLE_ANIMATION_DURATION: Long = 1533 private const val RIPPLE_SPARKLE_STRENGTH: Float = 0.4f /** @@ -250,7 +247,7 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at /** * Ripple that bursts outwards from the position of the sensor to the edges of the screen */ - fun startUnlockedRipple(onAnimationEnd: Runnable?, lightReveal: LightRevealScrim?) { + fun startUnlockedRipple(onAnimationEnd: Runnable?) { if (unlockedRippleInProgress) { return // Ignore if ripple effect is already playing } @@ -266,7 +263,7 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at val rippleAnimator = ValueAnimator.ofFloat(rippleStart, 1f).apply { interpolator = Interpolators.LINEAR_OUT_SLOW_IN - duration = RIPPLE_ANIMATION_DURATION + duration = AuthRippleController.RIPPLE_ANIMATION_DURATION addUpdateListener { animator -> val now = animator.currentPlayTime rippleShader.progress = animator.animatedValue as Float @@ -276,14 +273,6 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at } } - val revealAnimator = ValueAnimator.ofFloat(.1f, 1f).apply { - interpolator = rippleAnimator.interpolator - duration = rippleAnimator.duration - addUpdateListener { animator -> - lightReveal?.revealAmount = animator.animatedValue as Float - } - } - val alphaInAnimator = ValueAnimator.ofInt(0, 255).apply { duration = alphaDuration addUpdateListener { animator -> @@ -298,7 +287,6 @@ class AuthRippleView(context: Context?, attrs: AttributeSet?) : View(context, at val animatorSet = AnimatorSet().apply { playTogether( rippleAnimator, - revealAnimator, alphaInAnimator ) addListener(object : AnimatorListenerAdapter() { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index ee3d40edc2eb..1a8af3bb650b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -818,6 +818,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, private final KeyguardStateController mKeyguardStateController; private final Lazy<KeyguardUnlockAnimationController> mKeyguardUnlockAnimationControllerLazy; + private boolean mWallpaperSupportsAmbientMode; /** * Injected constructor. See {@link KeyguardModule}. @@ -2089,13 +2090,14 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, int flags = 0; if (mKeyguardViewControllerLazy.get().shouldDisableWindowAnimationsForUnlock() - || (mWakeAndUnlocking && !mPulsing) - || isAnimatingBetweenKeyguardAndSurfaceBehindOrWillBe()) { + || mWakeAndUnlocking && !mWallpaperSupportsAmbientMode) { flags |= WindowManagerPolicyConstants .KEYGUARD_GOING_AWAY_FLAG_NO_WINDOW_ANIMATIONS; } if (mKeyguardViewControllerLazy.get().isGoingToNotificationShade() - || (mWakeAndUnlocking && mPulsing)) { + || mWakeAndUnlocking && mWallpaperSupportsAmbientMode) { + // When the wallpaper supports ambient mode, the scrim isn't fully opaque during + // wake and unlock and we should fade in the app on top of the wallpaper flags |= WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; } if (mKeyguardViewControllerLazy.get().isUnlockWithWallpaper()) { @@ -2784,6 +2786,15 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, mPulsing = pulsing; } + /** + * Set if the wallpaper supports ambient mode. This is used to trigger the right animation. + * In case it does support it, we have to fade in the incoming app, otherwise we'll reveal it + * with the light reveal scrim. + */ + public void setWallpaperSupportsAmbientMode(boolean supportsAmbientMode) { + mWallpaperSupportsAmbientMode = supportsAmbientMode; + } + private static class StartKeyguardExitAnimParams { @WindowManager.TransitionOldType int mTransit; diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 0433247e1707..70c21e43b79a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -101,10 +101,7 @@ import java.util.function.Consumer; public class NavigationBarView extends FrameLayout implements NavigationModeController.ModeChangedListener { final static boolean DEBUG = false; - final static String TAG = "StatusBar/NavBarView"; - - // slippery nav bar when everything is disabled, e.g. during setup - final static boolean SLIPPERY_WHEN_DISABLED = true; + final static String TAG = "NavBarView"; final static boolean ALTERNATE_CAR_MODE_UI = false; private final RegionSamplingHelper mRegionSamplingHelper; @@ -373,6 +370,12 @@ public class NavigationBarView extends FrameLayout implements } } + @Override + protected boolean onSetAlpha(int alpha) { + Log.e(TAG, "onSetAlpha", new Throwable()); + return super.onSetAlpha(alpha); + } + public void setAutoHideController(AutoHideController autoHideController) { mAutoHideController = autoHideController; } @@ -1313,6 +1316,7 @@ public class NavigationBarView extends FrameLayout implements dumpButton(pw, "back", getBackButton()); dumpButton(pw, "home", getHomeButton()); + dumpButton(pw, "handle", getHomeHandle()); dumpButton(pw, "rcnt", getRecentsButton()); dumpButton(pw, "rota", getRotateSuggestionButton()); dumpButton(pw, "a11y", getAccessibilityButton()); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 34f2b6331678..87edc2cf8bac 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -47,6 +47,7 @@ import javax.inject.Inject; /** Quick settings tile: Hotspot **/ public class HotspotTile extends QSTileImpl<BooleanState> { + private final Icon mEnabledStatic = ResourceIcon.get(R.drawable.ic_hotspot); private final HotspotController mHotspotController; @@ -98,7 +99,7 @@ public class HotspotTile extends QSTileImpl<BooleanState> { @Override public Intent getLongClickIntent() { - return new Intent(Settings.ACTION_TETHER_SETTINGS); + return new Intent(Settings.ACTION_WIFI_TETHER_SETTING); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java index b1db8a97b8af..08da68037c58 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialog.java @@ -52,6 +52,7 @@ import android.widget.ProgressBar; import android.widget.Switch; import android.widget.TextView; +import androidx.annotation.MainThread; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.annotation.WorkerThread; @@ -60,7 +61,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEventLogger; -import com.android.settingslib.Utils; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; @@ -105,12 +105,10 @@ public class InternetDialog extends SystemUIDialog implements private View mDivider; private ProgressBar mProgressBar; private LinearLayout mInternetDialogLayout; - private LinearLayout mInternetListLayout; private LinearLayout mConnectedWifListLayout; - private LinearLayout mConnectedWifList; private LinearLayout mMobileNetworkLayout; - private LinearLayout mMobileNetworkList; private LinearLayout mTurnWifiOnLayout; + private LinearLayout mEthernetLayout; private TextView mWifiToggleTitleText; private LinearLayout mSeeAllLayout; private RecyclerView mWifiRecyclerView; @@ -126,7 +124,6 @@ public class InternetDialog extends SystemUIDialog implements private Button mDoneButton; private Drawable mBackgroundOn; private int mListMaxHeight; - private int mLayoutWidth; private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private boolean mCanConfigMobileData; @@ -181,8 +178,6 @@ public class InternetDialog extends SystemUIDialog implements }; mListMaxHeight = context.getResources().getDimensionPixelSize( R.dimen.internet_dialog_list_max_height); - mLayoutWidth = context.getResources().getDimensionPixelSize( - R.dimen.internet_dialog_list_max_width); mUiEventLogger = uiEventLogger; mAdapter = new InternetAdapter(mInternetDialogController); if (!aboveStatusBar) { @@ -221,13 +216,11 @@ public class InternetDialog extends SystemUIDialog implements mInternetDialogSubTitle = mDialogView.requireViewById(R.id.internet_dialog_subtitle); mDivider = mDialogView.requireViewById(R.id.divider); mProgressBar = mDialogView.requireViewById(R.id.wifi_searching_progress); - mInternetListLayout = mDialogView.requireViewById(R.id.internet_list); + mEthernetLayout = mDialogView.requireViewById(R.id.ethernet_layout); mMobileNetworkLayout = mDialogView.requireViewById(R.id.mobile_network_layout); - mMobileNetworkList = mDialogView.requireViewById(R.id.mobile_network_list); mTurnWifiOnLayout = mDialogView.requireViewById(R.id.turn_on_wifi_layout); mWifiToggleTitleText = mDialogView.requireViewById(R.id.wifi_toggle_title); mConnectedWifListLayout = mDialogView.requireViewById(R.id.wifi_connected_layout); - mConnectedWifList = mDialogView.requireViewById(R.id.wifi_connected_list); mConnectedWifiIcon = mDialogView.requireViewById(R.id.wifi_connected_icon); mConnectedWifiTitleText = mDialogView.requireViewById(R.id.wifi_connected_title); mConnectedWifiSummaryText = mDialogView.requireViewById(R.id.wifi_connected_summary); @@ -309,6 +302,7 @@ public class InternetDialog extends SystemUIDialog implements } else { mInternetDialogSubTitle.setText(getSubtitleText()); } + updateEthernet(); setMobileDataLayout(mInternetDialogController.activeNetworkIsCellular()); if (!mCanConfigWifi) { @@ -355,6 +349,12 @@ public class InternetDialog extends SystemUIDialog implements mDoneButton.setOnClickListener(v -> dismiss()); } + @MainThread + private void updateEthernet() { + mEthernetLayout.setVisibility( + mInternetDialogController.hasEthernet() ? View.VISIBLE : View.GONE); + } + private void setMobileDataLayout(boolean isCellularNetwork) { if (mInternetDialogController.isAirplaneModeEnabled() || !mInternetDialogController.hasCarrier()) { @@ -371,38 +371,33 @@ public class InternetDialog extends SystemUIDialog implements mMobileSummaryText.setVisibility(View.GONE); } mSignalIcon.setImageDrawable(getSignalStrengthDrawable()); - if (mInternetDialogController.isNightMode()) { - int titleColor = isCellularNetwork ? mContext.getColor( - R.color.connected_network_primary_color) : Utils.getColorAttrDefaultColor( - mContext, android.R.attr.textColorPrimary); - int summaryColor = isCellularNetwork ? mContext.getColor( - R.color.connected_network_secondary_color) : Utils.getColorAttrDefaultColor( - mContext, android.R.attr.textColorSecondary); - - mMobileTitleText.setTextColor(titleColor); - mMobileSummaryText.setTextColor(summaryColor); - } + mMobileTitleText.setTextAppearance(isCellularNetwork + ? R.style.TextAppearance_InternetDialog_Active + : R.style.TextAppearance_InternetDialog); + mMobileSummaryText.setTextAppearance(isCellularNetwork + ? R.style.TextAppearance_InternetDialog_Secondary_Active + : R.style.TextAppearance_InternetDialog_Secondary); mMobileNetworkLayout.setBackground(isCellularNetwork ? mBackgroundOn : null); mMobileDataToggle.setVisibility(mCanConfigMobileData ? View.VISIBLE : View.INVISIBLE); } } + @MainThread private void updateWifiToggle(boolean isWifiEnabled, boolean isDeviceLocked) { mWiFiToggle.setChecked(isWifiEnabled); - if (isDeviceLocked && mInternetDialogController.isNightMode()) { - int titleColor = mConnectedWifiEntry != null ? mContext.getColor( - R.color.connected_network_primary_color) : Utils.getColorAttrDefaultColor( - mContext, android.R.attr.textColorPrimary); - mWifiToggleTitleText.setTextColor(titleColor); + if (isDeviceLocked) { + mWifiToggleTitleText.setTextAppearance((mConnectedWifiEntry != null) + ? R.style.TextAppearance_InternetDialog_Active + : R.style.TextAppearance_InternetDialog); } mTurnWifiOnLayout.setBackground( (isDeviceLocked && mConnectedWifiEntry != null) ? mBackgroundOn : null); } + @MainThread private void updateConnectedWifi(boolean isWifiEnabled, boolean isDeviceLocked) { if (!isWifiEnabled || mConnectedWifiEntry == null || isDeviceLocked) { - mConnectedWifListLayout.setBackground(null); mConnectedWifListLayout.setVisibility(View.GONE); return; } @@ -411,15 +406,8 @@ public class InternetDialog extends SystemUIDialog implements mConnectedWifiSummaryText.setText(mConnectedWifiEntry.getSummary(false)); mConnectedWifiIcon.setImageDrawable( mInternetDialogController.getInternetWifiDrawable(mConnectedWifiEntry)); - if (mInternetDialogController.isNightMode()) { - mConnectedWifiTitleText.setTextColor( - mContext.getColor(R.color.connected_network_primary_color)); - mConnectedWifiSummaryText.setTextColor( - mContext.getColor(R.color.connected_network_secondary_color)); - } mWifiSettingsIcon.setColorFilter( mContext.getColor(R.color.connected_network_primary_color)); - mConnectedWifListLayout.setBackground(mBackgroundOn); } void onClickConnectedWifi() { @@ -528,11 +516,18 @@ public class InternetDialog extends SystemUIDialog implements } @Override + @WorkerThread public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { mHandler.post(() -> updateDialog()); } @Override + @WorkerThread + public void onLost(Network network) { + mHandler.post(() -> updateDialog()); + } + + @Override public void onSubscriptionsChanged(int defaultDataSubId) { mDefaultDataSubId = defaultDataSubId; mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java index 50e7e43822ea..95d3915eb64d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/dialog/InternetDialogController.java @@ -23,7 +23,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; @@ -31,7 +30,6 @@ import android.graphics.drawable.LayerDrawable; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; -import android.net.NetworkRequest; import android.net.wifi.WifiManager; import android.os.Handler; import android.provider.Settings; @@ -49,6 +47,7 @@ import android.util.Log; import android.view.Gravity; import android.widget.Toast; +import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -133,6 +132,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, private KeyguardUpdateMonitor mKeyguardUpdateMonitor; private GlobalSettings mGlobalSettings; private int mDefaultDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + private ConnectivityManager.NetworkCallback mConnectivityManagerNetworkCallback; @VisibleForTesting protected ActivityStarter mActivityStarter; @@ -146,6 +146,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, protected boolean mCanConfigWifi; @VisibleForTesting protected KeyguardStateController mKeyguardStateController; + @VisibleForTesting + protected boolean mHasEthernet = false; private final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback = new KeyguardUpdateMonitorCallback() { @@ -193,6 +195,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mAccessPointController = accessPointController; mConfig = MobileMappings.Config.readConfig(mContext); mWifiIconInjector = new WifiUtils.InternetIconInjector(mContext); + mConnectivityManagerNetworkCallback = new DataConnectivityListener(); } void onStart(@NonNull InternetDialogCallback callback, boolean canConfigWifi) { @@ -216,9 +219,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mInternetTelephonyCallback = new InternetTelephonyCallback(); mTelephonyManager.registerTelephonyCallback(mExecutor, mInternetTelephonyCallback); // Listen the connectivity changes - mConnectivityManager.registerNetworkCallback(new NetworkRequest.Builder() - .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - .build(), new DataConnectivityListener(), mHandler); + mConnectivityManager.registerDefaultNetworkCallback(mConnectivityManagerNetworkCallback); mCanConfigWifi = canConfigWifi; scanWifiAccessPoints(); } @@ -233,6 +234,7 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, mOnSubscriptionsChangedListener); mAccessPointController.removeAccessPointCallback(this); mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateCallback); + mConnectivityManager.unregisterNetworkCallback(mConnectivityManagerNetworkCallback); } @VisibleForTesting @@ -351,11 +353,6 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, return drawable; } - boolean isNightMode() { - return (mContext.getResources().getConfiguration().uiMode - & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; - } - Drawable getSignalStrengthDrawable() { Drawable drawable = mContext.getDrawable( R.drawable.ic_signal_strength_zero_bar_no_internet); @@ -800,6 +797,9 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, } int count = MAX_WIFI_ENTRY_COUNT; + if (mHasEthernet) { + count -= 1; + } if (hasCarrier()) { count -= 1; } @@ -870,21 +870,30 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, @Override @WorkerThread public void onCapabilitiesChanged(@NonNull Network network, - @NonNull NetworkCapabilities networkCapabilities) { - if (mCanConfigWifi) { - for (int transport : networkCapabilities.getTransportTypes()) { - if (transport == NetworkCapabilities.TRANSPORT_WIFI) { - scanWifiAccessPoints(); - break; - } - } - } - final Network activeNetwork = mConnectivityManager.getActiveNetwork(); - if (activeNetwork != null && activeNetwork.equals(network)) { - // update UI - mCallback.onCapabilitiesChanged(network, networkCapabilities); + @NonNull NetworkCapabilities capabilities) { + mHasEthernet = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET); + if (mCanConfigWifi && (mHasEthernet || capabilities.hasTransport( + NetworkCapabilities.TRANSPORT_WIFI))) { + scanWifiAccessPoints(); } + // update UI + mCallback.onCapabilitiesChanged(network, capabilities); } + + @Override + @WorkerThread + public void onLost(@NonNull Network network) { + mHasEthernet = false; + mCallback.onLost(network); + } + } + + /** + * Return {@code true} If the Ethernet exists + */ + @MainThread + public boolean hasEthernet() { + return mHasEthernet; } private final BroadcastReceiver mConnectionStateReceiver = new BroadcastReceiver() { @@ -934,6 +943,8 @@ public class InternetDialogController implements WifiEntry.DisconnectCallback, void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities); + void onLost(@NonNull Network network); + void onSubscriptionsChanged(int defaultDataSubId); void onServiceStateChanged(ServiceState serviceState); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index a771274e3433..0134b9f9c618 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -615,6 +615,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mClearAllEnabled = res.getBoolean(R.bool.config_enableNotificationsClearAll); mGroupMembershipManager = groupMembershipManager; mGroupExpansionManager = groupExpansionManager; + setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } void initializeForegroundServiceSection(ForegroundServiceDungeonView fgsSectionView) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index e6bb30624f77..963bf7b7fb00 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -853,13 +853,13 @@ public class NotificationPanelViewController extends PanelViewController { mKeyguardStatusBar = mView.findViewById(R.id.keyguard_header); mBigClockContainer = mView.findViewById(R.id.big_clock_container); - UserAvatarView userAvatarView = null; + FrameLayout userAvatarContainer = null; KeyguardUserSwitcherView keyguardUserSwitcherView = null; if (mKeyguardUserSwitcherEnabled && mUserManager.isUserSwitcherEnabled()) { if (mKeyguardQsUserSwitchEnabled) { ViewStub stub = mView.findViewById(R.id.keyguard_qs_user_switch_stub); - userAvatarView = (UserAvatarView) stub.inflate(); + userAvatarContainer = (FrameLayout) stub.inflate(); } else { ViewStub stub = mView.findViewById(R.id.keyguard_user_switcher_stub); keyguardUserSwitcherView = (KeyguardUserSwitcherView) stub.inflate(); @@ -868,7 +868,7 @@ public class NotificationPanelViewController extends PanelViewController { updateViewControllers( mView.findViewById(R.id.keyguard_status_view), - userAvatarView, + userAvatarContainer, mKeyguardStatusBar, keyguardUserSwitcherView); mNotificationContainerParent = mView.findViewById(R.id.notification_container_parent); @@ -960,7 +960,7 @@ public class NotificationPanelViewController extends PanelViewController { } private void updateViewControllers(KeyguardStatusView keyguardStatusView, - UserAvatarView userAvatarView, + FrameLayout userAvatarView, KeyguardStatusBarView keyguardStatusBarView, KeyguardUserSwitcherView keyguardUserSwitcherView) { // Re-associate the KeyguardStatusViewController @@ -1112,7 +1112,7 @@ public class NotificationPanelViewController extends PanelViewController { !mKeyguardQsUserSwitchEnabled && mKeyguardUserSwitcherEnabled && isUserSwitcherEnabled; - UserAvatarView userAvatarView = (UserAvatarView) reInflateStub( + FrameLayout userAvatarView = (FrameLayout) reInflateStub( R.id.keyguard_qs_user_switch_view /* viewId */, R.id.keyguard_qs_user_switch_stub /* stubId */, R.layout.keyguard_qs_user_switch /* layoutId */, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index d7a359e9b4d4..65072f4d67b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -592,6 +592,7 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationShadeWindowController.setWallpaperSupportsAmbientMode(supportsAmbientMode); mScrimController.setWallpaperSupportsAmbientMode(supportsAmbientMode); + mKeyguardViewMediator.setWallpaperSupportsAmbientMode(supportsAmbientMode); } }; @@ -3924,7 +3925,8 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onDozeAmountChanged(float linear, float eased) { if (mFeatureFlags.useNewLockscreenAnimations() - && !(mLightRevealScrim.getRevealEffect() instanceof CircleReveal)) { + && !(mLightRevealScrim.getRevealEffect() instanceof CircleReveal) + && !mBiometricUnlockController.isWakeAndUnlock()) { mLightRevealScrim.setRevealAmount(1f - linear); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java index a0edc7c494bc..1e5251196379 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java @@ -149,7 +149,7 @@ public class BrightnessMirrorController private void reinflate() { int index = mStatusBarWindow.indexOfChild(mBrightnessMirror); mStatusBarWindow.removeView(mBrightnessMirror); - mBrightnessMirror = (FrameLayout) LayoutInflater.from(mBrightnessMirror.getContext()) + mBrightnessMirror = (FrameLayout) LayoutInflater.from(mStatusBarWindow.getContext()) .inflate(R.layout.brightness_mirror_container, mStatusBarWindow, false); mToggleSliderController = setMirrorLayout(); mStatusBarWindow.addView(mBrightnessMirror, index); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java index 5e70d0dbc418..d838a05135e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardQsUserSwitchController.java @@ -27,6 +27,7 @@ import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.FrameLayout; import com.android.keyguard.KeyguardConstants; import com.android.keyguard.KeyguardVisibilityHelper; @@ -56,7 +57,7 @@ import javax.inject.Provider; * Manages the user switch on the Keyguard that is used for opening the QS user panel. */ @KeyguardUserSwitcherScope -public class KeyguardQsUserSwitchController extends ViewController<UserAvatarView> { +public class KeyguardQsUserSwitchController extends ViewController<FrameLayout> { private static final String TAG = "KeyguardQsUserSwitchController"; private static final boolean DEBUG = KeyguardConstants.DEBUG; @@ -76,6 +77,7 @@ public class KeyguardQsUserSwitchController extends ViewController<UserAvatarVie private final KeyguardVisibilityHelper mKeyguardVisibilityHelper; private final KeyguardUserDetailAdapter mUserDetailAdapter; private NotificationPanelViewController mNotificationPanelViewController; + private UserAvatarView mUserAvatarView; UserSwitcherController.UserRecord mCurrentUser; // State info for the user switch and keyguard @@ -111,7 +113,7 @@ public class KeyguardQsUserSwitchController extends ViewController<UserAvatarVie @Inject public KeyguardQsUserSwitchController( - UserAvatarView view, + FrameLayout view, Context context, @Main Resources resources, ScreenLifecycle screenLifecycle, @@ -143,6 +145,7 @@ public class KeyguardQsUserSwitchController extends ViewController<UserAvatarVie protected void onInit() { super.onInit(); if (DEBUG) Log.d(TAG, "onInit"); + mUserAvatarView = mView.findViewById(R.id.kg_multi_user_avatar); mAdapter = new UserSwitcherController.BaseUserAdapter(mUserSwitcherController) { @Override public View getView(int position, View convertView, ViewGroup parent) { @@ -150,11 +153,10 @@ public class KeyguardQsUserSwitchController extends ViewController<UserAvatarVie } }; - mView.setOnClickListener(v -> { + mUserAvatarView.setOnClickListener(v -> { if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { return; } - if (isListAnimating()) { return; } @@ -163,7 +165,7 @@ public class KeyguardQsUserSwitchController extends ViewController<UserAvatarVie openQsUserPanel(); }); - mView.setAccessibilityDelegate(new View.AccessibilityDelegate() { + mUserAvatarView.setAccessibilityDelegate(new View.AccessibilityDelegate() { public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(host, info); info.addAction(new AccessibilityNodeInfo.AccessibilityAction( @@ -237,12 +239,12 @@ public class KeyguardQsUserSwitchController extends ViewController<UserAvatarVie R.string.accessibility_multi_user_switch_switcher); } - if (!TextUtils.equals(mView.getContentDescription(), contentDescription)) { - mView.setContentDescription(contentDescription); + if (!TextUtils.equals(mUserAvatarView.getContentDescription(), contentDescription)) { + mUserAvatarView.setContentDescription(contentDescription); } int userId = mCurrentUser != null ? mCurrentUser.resolveId() : UserHandle.USER_NULL; - mView.setDrawableWithBadge(getCurrentUserIcon().mutate(), userId); + mUserAvatarView.setDrawableWithBadge(getCurrentUserIcon().mutate(), userId); } Drawable getCurrentUserIcon() { @@ -269,7 +271,7 @@ public class KeyguardQsUserSwitchController extends ViewController<UserAvatarVie * Get the height of the keyguard user switcher view when closed. */ public int getUserIconHeight() { - return mView.getHeight(); + return mUserAvatarView.getHeight(); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java index 20b66f03192e..cd8894cae684 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcherListView.java @@ -103,7 +103,7 @@ public class KeyguardUserSwitcherListView extends AlphaOptimizedLinearLayout { } } - if (animate) { + if (animate && userItemViews.length > 1) { // AnimationUtils will immediately hide/show the first item in the array. Since the // first view is the current user, we want to manage its visibility separately. // Set first item to null so AnimationUtils ignores it. diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt index 5c73077c0e69..f2f0029708ed 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthRippleControllerTest.kt @@ -19,17 +19,23 @@ package com.android.systemui.biometrics import android.graphics.PointF import android.hardware.biometrics.BiometricSourceType import android.testing.AndroidTestingRunner +import android.testing.TestableLooper.RunWithLooper import androidx.test.filters.SmallTest import com.android.keyguard.KeyguardUpdateMonitor import com.android.keyguard.KeyguardUpdateMonitorCallback import com.android.systemui.SysuiTestCase import com.android.systemui.plugins.statusbar.StatusBarStateController +import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.statusbar.LightRevealScrim import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.commandline.CommandRegistry import com.android.systemui.statusbar.phone.BiometricUnlockController import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.phone.StatusBar import com.android.systemui.statusbar.policy.ConfigurationController +import com.android.systemui.statusbar.policy.KeyguardStateController +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -55,12 +61,15 @@ class AuthRippleControllerTest : SysuiTestCase() { @Mock private lateinit var configurationController: ConfigurationController @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor @Mock private lateinit var authController: AuthController + @Mock private lateinit var keyguardStateController: KeyguardStateController + @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle @Mock private lateinit var notificationShadeWindowController: NotificationShadeWindowController @Mock private lateinit var bypassController: KeyguardBypassController @Mock private lateinit var biometricUnlockController: BiometricUnlockController @Mock private lateinit var udfpsControllerProvider: Provider<UdfpsController> @Mock private lateinit var udfpsController: UdfpsController @Mock private lateinit var statusBarStateController: StatusBarStateController + @Mock private lateinit var lightRevealScrim: LightRevealScrim @Before fun setUp() { @@ -73,6 +82,8 @@ class AuthRippleControllerTest : SysuiTestCase() { authController, configurationController, keyguardUpdateMonitor, + keyguardStateController, + wakefulnessLifecycle, commandRegistry, notificationShadeWindowController, bypassController, @@ -82,6 +93,7 @@ class AuthRippleControllerTest : SysuiTestCase() { rippleView ) controller.init() + `when`(statusBar.lightRevealScrim).thenReturn(lightRevealScrim) } @Test @@ -103,7 +115,7 @@ class AuthRippleControllerTest : SysuiTestCase() { // THEN update sensor location and show ripple verify(rippleView).setSensorLocation(fpsLocation) - verify(rippleView).startUnlockedRipple(any(), any()) + verify(rippleView).startUnlockedRipple(any()) } @Test @@ -124,7 +136,7 @@ class AuthRippleControllerTest : SysuiTestCase() { false /* isStrongBiometric */) // THEN no ripple - verify(rippleView, never()).startUnlockedRipple(any(), any()) + verify(rippleView, never()).startUnlockedRipple(any()) } @Test @@ -145,7 +157,7 @@ class AuthRippleControllerTest : SysuiTestCase() { false /* isStrongBiometric */) // THEN no ripple - verify(rippleView, never()).startUnlockedRipple(any(), any()) + verify(rippleView, never()).startUnlockedRipple(any()) } @Test @@ -169,7 +181,7 @@ class AuthRippleControllerTest : SysuiTestCase() { // THEN show ripple verify(rippleView).setSensorLocation(faceLocation) - verify(rippleView).startUnlockedRipple(any(), any()) + verify(rippleView).startUnlockedRipple(any()) } @Test @@ -189,7 +201,7 @@ class AuthRippleControllerTest : SysuiTestCase() { false /* isStrongBiometric */) // THEN no ripple - verify(rippleView, never()).startUnlockedRipple(any(), any()) + verify(rippleView, never()).startUnlockedRipple(any()) } @Test @@ -204,7 +216,7 @@ class AuthRippleControllerTest : SysuiTestCase() { 0 /* userId */, BiometricSourceType.FACE /* type */, false /* isStrongBiometric */) - verify(rippleView, never()).startUnlockedRipple(any(), any()) + verify(rippleView, never()).startUnlockedRipple(any()) } @Test @@ -219,7 +231,39 @@ class AuthRippleControllerTest : SysuiTestCase() { 0 /* userId */, BiometricSourceType.FINGERPRINT /* type */, false /* isStrongBiometric */) - verify(rippleView, never()).startUnlockedRipple(any(), any()) + verify(rippleView, never()).startUnlockedRipple(any()) + } + + @Test + fun registersAndDeregisters() { + controller.onViewAttached() + val captor = ArgumentCaptor + .forClass(KeyguardStateController.Callback::class.java) + verify(keyguardStateController).addCallback(captor.capture()) + val captor2 = ArgumentCaptor + .forClass(WakefulnessLifecycle.Observer::class.java) + verify(wakefulnessLifecycle).addObserver(captor2.capture()) + controller.onViewDetached() + verify(keyguardStateController).removeCallback(any()) + verify(wakefulnessLifecycle).removeObserver(any()) + } + + @Test + @RunWithLooper(setAsMainLooper = true) + fun testAnimatorRunWhenWakeAndUnlock() { + val fpsLocation = PointF(5f, 5f) + `when`(authController.fingerprintSensorLocation).thenReturn(fpsLocation) + controller.onViewAttached() + `when`(keyguardUpdateMonitor.isKeyguardVisible).thenReturn(true) + `when`(biometricUnlockController.isWakeAndUnlock).thenReturn(true) + + controller.showRipple(BiometricSourceType.FINGERPRINT) + assertTrue("reveal didn't start on keyguardFadingAway", + controller.startLightRevealScrimOnKeyguardFadingAway) + `when`(keyguardStateController.isKeyguardFadingAway).thenReturn(true) + controller.onKeyguardFadingAwayChanged() + assertFalse("reveal triggers multiple times", + controller.startLightRevealScrimOnKeyguardFadingAway) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java index baddacc3e6f5..18f48a36100c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogControllerTest.java @@ -444,6 +444,47 @@ public class InternetDialogControllerTest extends SysuiTestCase { verify(mInternetDialogCallback).onAccessPointsChanged(mWifiEntries, mConnectedEntry); } + @Test + public void onAccessPointsChanged_fourWifiEntries_callbackCutMore() { + reset(mInternetDialogCallback); + mInternetDialogController.setAirplaneModeEnabled(true); + mAccessPoints.clear(); + mAccessPoints.add(mWifiEntry1); + mAccessPoints.add(mWifiEntry2); + mAccessPoints.add(mWifiEntry3); + mAccessPoints.add(mWifiEntry4); + + mInternetDialogController.onAccessPointsChanged(mAccessPoints); + + mWifiEntries.clear(); + mWifiEntries.add(mWifiEntry1); + mWifiEntries.add(mWifiEntry2); + mWifiEntries.add(mWifiEntry3); + mWifiEntries.add(mWifiEntry4); + verify(mInternetDialogCallback) + .onAccessPointsChanged(mWifiEntries, null /* connectedEntry */); + + // If the Ethernet exists, then Wi-Fi entries will cut last one. + reset(mInternetDialogCallback); + mInternetDialogController.mHasEthernet = true; + + mInternetDialogController.onAccessPointsChanged(mAccessPoints); + + mWifiEntries.remove(mWifiEntry4); + verify(mInternetDialogCallback) + .onAccessPointsChanged(mWifiEntries, null /* connectedEntry */); + + // Turn off airplane mode to has carrier network, then Wi-Fi entries will cut last one. + reset(mInternetDialogCallback); + mInternetDialogController.setAirplaneModeEnabled(false); + + mInternetDialogController.onAccessPointsChanged(mAccessPoints); + + mWifiEntries.remove(mWifiEntry3); + verify(mInternetDialogCallback) + .onAccessPointsChanged(mWifiEntries, null /* connectedEntry */); + } + private String getResourcesString(String name) { return mContext.getResources().getString(getResourcesId(name)); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java index fa9c0538e9bd..c42b64a09985 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/dialog/InternetDialogTest.java @@ -67,6 +67,7 @@ public class InternetDialogTest extends SysuiTestCase { private InternetDialog mInternetDialog; private View mDialogView; private View mSubTitle; + private LinearLayout mEthernet; private LinearLayout mMobileDataToggle; private LinearLayout mWifiToggle; private LinearLayout mConnectedWifi; @@ -97,6 +98,7 @@ public class InternetDialogTest extends SysuiTestCase { mDialogView = mInternetDialog.mDialogView; mSubTitle = mDialogView.requireViewById(R.id.internet_dialog_subtitle); + mEthernet = mDialogView.requireViewById(R.id.ethernet_layout); mMobileDataToggle = mDialogView.requireViewById(R.id.mobile_network_layout); mWifiToggle = mDialogView.requireViewById(R.id.turn_on_wifi_layout); mConnectedWifi = mDialogView.requireViewById(R.id.wifi_connected_layout); @@ -139,6 +141,46 @@ public class InternetDialogTest extends SysuiTestCase { } @Test + public void updateDialog_apmOffAndHasEthernet_showEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); + when(mInternetDialogController.hasEthernet()).thenReturn(true); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateDialog_apmOffAndNoEthernet_hideEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(false); + when(mInternetDialogController.hasEthernet()).thenReturn(false); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void updateDialog_apmOnAndHasEthernet_showEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDialogController.hasEthernet()).thenReturn(true); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void updateDialog_apmOnAndNoEthernet_hideEthernet() { + when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); + when(mInternetDialogController.hasEthernet()).thenReturn(false); + + mInternetDialog.updateDialog(); + + assertThat(mEthernet.getVisibility()).isEqualTo(View.GONE); + } + + @Test public void updateDialog_withApmOn_mobileDataLayoutGone() { when(mInternetDialogController.isAirplaneModeEnabled()).thenReturn(true); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 9d911e0a320b..b405be75bdf1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -166,13 +166,17 @@ class FingerprintAuthenticationClient extends AuthenticationClient<ISession> imp @Override protected void stopHalOperation() { UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); - try { - mCancellationSignal.cancel(); - } catch (RemoteException e) { - Slog.e(TAG, "Remote exception", e); - onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, - 0 /* vendorCode */); - mCallback.onClientFinished(this, false /* success */); + if (mCancellationSignal != null) { + try { + mCancellationSignal.cancel(); + } catch (RemoteException e) { + Slog.e(TAG, "Remote exception", e); + onError(BiometricFingerprintConstants.FINGERPRINT_ERROR_HW_UNAVAILABLE, + 0 /* vendorCode */); + mCallback.onClientFinished(this, false /* success */); + } + } else { + Slog.e(TAG, "cancellation signal was null"); } } |