From ebc0b9c32331acaaddaec45a1f099e13ee8b1620 Mon Sep 17 00:00:00 2001 From: Vania Januar Date: Mon, 3 Jul 2023 14:44:59 +0100 Subject: [PATCH 1/7] Do not show a summary in Tail button preferences if no app found Bug: 289054758 Test: StylusDevicesControllerTest Change-Id: I985194b2e64d36844a9b88f19394db2728ea70e4 --- .../stylus/StylusDevicesController.java | 2 +- .../stylus/StylusDevicesControllerTest.java | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java index ec9f4c6eb51..0a0e2081a8f 100644 --- a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java +++ b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java @@ -124,7 +124,7 @@ public class StylusDevicesController extends AbstractPreferenceController implem try { ApplicationInfo ai = pm.getApplicationInfo(packageName, PackageManager.ApplicationInfoFlags.of(0)); - appName = ai == null ? packageName : pm.getApplicationLabel(ai).toString(); + appName = ai == null ? "" : pm.getApplicationLabel(ai).toString(); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "Notes role package not found."); } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java index 1fcf396f31c..3c459de3792 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java @@ -272,6 +272,20 @@ public class StylusDevicesControllerTest { NOTES_APP_LABEL.toString())); } + @Test + public void defaultNotesPreference_noApplicationInfo_showsBlankSummary() + throws PackageManager.NameNotFoundException { + when(mPm.getApplicationInfo(eq(NOTES_PACKAGE_NAME), + any(PackageManager.ApplicationInfoFlags.class))).thenReturn(null); + + showScreen(mController); + + Preference defaultNotesPref = mPreferenceContainer.getPreference(0); + assertThat(defaultNotesPref.getTitle().toString()).isEqualTo( + mContext.getString(R.string.stylus_default_notes_app)); + assertThat(defaultNotesPref.getSummary().toString()).isEqualTo(""); + } + @Test public void defaultNotesPreference_roleHolderChanges_updatesPreference() { showScreen(mController); From 2539a6a10e65151dbcbb4a8e38a6a9d841ac287f Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Fri, 30 Jun 2023 12:08:51 +0000 Subject: [PATCH 2/7] Enable scrolling in screen flash color selector dialog Screen flash color selector dialog doesn't display correctly in landscappe mode when adjust to large display size from 'Accessibility > Display size and text > Display size'. Make the layout be scrollable to prevent strange clipped UI. Bug:287671988 Test: check the UI manually Change-Id: I37eb604d362fe4373d26f97a9397230babc6eafd --- res/layout/layout_color_selector.xml | 292 ++++++++++---------- res/layout/layout_color_selector_dialog.xml | 10 +- 2 files changed, 152 insertions(+), 150 deletions(-) diff --git a/res/layout/layout_color_selector.xml b/res/layout/layout_color_selector.xml index c366add00ec..a6b9cc89688 100644 --- a/res/layout/layout_color_selector.xml +++ b/res/layout/layout_color_selector.xml @@ -14,161 +14,167 @@ See the License for the specific language governing permissions and limitations under the License. --> - - + android:padding="20dp" + android:clipToPadding="false" + android:scrollbarStyle="outsideOverlay"> - - - - + + android:layout_marginBottom="10dp" + android:orientation="horizontal"> - + - + + + + + + + + + + + + + + android:layout_marginBottom="10dp" + android:orientation="horizontal"> - + - + + + + + + + + + + + + + + android:layout_marginBottom="10dp" + android:orientation="horizontal"> - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/res/layout/layout_color_selector_dialog.xml b/res/layout/layout_color_selector_dialog.xml index 70d4509f07e..e107689ae6a 100644 --- a/res/layout/layout_color_selector_dialog.xml +++ b/res/layout/layout_color_selector_dialog.xml @@ -17,16 +17,12 @@ + android:gravity="center_horizontal" + android:orientation="vertical"> + android:layout_height="wrap_content"/> \ No newline at end of file From c655c82ada4a2953d85f3e35d60264e772951266 Mon Sep 17 00:00:00 2001 From: Ken Lin Date: Wed, 5 Jul 2023 05:05:29 +0000 Subject: [PATCH 3/7] Settings crashed when changing the Screen Resolution Check if index is out of bound Bug: 288256336 Test: Change to Full resolution, set Smallest width to 426 dp, then switch to High resolution Test: atest ScreenResolutionFragmentTest Change-Id: Ida4128e76e097050b01deae91c9d669e58ab9e8f --- .../android/settings/display/ScreenResolutionFragment.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java index de7d25fefb9..daf1793f11f 100644 --- a/src/com/android/settings/display/ScreenResolutionFragment.java +++ b/src/com/android/settings/display/ScreenResolutionFragment.java @@ -369,6 +369,12 @@ public class ScreenResolutionFragment extends RadioButtonPickerFragment { private void restoreDensity() { final DisplayDensityUtils density = new DisplayDensityUtils(mContext); + /* If current density is the same as a default density of other resolutions, + * then mCurrentIndex may be out of boundary. + */ + if (density.getDefaultDisplayDensityValues().length <= mCurrentIndex) { + mCurrentIndex = density.getCurrentIndexForDefaultDisplay(); + } if (density.getDefaultDisplayDensityValues()[mCurrentIndex] != density.getDefaultDensityForDefaultDisplay()) { density.setForcedDisplayDensity(mCurrentIndex); From 1832da36187f5f7306227278429a6a8ccc2cd5a8 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 18 Jul 2023 14:41:23 -0700 Subject: [PATCH 4/7] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ic74eb981990ec4d4855818cf41b6ce2da99311dc --- res/values-ar/strings.xml | 2 +- res/values-ca/strings.xml | 2 +- res/values-en-rAU/strings.xml | 2 +- res/values-en-rGB/strings.xml | 2 +- res/values-en-rIN/strings.xml | 2 +- res/values-es/strings.xml | 8 ++++---- res/values-fr/strings.xml | 2 +- res/values-hi/strings.xml | 2 +- res/values-it/strings.xml | 4 ++-- res/values-ja/strings.xml | 18 +++++++++--------- res/values-kn/strings.xml | 2 +- res/values-te/strings.xml | 2 +- res/values-zh-rCN/strings.xml | 4 ++-- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index 080ea196822..245260008f5 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -2704,7 +2704,7 @@ "ستُحذف الآن التطبيقات والبيانات من جلسة الضيف هذه. بالإضافة إلى ذلك، ستُحذف جميع أنشطة الضيف المستقبلية في كل مرّة تخرج فيها من وضع الضيف." "حذف، ضيف، نشاط، إزالة، بيانات، زائر، محو بيانات" "السماح للمستخدِم الضيف باستخدام الهاتف" - "ستتم مشاركة سجلّ المكالمات مع المستخدِم الضيف." + "مشاركة سجلّ المكالمات مع المستخدِم الضيف" "تفعيل المكالمات الهاتفية والرسائل القصيرة" "منح هذا المستخدم امتيازات المشرف" "حذف حساب المستخدم" diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 295c398b07a..44e58e46b69 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -914,7 +914,7 @@ "6 GHz" "Velocitats màximes. Compatible amb pocs dispositius." "No està disponible al teu país o regió" - "Si la teva freqüència preferida no està disponible, pot ser que el punt d\'accés Wi‑Fi en faci servir una altra. La configuració de seguretat del punt d\'accés Wi‑Fi pot canviar si canvies la freqüència." + "Si la teva freqüència preferida no està disponible, pot ser que el punt d\'accés Wi‑Fi en faci servir una altra. La configuració de seguretat del punt d\'accés Wi‑Fi pot canviar si modifiques la freqüència." "No està disponible amb 6 GHz" "La configuració de seguretat pot canviar si modifiques la freqüència del punt d\'accés Wi‑Fi" "S\'està activant el punt d\'accés Wi-Fi…" diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index c47d0350122..063d5e58efc 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -898,7 +898,7 @@ "Extend compatibility" "Helps other devices find this hotspot. Reduces hotspot connection speed." "Helps other devices find this hotspot. Increases battery usage." - "Speed & compatibility" + "Speed and compatibility" "2.4 GHz / Compatible with most devices" "5 GHz / Compatible with many devices" "6 GHz / Compatible with few devices" diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index 86147f3a13f..a68a918faca 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -898,7 +898,7 @@ "Extend compatibility" "Helps other devices find this hotspot. Reduces hotspot connection speed." "Helps other devices find this hotspot. Increases battery usage." - "Speed & compatibility" + "Speed and compatibility" "2.4 GHz / Compatible with most devices" "5 GHz / Compatible with many devices" "6 GHz / Compatible with few devices" diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index bc76324b815..f5bbd967572 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -898,7 +898,7 @@ "Extend compatibility" "Helps other devices find this hotspot. Reduces hotspot connection speed." "Helps other devices find this hotspot. Increases battery usage." - "Speed & compatibility" + "Speed and compatibility" "2.4 GHz / Compatible with most devices" "5 GHz / Compatible with many devices" "6 GHz / Compatible with few devices" diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index c7570109b24..d752a4ffacd 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -899,10 +899,10 @@ "Ayuda a otros dispositivos a encontrar este punto de acceso. Reduce la velocidad de conexión del punto de acceso." "Ayuda a otros dispositivos a encontrar este punto de acceso. Aumenta el uso de la batería." "Velocidad y compatibilidad" - "2,4 GHz: compatible con la mayoría de los dispositivos" + "2,4 GHz / Compatible con la mayoría de dispositivos" "5 GHz: compatible con muchos dispositivos" - "6 GHz: compatible con pocos dispositivos" - "2,4 y 5 GHz: compatible con la mayoría de los dispositivos" + "6 GHz / Compatible con pocos dispositivos" + "2,4 y 5 GHz / Compatible con la mayoría de dispositivos" "Elige la frecuencia de tu punto de acceso. La frecuencia afecta a la velocidad de conexión y a los tipos de dispositivos que pueden encontrar tu punto de acceso." "Frecuencia preferida" "2,4 GHz" @@ -912,7 +912,7 @@ "2,4 y 5 GHz" "Velocidades rápidas. Este punto de acceso de doble banda es compatible con la mayoría de los dispositivos." "6 GHz" - "Velocidades más rápidas. Compatible con pocos dispositivos." + "Velocidades aún más rápidas. Compatible con pocos dispositivos." "No está disponible en tu país o zona" "Si tu frecuencia preferida no está disponible, tu punto de acceso puede usar una diferente. La configuración de seguridad del punto de acceso puede cambiar si modificas la frecuencia." "No disponible con 6 GHz" diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 5ad2e5e9917..88feadcda6e 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -1302,7 +1302,7 @@ "Point d\'accès activé, partage de connexion" "Point d\'accès activé" "Partage de connexion" - "Impossible de partager la connexion ou d\'utiliser des points d\'accès mobiles lorsque la sauvegarde des données est activée" + "Impossible de partager la connexion ou d\'utiliser des points d\'accès mobiles lorsque la fonction Économiseur de données est activée" "Point d\'accès uniquement" "USB uniquement" "Bluetooth uniquement" diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index bb04b17ab10..28aaec7fe7b 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -904,7 +904,7 @@ "6 GHz / यह सुविधा कुछ डिवाइसों के साथ काम करती है" "2.4 और 5 GHz / यह सुविधा ज़्यादातर डिवाइसों के साथ काम करती है" "अपने हॉटस्पॉट के लिए कोई फ़्रीक्वेंसी चुनें. कनेक्शन की स्पीड और आपके हॉटस्पॉट को किस तरह के डिवाइस ढूंढ सकते हैं, इन दोनों बातों पर फ़्रीक्वेंसी का असर पड़ता है." - "अपनी पसंद की फ़्रीक्वेंसी" + "अपनी पसंद की फ़्रीक्वेंसी चुनें" "2.4 गीगाहर्ट्ज़" "वाई-फ़ाई हॉटस्पॉट की धीमी स्पीड. यह सुविधा ज़्यादातर डिवाइसों के साथ काम करती है." "5 गीगाहर्ट्ज़" diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 0926e332bac..904805903d6 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -914,7 +914,7 @@ "6 GHz" "Velocità massime. Compatibile con pochi dispositivi." "Non disponibile nel tuo paese o nella tua regione" - "Se la tua frequenza preferita non è disponibile, l\'hotspot potrebbe utilizzarne una diversa. Le impostazioni di sicurezza dell\'hotspot potrebbero cambiare se si cambia la frequenza." + "Se la tua frequenza preferita non è disponibile, l\'hotspot potrebbe utilizzarne una diversa. Le impostazioni di sicurezza dell\'hotspot potrebbero cambiare se modifichi la frequenza." "Non disponibile con 6 GHz" "Le impostazioni di sicurezza potrebbero cambiare se modifichi la frequenza dell\'hotspot" "Attivazione hotspot…" @@ -4662,7 +4662,7 @@ "Configura il limite di velocità di download della rete" "Nessun limite" "Disattiva limitazioni per i processi secondari" - "Disattiva le limitazioni relative all\'utilizzo delle risorse di sistema per i processi secondari delle app" + "Disattiva le limitazioni relative all\'utilizzo delle risorse di sistema per i processi figlio delle app" "Forza attivazione del ruolo Note" "Attiva le integrazioni di sistema per la creazione di note tramite il ruolo Note. Se il ruolo Note è già attivo, non succederà nulla." "Trasmissione" diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index dc656a762a5..878e62b18e4 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -899,24 +899,24 @@ "他のデバイスにこのアクセス ポイントが公開されます。アクセス ポイント接続速度が低下します。" "他のデバイスにこのアクセス ポイントが公開されます。バッテリー使用量が増えます。" "速度と互換性" - "2.4 GHz / ほとんどのデバイスと互換性あり" - "5 GHz / 多くのデバイスと互換性あり" - "6 GHz / ごく一部のデバイスのみと互換性あり" - "2.4 / 5 GHz / ほとんどのデバイスと互換性あり" + "2.4 GHz / ほとんどのデバイスに対応" + "5 GHz / 対応デバイスは多数" + "6 GHz / 対応デバイスはまだ少数" + "2.4 / 5 GHz / ほとんどのデバイスに対応" "アクセス ポイントの周波数を選択してください。周波数は、接続速度と、アクセス ポイントを検出できるデバイスの種類に影響します。" "優先周波数" "2.4 GHz" - "速度が遅くなります。ほとんどのデバイスと互換性があります。" + "速度が遅くなります。ほとんどのデバイスに対応しています。" "5 GHz" - "高速です。多くのデバイスと互換性があります。" + "高速です。多数のデバイスに対応しています。" "2.4 / 5 GHz" - "高速です。このデュアルバンドのアクセス ポイントはほとんどのデバイスと互換性があります。" + "高速です。このデュアルバンドのアクセス ポイントはほとんどのデバイスに対応しています。" "6 GHz" - "速度が最も速くなります。ごく一部のデバイスのみと互換性があります。" + "速度が最も速くなります。対応デバイスはまだ少数です。" "お住まいの国や地域では利用できません" "優先周波数を利用できない場合、アクセス ポイントは別の周波数を使用する可能性があります。周波数を変更すると、アクセス ポイントのセキュリティ設定が変更される可能性があります。" "6 GHz には対応していません" - "アクセス ポイントの周波数を変更すると、アクセス セキュリティ設定が変更される可能性があります" + "アクセス ポイントの周波数を変更すると、セキュリティ設定が変更される可能性があります" "アクセスポイントをONにしています…" "アクセスポイントをOFFにしています…" "テザリングは利用できません" diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index 52e55563ddc..5f15f8c3396 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -123,7 +123,7 @@ "ಪಠ್ಯ ಫೀಲ್ಡ್‌ಗಳಲ್ಲಿ ಬರೆಯಿರಿ" "ಎಲ್ಲಾ ಸ್ಟೈಲಸ್ ಬಟನ್ ಒತ್ತುವಿಕೆಯನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ" "ಸ್ಟೈಲಸ್" - "ದಿನಾಂಕ & ಸಮಯ" + "ದಿನಾಂಕ ಮತ್ತು ಸಮಯ" "ಪ್ರಾಕ್ಸಿ" "ತೆರವುಗೊಳಿಸಿ" "ಪ್ರಾಕ್ಸಿ ಪೋರ್ಟ್" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 70464f524a3..312721a866d 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -3189,7 +3189,7 @@ "మొత్తం నోటిఫికేషన్ కంటెంట్‌ను చూపించండి" "గోప్యమైన కంటెంట్‌ను అన్‌లాక్‌లో మాత్రమే చూపండి" "ఎలాంటి నోటిఫికేషన్‌లను చూపవద్దు" - "మీ లాక్ స్క్రీన్ డిస్‌ప్లే ఎలా ఉండాలని అనుకుంటున్నారు?" + "మీ లాక్ స్క్రీన్ ఎలా డిస్‌ప్లే కావాలనుకుంటున్నారు?" "లాక్ స్క్రీన్" "మొత్తం వర్క్ నోటిఫికేషన్ కంటెంట్‌ను చూపు" "గోప్యమైన పని కంటెంట్‌ను దాచండి" diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 57731fb99a2..7c0e6c6438d 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -4536,7 +4536,7 @@ "使用深色主题" "使用蓝牙" "使用“阻止响铃”" - "使用“WLAN 热点”" + "使用 WLAN 热点" "使用“固定应用”" "使用“开发者选项”" "使用打印服务" @@ -4545,7 +4545,7 @@ "使用“无线调试”" "使用“图形驱动程序偏好设置”" "使用“护眼模式”" - "使用“NFC”" + "使用 NFC" "使用“自适应亮度”" "使用“WLAN 通话”" "查看所有应用" From fe667193d10543eabf65f5ba78e6fb0db82644dd Mon Sep 17 00:00:00 2001 From: mxyyiyi Date: Mon, 17 Jul 2023 13:38:35 +0800 Subject: [PATCH 5/7] Add support of RTL design for battery ussage chart. [Screenshots] English(LTR): https://screenshot.googleplex.com/8nHkVNHnGajP9Lh Hebrew (RTL): https://screenshot.googleplex.com/BrFSwEKq3xPmbnY Bug: 250682309 Fix: 250682309 Test: Manual Change-Id: I0b1b6a6e28af1d60c3d81a7b8bca58996fab313d --- .../batteryusage/BatteryChartView.java | 52 ++++++++++++++----- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java index 0fae92d575c..891e5e0b0ec 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java @@ -18,6 +18,7 @@ package com.android.settings.fuelgauge.batteryusage; import static com.android.settings.Utils.formatPercentage; import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS; +import static java.lang.Math.abs; import static java.lang.Math.round; import static java.util.Objects.requireNonNull; @@ -74,6 +75,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick private final Rect[] mPercentageBounds = new Rect[]{new Rect(), new Rect(), new Rect()}; private final List mAxisLabelsBounds = new ArrayList<>(); private final Set mLabelDrawnIndexes = new ArraySet<>(); + private final int mLayoutDirection = + getContext().getResources().getConfiguration().getLayoutDirection(); private BatteryChartViewModel mViewModel; private int mHoveredIndex = BatteryChartViewModel.SELECTED_INDEX_INVALID; @@ -159,7 +162,12 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick } // Updates the indent configurations. mIndent.top = mPercentageBounds[0].height(); - mIndent.right = mPercentageBounds[0].width() + mTextPadding; + final int textWidth = mPercentageBounds[0].width() + mTextPadding; + if (isRTL()) { + mIndent.left = textWidth; + } else { + mIndent.right = textWidth; + } if (mViewModel != null) { int maxTop = 0; @@ -334,7 +342,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick } private void drawHorizontalDividers(Canvas canvas) { - final int width = getWidth() - mIndent.right; + final int width = getWidth() - abs(mIndent.width()); final int height = getHeight() - mIndent.top - mIndent.bottom; final float topOffsetY = mIndent.top + mDividerWidth * .5f; final float bottomOffsetY = mIndent.top + (height - mDividerHeight - mDividerWidth * .5f); @@ -347,7 +355,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick // Draws 5 divider lines. for (int index = 0; index < HORIZONTAL_DIVIDER_COUNT; index++) { float offsetY = topOffsetY + dividerOffsetUnit * index; - canvas.drawLine(0, offsetY, width, offsetY, mDividerPaint); + canvas.drawLine(mIndent.left, offsetY, + mIndent.left + width, offsetY, mDividerPaint); // Draws percentage text only for 100% / 50% / 0% if (index % 2 == 0) { @@ -362,14 +371,14 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick mTextPaint.setColor(mDefaultTextColor); canvas.drawText( mPercentages[index], - getWidth(), + isRTL() ? mIndent.left - mTextPadding : getWidth(), offsetY + mPercentageBounds[index].height() * .5f, mTextPaint); } } private void drawVerticalDividers(Canvas canvas) { - final int width = getWidth() - mIndent.right; + final int width = getWidth() - abs(mIndent.width()); final int dividerCount = mTrapezoidSlots.length + 1; final float dividerSpace = dividerCount * mDividerWidth; final float unitWidth = (width - dividerSpace) / (float) mTrapezoidSlots.length; @@ -384,7 +393,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick case CENTER_OF_TRAPEZOIDS: axisLabelDisplayAreas = getAxisLabelDisplayAreas( /* size= */ mViewModel.size() - 1, - /* baselineX= */ mDividerWidth + unitWidth * .5f, + /* baselineX= */ mIndent.left + mDividerWidth + unitWidth * .5f, /* offsetX= */ mDividerWidth + unitWidth, baselineY, /* shiftFirstAndLast= */ false); @@ -393,7 +402,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick default: axisLabelDisplayAreas = getAxisLabelDisplayAreas( /* size= */ mViewModel.size(), - /* baselineX= */ mDividerWidth * .5f, + /* baselineX= */ mIndent.left + mDividerWidth * .5f, /* offsetX= */ mDividerWidth + unitWidth, baselineY, /* shiftFirstAndLast= */ true); @@ -402,7 +411,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick drawAxisLabels(canvas, axisLabelDisplayAreas, baselineY); } // Draws each vertical dividers. - float startX = mDividerWidth * .5f; + float startX = mDividerWidth * .5f + mIndent.left; for (int index = 0; index < dividerCount; index++) { float dividerY = bottomY; if (mViewModel.axisLabelPosition() == BETWEEN_TRAPEZOIDS @@ -416,8 +425,9 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick final float nextX = startX + mDividerWidth + unitWidth; // Updates the trapezoid slots for drawing. if (index < mTrapezoidSlots.length) { - mTrapezoidSlots[index].mLeft = round(startX + trapezoidSlotOffset); - mTrapezoidSlots[index].mRight = round(nextX - trapezoidSlotOffset); + final int trapezoidIndex = isRTL() ? mTrapezoidSlots.length - index - 1 : index; + mTrapezoidSlots[trapezoidIndex].mLeft = round(startX + trapezoidSlotOffset); + mTrapezoidSlots[trapezoidIndex].mRight = round(nextX - trapezoidSlotOffset); } startX = nextX; } @@ -509,10 +519,20 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick return displayAreas[leftIndex].right + mTextPadding * 2.3f > displayAreas[rightIndex].left; } + private boolean isRTL() { + return mLayoutDirection == View.LAYOUT_DIRECTION_RTL; + } + private void drawAxisLabelText( - Canvas canvas, final int index, final Rect displayArea, final float baselineY) { + Canvas canvas, int index, final Rect displayArea, final float baselineY) { mTextPaint.setColor(mTrapezoidSolidColor); mTextPaint.setTextAlign(Paint.Align.CENTER); + // Reverse the sort of axis labels for RTL + if (isRTL()) { + index = mViewModel.axisLabelPosition() == BETWEEN_TRAPEZOIDS + ? mViewModel.size() - index - 1 // for hourly + : mViewModel.size() - index - 2; // for daily + } canvas.drawText( mViewModel.getText(index), displayArea.centerX(), @@ -548,10 +568,16 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick mHoveredIndex); mTrapezoidPaint.setColor(isHoverState ? mTrapezoidHoverColor : trapezoidColor); - final float leftTop = round( + float leftTop = round( trapezoidBottom - requireNonNull(mViewModel.getLevel(index)) * unitHeight); - final float rightTop = round(trapezoidBottom + float rightTop = round(trapezoidBottom - requireNonNull(mViewModel.getLevel(index + 1)) * unitHeight); + // Mirror the shape of the trapezoid for RTL + if (isRTL()) { + float temp = leftTop; + leftTop = rightTop; + rightTop = temp; + } trapezoidPath.reset(); trapezoidPath.moveTo(mTrapezoidSlots[index].mLeft, trapezoidBottom); trapezoidPath.lineTo(mTrapezoidSlots[index].mLeft, leftTop); From e3d5e3883428d8a71a55e4222fb5f9198895a768 Mon Sep 17 00:00:00 2001 From: Wesley Wang Date: Fri, 14 Jul 2023 15:07:08 +0800 Subject: [PATCH 6/7] Provide a method to detect battery usage history(1/2) Bug: 290893324 Test: make SettingsRoboTests Change-Id: Ief4e11b2c3afddb99a50c9d0148d78d4d581d34f --- .../settings/fuelgauge/PowerUsageFeatureProvider.java | 5 +++++ .../settings/fuelgauge/PowerUsageFeatureProviderImpl.java | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java index 0b0e2430c90..c06e7f023d9 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProvider.java @@ -128,6 +128,11 @@ public interface PowerUsageFeatureProvider { */ boolean delayHourlyJobWhenBooting(); + /** + * Insert device usage data for anomaly detection + */ + void insertSettingsData(Context context); + /** * Gets an intent for one time bypass charge limited to resume charging. */ diff --git a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java index 1d0ba18b40f..89d793a9e92 100644 --- a/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java +++ b/src/com/android/settings/fuelgauge/PowerUsageFeatureProviderImpl.java @@ -160,6 +160,9 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider return true; } + @Override + public void insertSettingsData(Context context) {} + @Override public Set getOthersSystemComponentSet() { return new ArraySet<>(); From c32f5cf3dcf0658ca070efac96925bac75544d34 Mon Sep 17 00:00:00 2001 From: Weng Su Date: Wed, 19 Jul 2023 06:48:09 +0800 Subject: [PATCH 7/7] Show Instant Tether network icon - Show hotspot device type icons without signal strength (no Wi-Fi level) Bug: 268550769 Bug: 290805980 Test: manual test make RunSettingsRoboTests ROBOTEST_FILTER=WifiEntryPreferenceTest Change-Id: Iaab5f05f4d2db2d0603825d38c05a840c15484b5 --- .../settings/wifi/WifiEntryPreference.java | 44 ++++++++++++------- .../wifi/WifiEntryPreferenceTest.java | 29 ++++++++++++ 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/com/android/settings/wifi/WifiEntryPreference.java b/src/com/android/settings/wifi/WifiEntryPreference.java index 5b448870016..7206666b576 100644 --- a/src/com/android/settings/wifi/WifiEntryPreference.java +++ b/src/com/android/settings/wifi/WifiEntryPreference.java @@ -15,6 +15,8 @@ */ package com.android.settings.wifi; +import static com.android.settingslib.wifi.WifiUtils.getHotspotIconResource; + import android.annotation.Nullable; import android.content.Context; import android.content.res.Resources; @@ -37,6 +39,7 @@ import com.android.settingslib.RestrictedPreference; import com.android.settingslib.Utils; import com.android.settingslib.wifi.WifiUtils; import com.android.wifitrackerlib.BaseWifiTracker; +import com.android.wifitrackerlib.HotspotNetworkEntry; import com.android.wifitrackerlib.WifiEntry; /** @@ -145,13 +148,17 @@ public class WifiEntryPreference extends RestrictedPreference implements */ public void refresh() { setTitle(mWifiEntry.getTitle()); - final int level = mWifiEntry.getLevel(); - final boolean showX = mWifiEntry.shouldShowXLevelIcon(); - if (level != mLevel || showX != mShowX) { - mLevel = level; - mShowX = showX; - updateIcon(mShowX, mLevel); - notifyChanged(); + if (mWifiEntry instanceof HotspotNetworkEntry) { + updateHotspotIcon(((HotspotNetworkEntry) mWifiEntry).getDeviceType()); + } else { + int level = mWifiEntry.getLevel(); + boolean showX = mWifiEntry.shouldShowXLevelIcon(); + + if (level != mLevel || showX != mShowX) { + mLevel = level; + mShowX = showX; + updateIcon(mShowX, mLevel); + } } setSummary(mWifiEntry.getSummary(false /* concise */)); @@ -201,14 +208,7 @@ public class WifiEntryPreference extends RestrictedPreference implements return accent ? android.R.attr.colorAccent : android.R.attr.colorControlNormal; } - @VisibleForTesting - void updateIcon(boolean showX, int level) { - if (level == -1) { - setIcon(null); - return; - } - - final Drawable drawable = mIconInjector.getIcon(showX, level); + private void setIconWithTint(Drawable drawable) { if (drawable != null) { // Must use Drawable#setTintList() instead of Drawable#setTint() to show the grey // icon when the preference is disabled. @@ -219,6 +219,20 @@ public class WifiEntryPreference extends RestrictedPreference implements } } + @VisibleForTesting + void updateIcon(boolean showX, int level) { + if (level == -1) { + setIcon(null); + return; + } + setIconWithTint(mIconInjector.getIcon(showX, level)); + } + + @VisibleForTesting + void updateHotspotIcon(int deviceType) { + setIconWithTint(getContext().getDrawable(getHotspotIconResource(deviceType))); + } + @Nullable private StateListDrawable getFrictionStateListDrawable() { TypedArray frictionSld; diff --git a/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java index a60b5313730..316beb37f70 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiEntryPreferenceTest.java @@ -18,11 +18,15 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.graphics.drawable.Drawable; +import android.net.wifi.sharedconnectivity.app.NetworkProviderInfo; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; @@ -31,6 +35,7 @@ import androidx.preference.PreferenceViewHolder; import com.android.settingslib.R; import com.android.settingslib.wifi.WifiUtils; +import com.android.wifitrackerlib.HotspotNetworkEntry; import com.android.wifitrackerlib.WifiEntry; import org.junit.Before; @@ -52,6 +57,8 @@ public class WifiEntryPreferenceTest { @Mock private WifiEntry mMockWifiEntry; @Mock + private HotspotNetworkEntry mHotspotNetworkEntry; + @Mock private WifiUtils.InternetIconInjector mMockIconInjector; @Mock @@ -256,4 +263,26 @@ public class WifiEntryPreferenceTest { public void getSecondTargetResId_shouldNotReturnZero() { assertThat(mPref.getSecondTargetResId()).isNotEqualTo(0); } + + @Test + public void refresh_itsHotspotNetworkEntry_shouldUpdateHotspotIcon() { + int deviceType = NetworkProviderInfo.DEVICE_TYPE_PHONE; + when(mHotspotNetworkEntry.getDeviceType()).thenReturn(deviceType); + WifiEntryPreference pref = spy( + new WifiEntryPreference(mContext, mHotspotNetworkEntry, mMockIconInjector)); + + pref.refresh(); + + verify(pref).updateHotspotIcon(deviceType); + } + + @Test + public void refresh_notHotspotNetworkEntry_shouldNotUpdateHotspotIcon() { + WifiEntryPreference pref = spy( + new WifiEntryPreference(mContext, mMockWifiEntry, mMockIconInjector)); + + pref.refresh(); + + verify(pref, never()).updateHotspotIcon(anyInt()); + } }