Snap for 7277590 from 7f0888a6a0 to sc-v2-release
Change-Id: I6ba726869403805bf01a5c3d9b400cf0a394f9bd
This commit is contained in:
@@ -2631,7 +2631,7 @@
|
|||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
|
||||||
android:value="com.android.settings.notification.NotificationAssistantPicker" />
|
android:value="com.android.settings.notification.ConfigureNotificationSettings" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
|
|||||||
@@ -2285,6 +2285,102 @@
|
|||||||
column="23"/>
|
column="23"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="0" android:color="#33263238"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/ic_files_go_round.xml"
|
||||||
|
line="46"
|
||||||
|
column="34"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="1" android:color="#00263238"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/ic_files_go_round.xml"
|
||||||
|
line="47"
|
||||||
|
column="34"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="0" android:color="#281A237E"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/ic_files_go_round.xml"
|
||||||
|
line="71"
|
||||||
|
column="34"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="1" android:color="#051A237E"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/ic_files_go_round.xml"
|
||||||
|
line="72"
|
||||||
|
column="34"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="0.0029046" android:color="#19FFFFFF"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/ic_files_go_round.xml"
|
||||||
|
line="116"
|
||||||
|
column="42"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="1" android:color="#00FFFFFF"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/ic_files_go_round.xml"
|
||||||
|
line="117"
|
||||||
|
column="34"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
id="HardCodedColor"
|
id="HardCodedColor"
|
||||||
severity="Error"
|
severity="Error"
|
||||||
@@ -2669,54 +2765,6 @@
|
|||||||
column="13"/>
|
column="13"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" android:fillColor="@color/homepage_generic_icon_background" />"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_network_signal_blue.xml"
|
|
||||||
line="23"
|
|
||||||
column="11"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" android:fillColor="@color/homepage_generic_icon_background" />"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_network_signal_blue.xml"
|
|
||||||
line="25"
|
|
||||||
column="11"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" android:fillColor="@color/homepage_generic_icon_background" />"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_network_signal_blue.xml"
|
|
||||||
line="27"
|
|
||||||
column="11"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
id="HardCodedColor"
|
id="HardCodedColor"
|
||||||
severity="Error"
|
severity="Error"
|
||||||
@@ -2997,12 +3045,28 @@
|
|||||||
priority="4"
|
priority="4"
|
||||||
summary="Using hardcoded color"
|
summary="Using hardcoded color"
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
errorLine1=" <path"
|
errorLine1=" <path android:fillColor="@color/homepage_generic_icon_background""
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/ic_network_signal_blue.xml"
|
||||||
|
line="23"
|
||||||
|
column="11"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <path android:fillColor="@color/homepage_generic_icon_background""
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
<location
|
<location
|
||||||
file="res/drawable/ic_network_signal_blue.xml"
|
file="res/drawable/ic_network_signal_blue.xml"
|
||||||
line="25"
|
line="25"
|
||||||
column="9"/>
|
column="11"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
@@ -3013,28 +3077,12 @@
|
|||||||
priority="4"
|
priority="4"
|
||||||
summary="Using hardcoded color"
|
summary="Using hardcoded color"
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
errorLine1="C6.67,19.26,7.26,18.67,8,18.67z" />"
|
errorLine1=" <path android:fillColor="@color/homepage_generic_icon_background""
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
<location
|
<location
|
||||||
file="res/drawable/ic_network_signal_blue.xml"
|
file="res/drawable/ic_network_signal_blue.xml"
|
||||||
line="32"
|
line="27"
|
||||||
column="9"/>
|
column="11"/>
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" android:pathData="M16,12h1.33c0.74,0,1.33,0.6,1.33,1.33v12c0,0.74-0.6,1.33-1.33,1.33H16c-0.74,0-1.33-0.6-1.33-1.33v-12"
|
|
||||||
errorLine2="^">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_network_signal_blue.xml"
|
|
||||||
line="35"
|
|
||||||
column="1"/>
|
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
@@ -3069,22 +3117,6 @@
|
|||||||
column="17"/>
|
column="17"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" android:color="@color/notification_silence_color" />"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_notification_silence.xml"
|
|
||||||
line="22"
|
|
||||||
column="17"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
id="HardCodedColor"
|
id="HardCodedColor"
|
||||||
severity="Error"
|
severity="Error"
|
||||||
@@ -3357,6 +3389,54 @@
|
|||||||
column="15"/>
|
column="15"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="0" android:color="#FF4285F4"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/one_handed_guideline.xml"
|
||||||
|
line="34"
|
||||||
|
column="36"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <item android:offset="1" android:color="#004385F5"/>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/drawable/one_handed_guideline.xml"
|
||||||
|
line="35"
|
||||||
|
column="36"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" android:background="@color/homepage_emergency_background">"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/layout/preference_battery_error.xml"
|
||||||
|
line="35"
|
||||||
|
column="13"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
id="HardCodedColor"
|
id="HardCodedColor"
|
||||||
severity="Error"
|
severity="Error"
|
||||||
@@ -3565,6 +3645,22 @@
|
|||||||
column="9"/>
|
column="9"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
|
<issue
|
||||||
|
id="HardCodedColor"
|
||||||
|
severity="Error"
|
||||||
|
message="Avoid using hardcoded color"
|
||||||
|
category="Correctness"
|
||||||
|
priority="4"
|
||||||
|
summary="Using hardcoded color"
|
||||||
|
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
||||||
|
errorLine1=" <string name="sync_plug" msgid="7956982719077985381">""<font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments, and more from wherever you are."</string>"
|
||||||
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||||
|
<location
|
||||||
|
file="res/values-en-rXC/strings.xml"
|
||||||
|
line="2930"
|
||||||
|
column="170"/>
|
||||||
|
</issue>
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
id="HardCodedColor"
|
id="HardCodedColor"
|
||||||
severity="Error"
|
severity="Error"
|
||||||
@@ -3577,7 +3673,7 @@
|
|||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||||
<location
|
<location
|
||||||
file="res/values-en-rAU/strings.xml"
|
file="res/values-en-rAU/strings.xml"
|
||||||
line="2821"
|
line="2940"
|
||||||
column="64"/>
|
column="64"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3593,7 +3689,7 @@
|
|||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||||
<location
|
<location
|
||||||
file="res/values-en-rCA/strings.xml"
|
file="res/values-en-rCA/strings.xml"
|
||||||
line="2821"
|
line="2940"
|
||||||
column="64"/>
|
column="64"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3609,7 +3705,7 @@
|
|||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||||
<location
|
<location
|
||||||
file="res/values-en-rGB/strings.xml"
|
file="res/values-en-rGB/strings.xml"
|
||||||
line="2821"
|
line="2940"
|
||||||
column="64"/>
|
column="64"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3625,26 +3721,10 @@
|
|||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||||
<location
|
<location
|
||||||
file="res/values-en-rIN/strings.xml"
|
file="res/values-en-rIN/strings.xml"
|
||||||
line="2821"
|
line="2940"
|
||||||
column="64"/>
|
column="64"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <string name="sync_plug" msgid="7956982719077985381">""<font fgcolor="#ffffffff">"Welcome to Google sync!"</font>" \nA Google approach to syncing data to allow access to your contacts, appointments, and more from wherever you are."</string>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/values-en-rXC/strings.xml"
|
|
||||||
line="2821"
|
|
||||||
column="170"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
<issue
|
||||||
id="HardCodedColor"
|
id="HardCodedColor"
|
||||||
severity="Error"
|
severity="Error"
|
||||||
@@ -3657,7 +3737,7 @@
|
|||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
|
||||||
<location
|
<location
|
||||||
file="res/values/strings.xml"
|
file="res/values/strings.xml"
|
||||||
line="6543"
|
line="6823"
|
||||||
column="36"/>
|
column="36"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3689,7 +3769,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/styles.xml"
|
file="res/values/styles.xml"
|
||||||
line="435"
|
line="439"
|
||||||
column="44"/>
|
column="44"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3705,7 +3785,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/styles.xml"
|
file="res/values/styles.xml"
|
||||||
line="441"
|
line="445"
|
||||||
column="44"/>
|
column="44"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3721,7 +3801,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/styles.xml"
|
file="res/values/styles.xml"
|
||||||
line="442"
|
line="446"
|
||||||
column="44"/>
|
column="44"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3737,7 +3817,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/styles.xml"
|
file="res/values/styles.xml"
|
||||||
line="478"
|
line="482"
|
||||||
column="34"/>
|
column="34"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3753,7 +3833,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/themes.xml"
|
file="res/values/themes.xml"
|
||||||
line="106"
|
line="103"
|
||||||
column="40"/>
|
column="40"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3769,7 +3849,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/themes.xml"
|
file="res/values/themes.xml"
|
||||||
line="106"
|
line="103"
|
||||||
column="40"/>
|
column="40"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3785,7 +3865,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/themes.xml"
|
file="res/values/themes.xml"
|
||||||
line="191"
|
line="188"
|
||||||
column="45"/>
|
column="45"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3801,7 +3881,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/themes.xml"
|
file="res/values/themes.xml"
|
||||||
line="192"
|
line="189"
|
||||||
column="49"/>
|
column="49"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3817,7 +3897,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/themes.xml"
|
file="res/values/themes.xml"
|
||||||
line="200"
|
line="197"
|
||||||
column="45"/>
|
column="45"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3833,7 +3913,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/themes.xml"
|
file="res/values/themes.xml"
|
||||||
line="201"
|
line="198"
|
||||||
column="49"/>
|
column="49"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -3849,7 +3929,7 @@
|
|||||||
errorLine2=" ^">
|
errorLine2=" ^">
|
||||||
<location
|
<location
|
||||||
file="res/values/themes.xml"
|
file="res/values/themes.xml"
|
||||||
line="272"
|
line="268"
|
||||||
column="42"/>
|
column="42"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
@@ -4013,132 +4093,4 @@
|
|||||||
column="5"/>
|
column="5"/>
|
||||||
</issue>
|
</issue>
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="0" android:color="#FF4285F4"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/one_handed_guideline.xml"
|
|
||||||
line="34"
|
|
||||||
column="36"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="1" android:color="#004385F5"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/one_handed_guideline.xml"
|
|
||||||
line="35"
|
|
||||||
column="36"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="0" android:color="#33263238"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_files_go_round.xml"
|
|
||||||
line="46"
|
|
||||||
column="34"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="1" android:color="#00263238"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_files_go_round.xml"
|
|
||||||
line="47"
|
|
||||||
column="34"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="0" android:color="#281A237E"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_files_go_round.xml"
|
|
||||||
line="71"
|
|
||||||
column="34"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="1" android:color="#051A237E"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_files_go_round.xml"
|
|
||||||
line="72"
|
|
||||||
column="34"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="0.0029046" android:color="#19FFFFFF"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_files_go_round.xml"
|
|
||||||
line="116"
|
|
||||||
column="42"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
<issue
|
|
||||||
id="HardCodedColor"
|
|
||||||
severity="Error"
|
|
||||||
message="Avoid using hardcoded color"
|
|
||||||
category="Correctness"
|
|
||||||
priority="4"
|
|
||||||
summary="Using hardcoded color"
|
|
||||||
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
|
|
||||||
errorLine1=" <item android:offset="1" android:color="#00FFFFFF"/>"
|
|
||||||
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
|
|
||||||
<location
|
|
||||||
file="res/drawable/ic_files_go_round.xml"
|
|
||||||
line="117"
|
|
||||||
column="34"/>
|
|
||||||
</issue>
|
|
||||||
|
|
||||||
</issues>
|
</issues>
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
@@ -51,20 +52,20 @@
|
|||||||
android:maxHeight="24dp"/>
|
android:maxHeight="24dp"/>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
<RelativeLayout
|
<androidx.constraintlayout.widget.ConstraintLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content">
|
||||||
android:gravity="center_vertical" >
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@android:id/title"
|
android:id="@android:id/title"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
|
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"
|
||||||
android:textAlignment="viewStart"
|
android:textAlignment="viewStart"
|
||||||
android:ellipsize="marquee"
|
android:ellipsize="marquee"
|
||||||
android:fadingEdge="horizontal" />
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@android:id/summary"/>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@android:id/summary"
|
android:id="@android:id/summary"
|
||||||
@@ -74,7 +75,8 @@
|
|||||||
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
|
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Body1"
|
||||||
android:textColor="?android:attr/textColorSecondary"
|
android:textColor="?android:attr/textColorSecondary"
|
||||||
android:maxLines="10"
|
android:maxLines="10"
|
||||||
android:layout_alignParentEnd="true"/>
|
app:layout_constraintBaseline_toBaselineOf="@android:id/title"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"/>
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
android:id="@android:id/progress"
|
android:id="@android:id/progress"
|
||||||
@@ -84,8 +86,8 @@
|
|||||||
android:layout_marginBottom="4dp"
|
android:layout_marginBottom="4dp"
|
||||||
android:max="100"
|
android:max="100"
|
||||||
android:layout_below="@android:id/title"
|
android:layout_below="@android:id/title"
|
||||||
android:layout_alignStart="@android:id/title"
|
app:layout_constraintTop_toBottomOf="@android:id/title"
|
||||||
style="?android:attr/progressBarStyleHorizontal" />
|
style="?android:attr/progressBarStyleHorizontal" />
|
||||||
</RelativeLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|||||||
@@ -7221,7 +7221,7 @@
|
|||||||
<string name="vpn_require_connection_title">Require VPN connection?</string>
|
<string name="vpn_require_connection_title">Require VPN connection?</string>
|
||||||
|
|
||||||
<!-- Dialog subtitle warning for a VPN app that has an insecure type. [CHAR LIMIT=100] -->
|
<!-- Dialog subtitle warning for a VPN app that has an insecure type. [CHAR LIMIT=100] -->
|
||||||
<string name="vpn_insecure_dialog_subtitle">This VPN is not secure. Update to an IKEv2 VPN</string>
|
<string name="vpn_insecure_dialog_subtitle">Not secure. Update to an IKEv2 VPN</string>
|
||||||
|
|
||||||
<!-- Summary describing the always-on VPN feature. [CHAR LIMIT=NONE] -->
|
<!-- Summary describing the always-on VPN feature. [CHAR LIMIT=NONE] -->
|
||||||
<string name="vpn_lockdown_summary">Select a VPN profile to always remain connected to. Network traffic will only be allowed when connected to this VPN.</string>
|
<string name="vpn_lockdown_summary">Select a VPN profile to always remain connected to. Network traffic will only be allowed when connected to this VPN.</string>
|
||||||
@@ -9032,8 +9032,10 @@
|
|||||||
<item quantity="other">%d apps can read notifications</item>
|
<item quantity="other">%d apps can read notifications</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
|
|
||||||
<!-- Title for Notification Assistant Picker screen [CHAR LIMIT=30]-->
|
<!-- Title for Notification Assistant setting [CHAR LIMIT=30]-->
|
||||||
<string name="notification_assistant_title">Adaptive Notifications</string>
|
<string name="notification_assistant_title">Enhanced notifications</string>
|
||||||
|
<!-- Summary of Notification Assistant provided features [CHAR LIMIT=NONE]-->
|
||||||
|
<string name="notification_assistant_summary">Get suggested actions, replies, and more</string>
|
||||||
|
|
||||||
<!-- Label for no NotificationAssistantService [CHAR_LIMIT=NONE] -->
|
<!-- Label for no NotificationAssistantService [CHAR_LIMIT=NONE] -->
|
||||||
<string name="no_notification_assistant">None</string>
|
<string name="no_notification_assistant">None</string>
|
||||||
@@ -9051,10 +9053,11 @@
|
|||||||
<!-- Summary for a warning message about security implications of enabling a notification
|
<!-- Summary for a warning message about security implications of enabling a notification
|
||||||
listener, displayed as a dialog message. [CHAR LIMIT=NONE] -->
|
listener, displayed as a dialog message. [CHAR LIMIT=NONE] -->
|
||||||
<string name="notification_assistant_security_warning_summary">
|
<string name="notification_assistant_security_warning_summary">
|
||||||
<xliff:g id="notification_assistant_name" example="Notification Assistant">%1$s</xliff:g> will be able to read all notifications,
|
Enhanced notifications can read all notification content,
|
||||||
including personal information such as contact names and the text of messages you receive.
|
including personal information like contact names and messages.
|
||||||
This app will also be able to dismiss notifications or take action on buttons in notifications, including answering phone calls.
|
This feature can also dismiss notifications or take actions on buttons in notifications,
|
||||||
\n\nThis will also give the app the ability to turn Do Not Disturb on or off and change related settings.
|
such as answering phone calls.
|
||||||
|
\n\nThis feature can also turn Priority mode on or off and change related settings.
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Title for a warning message about security implications of enabling a notification
|
<!-- Title for a warning message about security implications of enabling a notification
|
||||||
@@ -9769,6 +9772,11 @@
|
|||||||
<string name="switch_on_text">On</string>
|
<string name="switch_on_text">On</string>
|
||||||
<string name="switch_off_text">Off</string>
|
<string name="switch_off_text">Off</string>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- The subtext when screen pinning feature is enabled. [CHAR LIMIT=28] -->
|
||||||
|
<string name="screen_pinning_switch_on_text">On</string>
|
||||||
|
<!-- The subtext when screen pinning feature is disabled. [CHAR LIMIT=28] -->
|
||||||
|
<string name="screen_pinning_switch_off_text">Off</string>
|
||||||
<!-- [CHAR LIMIT=28] Screen pinning title -->
|
<!-- [CHAR LIMIT=28] Screen pinning title -->
|
||||||
<string name="screen_pinning_title">App pinning</string>
|
<string name="screen_pinning_title">App pinning</string>
|
||||||
<!-- [CHAR LIMIT=none] Screen pinning introduction -->
|
<!-- [CHAR LIMIT=none] Screen pinning introduction -->
|
||||||
|
|||||||
@@ -115,6 +115,11 @@
|
|||||||
android:title="@string/snooze_options_title"
|
android:title="@string/snooze_options_title"
|
||||||
settings:controller="com.android.settings.notification.SnoozeNotificationPreferenceController" />
|
settings:controller="com.android.settings.notification.SnoozeNotificationPreferenceController" />
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="notification_assistant"
|
||||||
|
android:title="@string/notification_assistant_title"
|
||||||
|
android:summary="@string/notification_assistant_summary"/>
|
||||||
|
|
||||||
<!-- Notification badging -->
|
<!-- Notification badging -->
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="notification_badging"
|
android:key="notification_badging"
|
||||||
|
|||||||
@@ -155,5 +155,11 @@
|
|||||||
android:order="22"
|
android:order="22"
|
||||||
android:title="@string/notification_pulse_title"
|
android:title="@string/notification_pulse_title"
|
||||||
settings:controller="com.android.settings.notification.PulseNotificationPreferenceController"/>
|
settings:controller="com.android.settings.notification.PulseNotificationPreferenceController"/>
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:key="notification_assistant"
|
||||||
|
android:order="23"
|
||||||
|
android:title="@string/notification_assistant_title"
|
||||||
|
android:summary="@string/notification_assistant_summary"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|||||||
@@ -80,13 +80,6 @@
|
|||||||
android:value="com.android.settings.Settings$WriteSettingsActivity" />
|
android:value="com.android.settings.Settings$WriteSettingsActivity" />
|
||||||
</Preference>
|
</Preference>
|
||||||
|
|
||||||
<com.android.settingslib.widget.AppPreference
|
|
||||||
android:key="notification_assistant"
|
|
||||||
android:title="@string/notification_assistant_title"
|
|
||||||
android:summary="@string/summary_placeholder"
|
|
||||||
settings:fragment="com.android.settings.notification.NotificationAssistantPicker"
|
|
||||||
settings:controller="com.android.settings.notification.NotificationAssistantPreferenceController"/>
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="notification_access"
|
android:key="notification_access"
|
||||||
android:title="@string/manage_notification_access_title"
|
android:title="@string/manage_notification_access_title"
|
||||||
|
|||||||
@@ -648,12 +648,8 @@ public class MobileNetworkUtils {
|
|||||||
return getOperatorNameFromTelephonyManager(context);
|
return getOperatorNameFromTelephonyManager(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static SubscriptionInfo getSubscriptionInfo(SubscriptionManager subManager,
|
private static SubscriptionInfo getSubscriptionInfo(SubscriptionManager subManager, int subId) {
|
||||||
int subId) {
|
List<SubscriptionInfo> subInfos = subManager.getActiveSubscriptionInfoList();
|
||||||
List<SubscriptionInfo> subInfos = subManager.getAccessibleSubscriptionInfoList();
|
|
||||||
if (subInfos == null) {
|
|
||||||
subInfos = subManager.getActiveSubscriptionInfoList();
|
|
||||||
}
|
|
||||||
if (subInfos == null) {
|
if (subInfos == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import android.app.Activity;
|
|||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.app.settings.SettingsEnums;
|
import android.app.settings.SettingsEnums;
|
||||||
import android.app.usage.IUsageStatsManager;
|
import android.app.usage.IUsageStatsManager;
|
||||||
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -62,6 +63,7 @@ public class ConfigureNotificationSettings extends DashboardFragment implements
|
|||||||
private static final int REQUEST_CODE = 200;
|
private static final int REQUEST_CODE = 200;
|
||||||
private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
|
private static final String SELECTED_PREFERENCE_KEY = "selected_preference";
|
||||||
private static final String KEY_ADVANCED_CATEGORY = "configure_notifications_advanced";
|
private static final String KEY_ADVANCED_CATEGORY = "configure_notifications_advanced";
|
||||||
|
private static final String KEY_NAS = "notification_assistant";
|
||||||
|
|
||||||
private RingtonePreference mRequestPreference;
|
private RingtonePreference mRequestPreference;
|
||||||
|
|
||||||
@@ -116,6 +118,8 @@ public class ConfigureNotificationSettings extends DashboardFragment implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
controllers.add(new NotificationAssistantPreferenceController(context,
|
||||||
|
new NotificationBackend(), host, KEY_NAS));
|
||||||
|
|
||||||
if (FeatureFlagUtils.isEnabled(context, FeatureFlags.SILKY_HOME)) {
|
if (FeatureFlagUtils.isEnabled(context, FeatureFlags.SILKY_HOME)) {
|
||||||
controllers.add(new EmergencyBroadcastPreferenceController(context,
|
controllers.add(new EmergencyBroadcastPreferenceController(context,
|
||||||
@@ -199,4 +203,14 @@ public class ConfigureNotificationSettings extends DashboardFragment implements
|
|||||||
return keys;
|
return keys;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Dialogs only have access to the parent fragment, not the controller, so pass the information
|
||||||
|
// along to keep business logic out of this file
|
||||||
|
protected void enableNAS(ComponentName cn) {
|
||||||
|
final PreferenceScreen screen = getPreferenceScreen();
|
||||||
|
NotificationAssistantPreferenceController napc =
|
||||||
|
use(NotificationAssistantPreferenceController.class);
|
||||||
|
napc.setNotificationAssistantGranted(cn);
|
||||||
|
napc.updateState(screen.findPreference(napc.getPreferenceKey()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.notification;
|
||||||
|
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.app.settings.SettingsEnums;
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import com.android.settings.R;
|
||||||
|
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
|
||||||
|
|
||||||
|
public class NotificationAssistantDialogFragment extends InstrumentedDialogFragment
|
||||||
|
implements DialogInterface.OnClickListener {
|
||||||
|
static final String KEY_COMPONENT = "c";
|
||||||
|
|
||||||
|
public static NotificationAssistantDialogFragment newInstance(Fragment target,
|
||||||
|
ComponentName cn) {
|
||||||
|
final NotificationAssistantDialogFragment dialogFragment =
|
||||||
|
new NotificationAssistantDialogFragment();
|
||||||
|
final Bundle args = new Bundle();
|
||||||
|
args.putString(KEY_COMPONENT, cn.flattenToString());
|
||||||
|
dialogFragment.setArguments(args);
|
||||||
|
dialogFragment.setTargetFragment(target, 0);
|
||||||
|
|
||||||
|
return dialogFragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
final String summary = getResources()
|
||||||
|
.getString(R.string.notification_assistant_security_warning_summary);
|
||||||
|
return new AlertDialog.Builder(getContext())
|
||||||
|
.setMessage(summary)
|
||||||
|
.setCancelable(true)
|
||||||
|
.setPositiveButton(R.string.okay, this)
|
||||||
|
.create();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMetricsCategory() {
|
||||||
|
return SettingsEnums.DEFAULT_NOTIFICATION_ASSISTANT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
final Bundle args = getArguments();
|
||||||
|
final ComponentName cn = ComponentName.unflattenFromString(args
|
||||||
|
.getString(KEY_COMPONENT));
|
||||||
|
ConfigureNotificationSettings parent = (ConfigureNotificationSettings) getTargetFragment();
|
||||||
|
parent.enableNAS(cn);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,44 +18,72 @@ package com.android.settings.notification;
|
|||||||
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
|
import android.provider.Settings;
|
||||||
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
import androidx.fragment.app.Fragment;
|
||||||
import com.android.settingslib.applications.DefaultAppInfo;
|
|
||||||
import com.android.settingslib.widget.CandidateInfo;
|
import com.android.settings.core.TogglePreferenceController;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
|
|
||||||
public class NotificationAssistantPreferenceController extends BasePreferenceController {
|
public class NotificationAssistantPreferenceController extends TogglePreferenceController {
|
||||||
|
private static final String TAG = "NASPreferenceController";
|
||||||
|
private static final int AVAILABLE = 1;
|
||||||
|
private Fragment mFragment;
|
||||||
|
private int mUserId = UserHandle.myUserId();
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
protected NotificationBackend mNotificationBackend;
|
protected NotificationBackend mNotificationBackend;
|
||||||
private PackageManager mPackageManager;
|
|
||||||
|
|
||||||
public NotificationAssistantPreferenceController(Context context, String preferenceKey) {
|
public NotificationAssistantPreferenceController(Context context, NotificationBackend backend,
|
||||||
|
Fragment fragment, String preferenceKey) {
|
||||||
super(context, preferenceKey);
|
super(context, preferenceKey);
|
||||||
mNotificationBackend = new NotificationBackend();
|
mNotificationBackend = backend;
|
||||||
mPackageManager = mContext.getPackageManager();
|
mFragment = fragment;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAvailabilityStatus() {
|
public int getAvailabilityStatus() {
|
||||||
return BasePreferenceController.AVAILABLE;
|
return AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CharSequence getSummary() {
|
public boolean isChecked() {
|
||||||
CandidateInfo appSelected = new NotificationAssistantPicker.CandidateNone(mContext);
|
ComponentName acn = mNotificationBackend.getAllowedNotificationAssistant();
|
||||||
ComponentName assistant = mNotificationBackend.getAllowedNotificationAssistant();
|
ComponentName dcn = mNotificationBackend.getDefaultNotificationAssistant();
|
||||||
if (assistant != null) {
|
return (acn != null && acn.equals(dcn));
|
||||||
appSelected = createCandidateInfo(assistant);
|
|
||||||
}
|
|
||||||
return appSelected.loadLabel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@Override
|
||||||
protected CandidateInfo createCandidateInfo(ComponentName cn) {
|
public boolean setChecked(boolean isChecked) {
|
||||||
return new DefaultAppInfo(mContext, mPackageManager, UserHandle.myUserId(), cn);
|
ComponentName cn = isChecked
|
||||||
|
? mNotificationBackend.getDefaultNotificationAssistant() : null;
|
||||||
|
if (isChecked) {
|
||||||
|
if (mFragment == null) {
|
||||||
|
throw new IllegalStateException("No fragment to start activity");
|
||||||
|
}
|
||||||
|
showDialog(cn);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
setNotificationAssistantGranted(null);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
protected void setNotificationAssistantGranted(ComponentName cn) {
|
||||||
|
if (Settings.Secure.getIntForUser(mContext.getContentResolver(),
|
||||||
|
Settings.Secure.NAS_SETTINGS_UPDATED, 0, mUserId) == 0) {
|
||||||
|
Settings.Secure.putIntForUser(mContext.getContentResolver(),
|
||||||
|
Settings.Secure.NAS_SETTINGS_UPDATED, 1, mUserId);
|
||||||
|
mNotificationBackend.resetDefaultNotificationAssistant(cn != null);
|
||||||
|
}
|
||||||
|
mNotificationBackend.setNotificationAssistantGranted(cn);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void showDialog(ComponentName cn) {
|
||||||
|
NotificationAssistantDialogFragment dialogFragment =
|
||||||
|
NotificationAssistantDialogFragment.newInstance(mFragment, cn);
|
||||||
|
dialogFragment.show(mFragment.getFragmentManager(), TAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -19,7 +19,6 @@ import static android.app.NotificationManager.IMPORTANCE_NONE;
|
|||||||
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
|
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
|
||||||
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_CACHED;
|
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_CACHED;
|
||||||
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC;
|
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC;
|
||||||
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED;
|
|
||||||
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED_BY_ANY_LAUNCHER;
|
import static android.content.pm.LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED_BY_ANY_LAUNCHER;
|
||||||
|
|
||||||
import android.app.INotificationManager;
|
import android.app.INotificationManager;
|
||||||
@@ -50,7 +49,6 @@ import android.service.notification.NotificationListenerFilter;
|
|||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.util.IconDrawableFactory;
|
import android.util.IconDrawableFactory;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.util.Slog;
|
|
||||||
|
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
@@ -563,6 +561,23 @@ public class NotificationBackend {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ComponentName getDefaultNotificationAssistant() {
|
||||||
|
try {
|
||||||
|
return sINM.getDefaultNotificationAssistant();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.w(TAG, "Error calling NoMan", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetDefaultNotificationAssistant(boolean loadFromConfig) {
|
||||||
|
try {
|
||||||
|
sINM.resetDefaultNotificationAssistant(loadFromConfig);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.w(TAG, "Error calling NoMan", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean setNotificationAssistantGranted(ComponentName cn) {
|
public boolean setNotificationAssistantGranted(ComponentName cn) {
|
||||||
try {
|
try {
|
||||||
sINM.setNotificationAssistantAccessGranted(cn, true);
|
sINM.setNotificationAssistantAccessGranted(cn, true);
|
||||||
|
|||||||
@@ -83,6 +83,22 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
|
|||||||
private PackageManager mPm;
|
private PackageManager mPm;
|
||||||
private CountDownLatch mCountdownLatch;
|
private CountDownLatch mCountdownLatch;
|
||||||
private Future mCountdownFuture;
|
private Future mCountdownFuture;
|
||||||
|
private final ViewOutlineProvider mOutlineProvider = new ViewOutlineProvider() {
|
||||||
|
@Override
|
||||||
|
public void getOutline(View view, Outline outline) {
|
||||||
|
final TypedArray ta = NotificationHistoryActivity.this.obtainStyledAttributes(
|
||||||
|
new int[]{android.R.attr.dialogCornerRadius});
|
||||||
|
final float dialogCornerRadius = ta.getDimension(0, 0);
|
||||||
|
ta.recycle();
|
||||||
|
TypedValue v = new TypedValue();
|
||||||
|
NotificationHistoryActivity.this.getTheme().resolveAttribute(
|
||||||
|
com.android.internal.R.attr.listDivider, v, true);
|
||||||
|
int bottomPadding = NotificationHistoryActivity.this.getDrawable(v.resourceId)
|
||||||
|
.getIntrinsicHeight();
|
||||||
|
outline.setRoundRect(0, 0, view.getWidth(), (view.getHeight() - bottomPadding),
|
||||||
|
dialogCornerRadius);
|
||||||
|
}
|
||||||
|
};
|
||||||
private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
|
private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
|
||||||
|
|
||||||
enum NotificationHistoryEvent implements UiEventLogger.UiEventEnum {
|
enum NotificationHistoryEvent implements UiEventLogger.UiEventEnum {
|
||||||
@@ -133,22 +149,7 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
|
|||||||
notifications.isEmpty() ? View.GONE : View.VISIBLE);
|
notifications.isEmpty() ? View.GONE : View.VISIBLE);
|
||||||
mCountdownLatch.countDown();
|
mCountdownLatch.countDown();
|
||||||
mTodayView.setClipToOutline(true);
|
mTodayView.setClipToOutline(true);
|
||||||
mTodayView.setOutlineProvider(new ViewOutlineProvider() {
|
mTodayView.setOutlineProvider(mOutlineProvider);
|
||||||
@Override
|
|
||||||
public void getOutline(View view, Outline outline) {
|
|
||||||
final TypedArray ta = NotificationHistoryActivity.this.obtainStyledAttributes(
|
|
||||||
new int[]{android.R.attr.dialogCornerRadius});
|
|
||||||
final float dialogCornerRadius = ta.getDimension(0, 0);
|
|
||||||
ta.recycle();
|
|
||||||
TypedValue v = new TypedValue();
|
|
||||||
NotificationHistoryActivity.this.getTheme().resolveAttribute(
|
|
||||||
com.android.internal.R.attr.listDivider, v, true);
|
|
||||||
int bottomPadding = NotificationHistoryActivity.this.getDrawable(v.resourceId)
|
|
||||||
.getIntrinsicHeight();
|
|
||||||
outline.setRoundRect(0, 0, view.getWidth(), (view.getHeight() - bottomPadding),
|
|
||||||
dialogCornerRadius);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// for each package, new header and recycler view
|
// for each package, new header and recycler view
|
||||||
for (int i = 0, notificationsSize = notifications.size(); i < notificationsSize; i++) {
|
for (int i = 0, notificationsSize = notifications.size(); i < notificationsSize; i++) {
|
||||||
NotificationHistoryPackage nhp = notifications.get(i);
|
NotificationHistoryPackage nhp = notifications.get(i);
|
||||||
@@ -216,6 +217,8 @@ public class NotificationHistoryActivity extends CollapsingToolbarBaseActivity {
|
|||||||
mTodayView = findViewById(R.id.apps);
|
mTodayView = findViewById(R.id.apps);
|
||||||
mSnoozeView = findViewById(R.id.snoozed_list);
|
mSnoozeView = findViewById(R.id.snoozed_list);
|
||||||
mDismissView = findViewById(R.id.recently_dismissed_list);
|
mDismissView = findViewById(R.id.recently_dismissed_list);
|
||||||
|
mDismissView.setClipToOutline(true);
|
||||||
|
mDismissView.setOutlineProvider(mOutlineProvider);
|
||||||
mHistoryOff = findViewById(R.id.history_off);
|
mHistoryOff = findViewById(R.id.history_off);
|
||||||
mHistoryOn = findViewById(R.id.history_on);
|
mHistoryOn = findViewById(R.id.history_on);
|
||||||
mHistoryEmpty = findViewById(R.id.history_on_empty);
|
mHistoryEmpty = findViewById(R.id.history_on_empty);
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ public class ScreenPinningPreferenceController extends BasePreferenceController
|
|||||||
public CharSequence getSummary() {
|
public CharSequence getSummary() {
|
||||||
return Settings.System.getInt(mContext.getContentResolver(),
|
return Settings.System.getInt(mContext.getContentResolver(),
|
||||||
Settings.System.LOCK_TO_APP_ENABLED, 0) != 0
|
Settings.System.LOCK_TO_APP_ENABLED, 0) != 0
|
||||||
? mContext.getText(R.string.switch_on_text)
|
? mContext.getText(R.string.screen_pinning_switch_on_text)
|
||||||
: mContext.getText(R.string.switch_off_text);
|
: mContext.getText(R.string.screen_pinning_switch_off_text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -304,7 +304,9 @@ public class VpnSettings extends RestrictedSettingsFragment implements
|
|||||||
LegacyVpnPreference p = mSettings.findOrCreatePreference(stubProfile, false);
|
LegacyVpnPreference p = mSettings.findOrCreatePreference(stubProfile, false);
|
||||||
p.setState(vpn.state);
|
p.setState(vpn.state);
|
||||||
p.setAlwaysOn(lockdownVpnKey != null && lockdownVpnKey.equals(vpn.key));
|
p.setAlwaysOn(lockdownVpnKey != null && lockdownVpnKey.equals(vpn.key));
|
||||||
p.setInsecureVpn(VpnProfile.isLegacyType(stubProfile.type));
|
// (b/184921649) do not call setInsecureVpn() for connectedLegacyVpns, since the
|
||||||
|
// LegacyVpnInfo does not contain VPN type information, and the profile already
|
||||||
|
// exists within vpnProfiles.
|
||||||
updates.add(p);
|
updates.add(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import android.app.settings.SettingsEnums;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
@@ -40,7 +41,7 @@ import androidx.preference.PreferenceScreen;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.Utils;
|
import com.android.settings.Utils;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.RestrictedDashboardFragment;
|
||||||
import com.android.settings.overlay.FeatureFactory;
|
import com.android.settings.overlay.FeatureFactory;
|
||||||
import com.android.settings.wifi.WifiConfigUiBase2;
|
import com.android.settings.wifi.WifiConfigUiBase2;
|
||||||
import com.android.settings.wifi.WifiDialog2;
|
import com.android.settings.wifi.WifiDialog2;
|
||||||
@@ -62,7 +63,7 @@ import java.util.List;
|
|||||||
* <p>The key of {@link WifiEntry} should be saved to the intent Extras when launching this class
|
* <p>The key of {@link WifiEntry} should be saved to the intent Extras when launching this class
|
||||||
* in order to properly render this page.
|
* in order to properly render this page.
|
||||||
*/
|
*/
|
||||||
public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
|
public class WifiNetworkDetailsFragment2 extends RestrictedDashboardFragment implements
|
||||||
WifiDialog2.WifiDialog2Listener {
|
WifiDialog2.WifiDialog2Listener {
|
||||||
|
|
||||||
private static final String TAG = "WifiNetworkDetailsFrg2";
|
private static final String TAG = "WifiNetworkDetailsFrg2";
|
||||||
@@ -75,6 +76,8 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
|
|||||||
// Interval between initiating SavedNetworkTracker scans
|
// Interval between initiating SavedNetworkTracker scans
|
||||||
private static final long SCAN_INTERVAL_MILLIS = 10_000;
|
private static final long SCAN_INTERVAL_MILLIS = 10_000;
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
boolean mIsUiRestricted;
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
NetworkDetailsTracker mNetworkDetailsTracker;
|
NetworkDetailsTracker mNetworkDetailsTracker;
|
||||||
private HandlerThread mWorkerThread;
|
private HandlerThread mWorkerThread;
|
||||||
@@ -83,6 +86,34 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
List<AbstractPreferenceController> mControllers;
|
List<AbstractPreferenceController> mControllers;
|
||||||
|
|
||||||
|
public WifiNetworkDetailsFragment2() {
|
||||||
|
super(UserManager.DISALLOW_CONFIG_WIFI);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle icicle) {
|
||||||
|
super.onCreate(icicle);
|
||||||
|
setIfOnlyAvailableForAdmins(true);
|
||||||
|
mIsUiRestricted = isUiRestricted();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStart() {
|
||||||
|
super.onStart();
|
||||||
|
if (mIsUiRestricted) {
|
||||||
|
restrictUi();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
void restrictUi() {
|
||||||
|
clearWifiEntryCallback();
|
||||||
|
if (!isUiRestrictedByOnlyAdmin()) {
|
||||||
|
getEmptyTextView().setText(R.string.wifi_empty_list_user_restricted);
|
||||||
|
}
|
||||||
|
getPreferenceScreen().removeAll();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
mWorkerThread.quit();
|
mWorkerThread.quit();
|
||||||
@@ -126,7 +157,7 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
||||||
if (isEditable()) {
|
if (!mIsUiRestricted && isEditable()) {
|
||||||
MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify);
|
MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.wifi_modify);
|
||||||
item.setIcon(com.android.internal.R.drawable.ic_mode_edit);
|
item.setIcon(com.android.internal.R.drawable.ic_mode_edit);
|
||||||
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||||
@@ -255,6 +286,17 @@ public class WifiNetworkDetailsFragment2 extends DashboardFragment implements
|
|||||||
getArguments().getString(KEY_CHOSEN_WIFIENTRY_KEY));
|
getArguments().getString(KEY_CHOSEN_WIFIENTRY_KEY));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void clearWifiEntryCallback() {
|
||||||
|
if (mNetworkDetailsTracker == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final WifiEntry wifiEntry = mNetworkDetailsTracker.getWifiEntry();
|
||||||
|
if (wifiEntry == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wifiEntry.setListener(null);
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isEditable() {
|
private boolean isEditable() {
|
||||||
if (mNetworkDetailsTracker == null) {
|
if (mNetworkDetailsTracker == null) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -294,13 +294,4 @@ public class WifiTetherSettings extends RestrictedDashboardFragment
|
|||||||
screen.setInitialExpandedChildrenCount(getInitialExpandedChildCount());
|
screen.setInitialExpandedChildrenCount(getInitialExpandedChildCount());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getInitialExpandedChildCount() {
|
|
||||||
if (mSecurityPreferenceController != null && mSecurityPreferenceController.getSecurityType()
|
|
||||||
== SoftApConfiguration.SECURITY_TYPE_OPEN) {
|
|
||||||
return (EXPANDED_CHILD_COUNT_DEFAULT - 1);
|
|
||||||
}
|
|
||||||
return EXPANDED_CHILD_COUNT_DEFAULT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2021 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.android.settings.notification;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import android.content.ComponentName;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
|
||||||
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RobolectricTestRunner;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
|
@RunWith(RobolectricTestRunner.class)
|
||||||
|
public class NotificationAssistantDialogFragmentTest {
|
||||||
|
|
||||||
|
private Context mContext;
|
||||||
|
@Mock
|
||||||
|
private ConfigureNotificationSettings mFragment;
|
||||||
|
private NotificationAssistantDialogFragment mDialogFragment;
|
||||||
|
@Mock
|
||||||
|
private FragmentActivity mActivity;
|
||||||
|
|
||||||
|
ComponentName mComponentName = new ComponentName("a", "b");
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
MockitoAnnotations.initMocks(this);
|
||||||
|
mContext = spy(RuntimeEnvironment.application);
|
||||||
|
mDialogFragment =
|
||||||
|
spy(NotificationAssistantDialogFragment.newInstance(mFragment, mComponentName));
|
||||||
|
doReturn(mActivity).when(mDialogFragment).getActivity();
|
||||||
|
doReturn(mContext).when(mDialogFragment).getContext();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testClickOK_callEnableNAS() {
|
||||||
|
mDialogFragment.onClick(null, DialogInterface.BUTTON_POSITIVE);
|
||||||
|
|
||||||
|
verify(mFragment, times(1)).enableNAS(eq(mComponentName));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,17 +16,25 @@
|
|||||||
|
|
||||||
package com.android.settings.notification;
|
package com.android.settings.notification;
|
||||||
|
|
||||||
import static junit.framework.TestCase.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.provider.Settings;
|
||||||
import android.graphics.drawable.Drawable;
|
|
||||||
import android.os.Debug;
|
|
||||||
|
|
||||||
import com.android.settingslib.widget.CandidateInfo;
|
import androidx.fragment.app.FragmentManager;
|
||||||
|
import androidx.fragment.app.FragmentTransaction;
|
||||||
|
import androidx.test.core.app.ApplicationProvider;
|
||||||
|
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
@@ -35,7 +43,6 @@ import org.mockito.Answers;
|
|||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
import org.robolectric.RobolectricTestRunner;
|
import org.robolectric.RobolectricTestRunner;
|
||||||
import org.robolectric.RuntimeEnvironment;
|
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
public class NotificationAssistantPreferenceControllerTest {
|
public class NotificationAssistantPreferenceControllerTest {
|
||||||
@@ -44,57 +51,86 @@ public class NotificationAssistantPreferenceControllerTest {
|
|||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
@Mock
|
@Mock
|
||||||
|
private ConfigureNotificationSettings mFragment;
|
||||||
|
@Mock
|
||||||
|
private FragmentManager mFragmentManager;
|
||||||
|
@Mock
|
||||||
|
private FragmentTransaction mFragmentTransaction;
|
||||||
|
@Mock
|
||||||
private NotificationBackend mBackend;
|
private NotificationBackend mBackend;
|
||||||
private NotificationAssistantPreferenceController mPreferenceController;
|
private NotificationAssistantPreferenceController mPreferenceController;
|
||||||
|
ComponentName mNASComponent = new ComponentName("a", "b");
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
mContext = RuntimeEnvironment.application;
|
mContext = spy(ApplicationProvider.getApplicationContext());
|
||||||
mPreferenceController = new TestPreferenceController(mContext, mBackend);
|
doReturn(mContext).when(mFragment).getContext();
|
||||||
|
when(mFragment.getFragmentManager()).thenReturn(mFragmentManager);
|
||||||
|
when(mFragmentManager.beginTransaction()).thenReturn(mFragmentTransaction);
|
||||||
|
when(mBackend.getDefaultNotificationAssistant()).thenReturn(mNASComponent);
|
||||||
|
mPreferenceController = new NotificationAssistantPreferenceController(mContext,
|
||||||
|
mBackend, mFragment, KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSummary_noAssistant() {
|
public void testIsChecked() throws Exception {
|
||||||
|
when(mBackend.getAllowedNotificationAssistant()).thenReturn(mNASComponent);
|
||||||
|
assertTrue(mPreferenceController.isChecked());
|
||||||
|
|
||||||
when(mBackend.getAllowedNotificationAssistant()).thenReturn(null);
|
when(mBackend.getAllowedNotificationAssistant()).thenReturn(null);
|
||||||
CharSequence noneLabel = new NotificationAssistantPicker.CandidateNone(mContext)
|
assertFalse(mPreferenceController.isChecked());
|
||||||
.loadLabel();
|
|
||||||
assertEquals(noneLabel, mPreferenceController.getSummary());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetSummary_TestAssistant() {
|
public void testSetChecked() throws Exception {
|
||||||
String testName = "test_pkg/test_cls";
|
// Verify a dialog is shown when the switch is to be enabled.
|
||||||
when(mBackend.getAllowedNotificationAssistant()).thenReturn(
|
assertFalse(mPreferenceController.setChecked(true));
|
||||||
ComponentName.unflattenFromString(testName));
|
verify(mFragmentTransaction).add(
|
||||||
assertEquals(testName, mPreferenceController.getSummary());
|
any(NotificationAssistantDialogFragment.class), anyString());
|
||||||
|
verify(mBackend, times(0)).setNotificationAssistantGranted(any());
|
||||||
|
|
||||||
|
// Verify no dialog is shown and NAS set to null when disabled
|
||||||
|
assertTrue(mPreferenceController.setChecked(false));
|
||||||
|
verify(mBackend, times(1)).setNotificationAssistantGranted(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class TestPreferenceController extends NotificationAssistantPreferenceController {
|
@Test
|
||||||
|
public void testMigrationFromSetting_userEnable() throws Exception {
|
||||||
|
Settings.Secure.putIntForUser(mContext.getContentResolver(),
|
||||||
|
Settings.Secure.NAS_SETTINGS_UPDATED, 0, 0);
|
||||||
|
|
||||||
private TestPreferenceController(Context context, NotificationBackend backend) {
|
//Test user enable for the first time
|
||||||
super(context, KEY);
|
mPreferenceController.setNotificationAssistantGranted(mNASComponent);
|
||||||
mNotificationBackend = backend;
|
assertEquals(1, Settings.Secure.getIntForUser(mContext.getContentResolver(),
|
||||||
}
|
Settings.Secure.NAS_SETTINGS_UPDATED, 0, 0));
|
||||||
|
verify(mBackend, times(1))
|
||||||
|
.resetDefaultNotificationAssistant(eq(true));
|
||||||
|
|
||||||
@Override
|
//Test user enable again, migration should not happen
|
||||||
public String getPreferenceKey() {
|
mPreferenceController.setNotificationAssistantGranted(mNASComponent);
|
||||||
return KEY;
|
//Number of invocations should not increase
|
||||||
}
|
verify(mBackend, times(1))
|
||||||
|
.resetDefaultNotificationAssistant(eq(true));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Test
|
||||||
protected CandidateInfo createCandidateInfo(ComponentName cn) {
|
public void testMigrationFromSetting_userDisable() throws Exception {
|
||||||
return new CandidateInfo(true) {
|
Settings.Secure.putIntForUser(mContext.getContentResolver(),
|
||||||
@Override
|
Settings.Secure.NAS_SETTINGS_UPDATED, 0, 0);
|
||||||
public CharSequence loadLabel() { return cn.flattenToString(); }
|
|
||||||
|
|
||||||
@Override
|
//Test user disable for the first time
|
||||||
public Drawable loadIcon() { return null; }
|
mPreferenceController.setChecked(false);
|
||||||
|
assertEquals(1, Settings.Secure.getIntForUser(mContext.getContentResolver(),
|
||||||
|
Settings.Secure.NAS_SETTINGS_UPDATED, 0, 0));
|
||||||
|
verify(mBackend, times(1))
|
||||||
|
.resetDefaultNotificationAssistant(eq(false));
|
||||||
|
|
||||||
@Override
|
//Test user disable again, migration should not happen
|
||||||
public String getKey() { return null; }
|
mPreferenceController.setChecked(false);
|
||||||
};
|
//Number of invocations should not increase
|
||||||
}
|
verify(mBackend, times(1))
|
||||||
|
.resetDefaultNotificationAssistant(eq(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import android.app.settings.SettingsEnums;
|
|||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
import androidx.preference.Preference;
|
||||||
import androidx.preference.PreferenceScreen;
|
import androidx.preference.PreferenceScreen;
|
||||||
@@ -110,6 +111,41 @@ public class WifiNetworkDetailsFragment2Test {
|
|||||||
verify(mMenu, never()).add(anyInt(), anyInt(), anyInt(), eq(R.string.wifi_modify));
|
verify(mMenu, never()).add(anyInt(), anyInt(), anyInt(), eq(R.string.wifi_modify));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onCreateOptionsMenu_uiRestricted_shouldNotAddEditMenu() {
|
||||||
|
mFragment.mIsUiRestricted = true;
|
||||||
|
|
||||||
|
mFragment.onCreateOptionsMenu(mMenu, mock(MenuInflater.class));
|
||||||
|
|
||||||
|
verify(mMenu, never()).add(anyInt(), anyInt(), anyInt(), eq(R.string.wifi_modify));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void restrictUi_shouldShowRestrictedText() {
|
||||||
|
final FakeFragment fragment = spy(new FakeFragment());
|
||||||
|
final PreferenceScreen screen = mock(PreferenceScreen.class);
|
||||||
|
final TextView restrictedText = mock(TextView.class);
|
||||||
|
doReturn(screen).when(fragment).getPreferenceScreen();
|
||||||
|
doReturn(false).when(fragment).isUiRestrictedByOnlyAdmin();
|
||||||
|
doReturn(restrictedText).when(fragment).getEmptyTextView();
|
||||||
|
|
||||||
|
fragment.restrictUi();
|
||||||
|
|
||||||
|
verify(restrictedText).setText(anyInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void restrictUi_shouldRemoveAllPreferences() {
|
||||||
|
final FakeFragment fragment = spy(new FakeFragment());
|
||||||
|
final PreferenceScreen screen = mock(PreferenceScreen.class);
|
||||||
|
doReturn(screen).when(fragment).getPreferenceScreen();
|
||||||
|
doReturn(true).when(fragment).isUiRestrictedByOnlyAdmin();
|
||||||
|
|
||||||
|
fragment.restrictUi();
|
||||||
|
|
||||||
|
verify(screen).removeAll();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void refreshPreferences_controllerShouldUpdateStateAndDisplayPreference() {
|
public void refreshPreferences_controllerShouldUpdateStateAndDisplayPreference() {
|
||||||
final FakeFragment fragment = spy(new FakeFragment());
|
final FakeFragment fragment = spy(new FakeFragment());
|
||||||
@@ -136,6 +172,11 @@ public class WifiNetworkDetailsFragment2Test {
|
|||||||
public void addPreferenceController(AbstractPreferenceController controller) {
|
public void addPreferenceController(AbstractPreferenceController controller) {
|
||||||
super.addPreferenceController(controller);
|
super.addPreferenceController(controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isUiRestrictedByOnlyAdmin() {
|
||||||
|
return super.isUiRestrictedByOnlyAdmin();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TestController extends BasePreferenceController {
|
public class TestController extends BasePreferenceController {
|
||||||
|
|||||||
@@ -132,8 +132,6 @@ public class MobileNetworkUtilsTest {
|
|||||||
|
|
||||||
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
|
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
|
||||||
Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
|
Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
|
||||||
when(mSubscriptionManager.getAccessibleSubscriptionInfoList()).thenReturn(
|
|
||||||
Arrays.asList(mSubscriptionInfo1, mSubscriptionInfo2));
|
|
||||||
|
|
||||||
when(mTelephonyManager.getNetworkOperatorName()).thenReturn(
|
when(mTelephonyManager.getNetworkOperatorName()).thenReturn(
|
||||||
PLMN_FROM_TELEPHONY_MANAGER_API);
|
PLMN_FROM_TELEPHONY_MANAGER_API);
|
||||||
|
|||||||
@@ -88,8 +88,6 @@ public class OpenNetworkSelectPagePreferenceControllerTest {
|
|||||||
|
|
||||||
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
|
when(mSubscriptionManager.getActiveSubscriptionInfoList()).thenReturn(
|
||||||
Arrays.asList(mSubscriptionInfo));
|
Arrays.asList(mSubscriptionInfo));
|
||||||
when(mSubscriptionManager.getAccessibleSubscriptionInfoList()).thenReturn(
|
|
||||||
Arrays.asList(mSubscriptionInfo));
|
|
||||||
|
|
||||||
when(mTelephonyManager.getNetworkOperatorName()).thenReturn(OPERATOR_NAME);
|
when(mTelephonyManager.getNetworkOperatorName()).thenReturn(OPERATOR_NAME);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user