Snap for 7798846 from f83531e0b3 to sc-v2-release

Change-Id: If6c36e62f98d51390ed14b39145940d99cbe6bac
This commit is contained in:
Android Build Coastguard Worker
2021-10-06 23:17:13 +00:00
39 changed files with 1013 additions and 96 deletions

View File

@@ -1679,6 +1679,10 @@
android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" /> android:value="com.android.settings.accessibility.AccessibilitySettingsForSetupWizard" />
</activity-alias> </activity-alias>
<activity
android:name=".accessibility.AccessibilityScreenSizeForSetupWizardActivity"
android:exported="false"/>
<activity <activity
android:name="Settings$AccessibilityDaltonizerSettingsActivity" android:name="Settings$AccessibilityDaltonizerSettingsActivity"
android:exported="true" android:exported="true"
@@ -3675,6 +3679,11 @@
</intent-filter> </intent-filter>
</provider> </provider>
<provider
android:name=".activityembedding.ActivityEmbeddingProvider"
android:authorities="com.android.settings.activityembedding"
android:exported="true"/>
<activity <activity
android:name=".wifi.dpp.WifiDppConfiguratorActivity" android:name=".wifi.dpp.WifiDppConfiguratorActivity"
android:exported="true"> android:exported="true">

Binary file not shown.

View File

@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_accessibility_visibility"
app:sucHeaderText="@string/title_font_size"
app:sudDescriptionText="@string/short_summary_font_size">
<FrameLayout
android:id="@+id/content_frame"
android:layout_marginTop="@dimen/preview_size_top_margin"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/suw_preview_seek_bar_view_pager"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
<com.android.settings.widget.DotsPageIndicator
android:id="@+id/page_indicator"
style="@style/PreviewPagerPageIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="3dp"/>
<TextView
android:id="@+id/current_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="6dp"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
android:elevation="2dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:paddingTop="8dp">
<ImageView
android:id="@+id/smaller"
android:src="@drawable/ic_font_size_16dp"
android:contentDescription="@string/font_size_make_smaller_desc"
style="@style/screen_size_imageview_style"/>
<com.android.settings.widget.LabeledSeekBar
android:id="@+id/seek_bar"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
style="@android:style/Widget.Material.SeekBar.Discrete"/>
<ImageView
android:id="@+id/larger"
android:src="@drawable/ic_font_size_24dp"
android:contentDescription="@string/font_size_make_larger_desc"
style="@style/screen_size_imageview_style"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/font_size_summary"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="vertical"
android:paddingStart="@dimen/preview_pager_padding"
android:paddingEnd="@dimen/preview_pager_padding"
android:background="@drawable/preview_seek_bar_outline" >
<androidx.viewpager.widget.ViewPager
android:id="@+id/preview_pager"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_weight="1"
android:background="?android:attr/colorBackground"
android:contentDescription="@string/preview_pager_content_description" />
<TextView
android:layout_width="match_parent"
android:layout_height="36dp"
android:paddingStart="32dp"
android:gravity="start|center"
android:text="@string/screen_zoom_preview_title"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title"
android:importantForAccessibility="no" />
</LinearLayout>

View File

@@ -0,0 +1,85 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<include layout="@layout/suw_preview_seek_bar_view_pager"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
<com.android.settings.widget.DotsPageIndicator
android:id="@+id/page_indicator"
style="@style/PreviewPagerPageIndicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="3dp"/>
<TextView
android:id="@+id/current_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:padding="6dp"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Widget.TextView"
android:elevation="2dp"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<ImageView
android:id="@+id/smaller"
android:src="@drawable/ic_remove_24dp"
android:contentDescription="@string/screen_zoom_make_smaller_desc"
style="@style/screen_size_imageview_style"/>
<com.android.settings.widget.LabeledSeekBar
android:id="@+id/seek_bar"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
style="@android:style/Widget.Material.SeekBar.Discrete"/>
<ImageView
android:id="@+id/larger"
android:src="@drawable/ic_add_24dp"
android:contentDescription="@string/screen_zoom_make_larger_desc"
style="@style/screen_size_imageview_style"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/screen_zoom_summary"
android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead"/>
</LinearLayout>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<resources>
<!-- Top margin for preview view pager -->
<dimen name="preview_size_top_margin">0dp</dimen>
</resources>

View File

@@ -434,6 +434,9 @@
<!-- Choose SIM Activity dimens --> <!-- Choose SIM Activity dimens -->
<dimen name="subtitle_bottom_padding">24dp</dimen> <dimen name="subtitle_bottom_padding">24dp</dimen>
<!-- Top margin for preview view pager -->
<dimen name="preview_size_top_margin">-12dp</dimen>
<!-- Battery usage chart view component --> <!-- Battery usage chart view component -->
<dimen name="chartview_text_padding">6dp</dimen> <dimen name="chartview_text_padding">6dp</dimen>
<dimen name="chartview_divider_width">1dp</dimen> <dimen name="chartview_divider_width">1dp</dimen>

View File

@@ -21,4 +21,9 @@
<integer name="job_anomaly_detection">102</integer> <integer name="job_anomaly_detection">102</integer>
<integer name="device_index_update">103</integer> <integer name="device_index_update">103</integer>
<integer name="sim_notification_send">104</integer> <integer name="sim_notification_send">104</integer>
<!-- Define the font/display size fragment id in the
accessibility_settings_for_setup_wizard.xml. -->
<integer name="suw_font_size_fragment_no">0</integer>
<integer name="suw_display_size_fragment_no">1</integer>
</resources> </resources>

View File

@@ -6283,6 +6283,8 @@
<!-- Summary for battery manager when it is on --> <!-- Summary for battery manager when it is on -->
<string name="battery_manager_summary">Detecting when apps drain battery</string> <string name="battery_manager_summary">Detecting when apps drain battery</string>
<!-- Summary for battery manager when it is on. [CHAR LIMIT=NONE] -->
<string name="battery_manager_summary_unsupported">Detecting when apps drain battery</string>
<!-- Summary for battery manager when it is off --> <!-- Summary for battery manager when it is off -->
<string name="battery_manager_off">Off</string> <string name="battery_manager_off">Off</string>

View File

@@ -237,6 +237,16 @@
<item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Small</item> <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Small</item>
</style> </style>
<style name="screen_size_imageview_style">
<item name="android:layout_width">48dp</item>
<item name="android:layout_height">48dp</item>
<item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
<item name="android:tint">?android:attr/textColorPrimary</item>
<item name="android:tintMode">src_in</item>
<item name="android:scaleType">center</item>
<item name="android:focusable">true</item>
</style>
<style name="TextAppearance" parent="android:TextAppearance.DeviceDefault"/> <style name="TextAppearance" parent="android:TextAppearance.DeviceDefault"/>
<style name="TextAppearance.info_label"> <style name="TextAppearance.info_label">

View File

@@ -234,6 +234,7 @@
<item name="android:listPreferredItemPaddingEnd">16dp</item> <item name="android:listPreferredItemPaddingEnd">16dp</item>
<item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item> <item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item>
<item name="android:switchStyle">@style/Switch.SettingsLib</item> <item name="android:switchStyle">@style/Switch.SettingsLib</item>
<item name="preferenceFragmentCompatStyle">@style/SetupWizardPreferenceFragmentStyle</item>
</style> </style>
<!-- This theme was applied to Settings pages which are running under SUW with DynamicColor. --> <!-- This theme was applied to Settings pages which are running under SUW with DynamicColor. -->
@@ -243,6 +244,7 @@
<item name="android:listPreferredItemPaddingEnd">16dp</item> <item name="android:listPreferredItemPaddingEnd">16dp</item>
<item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item> <item name="preferenceTheme">@style/PreferenceTheme.SettingsLib</item>
<item name="android:switchStyle">@style/Switch.SettingsLib</item> <item name="android:switchStyle">@style/Switch.SettingsLib</item>
<item name="preferenceFragmentCompatStyle">@style/SetupWizardPreferenceFragmentStyle</item>
</style> </style>
<!-- DayNight themes --> <!-- DayNight themes -->

View File

@@ -21,18 +21,28 @@
android:title="@string/vision_settings_title"> android:title="@string/vision_settings_title">
<Preference <Preference
android:fragment="com.android.settings.display.FontSizePreferenceFragmentForSetupWizard"
android:key="font_size_preference" android:key="font_size_preference"
android:icon="@drawable/ic_font_size" android:icon="@drawable/ic_font_size"
android:summary="@string/short_summary_font_size" android:summary="@string/short_summary_font_size"
android:title="@string/title_font_size"/> android:title="@string/title_font_size">
<intent
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity">
<extra android:name="vision_fragment_no" android:value="@integer/suw_font_size_fragment_no"/>
</intent>
</Preference>
<com.android.settings.display.ScreenZoomPreference <com.android.settings.display.ScreenZoomPreference
android:fragment="com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard"
android:key="force_density_preference" android:key="force_density_preference"
android:icon="@drawable/ic_screen_zoom" android:icon="@drawable/ic_screen_zoom"
android:summary="@string/screen_zoom_short_summary" android:summary="@string/screen_zoom_short_summary"
android:title="@string/screen_zoom_title"/> android:title="@string/screen_zoom_title">
<intent
android:targetPackage="com.android.settings"
android:targetClass="com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity">
<extra android:name="vision_fragment_no" android:value="@integer/suw_display_size_fragment_no"/>
</intent>
</com.android.settings.display.ScreenZoomPreference>
<Preference <Preference
android:fragment="com.android.settings.accessibility.MagnificationPreferenceFragment" android:fragment="com.android.settings.accessibility.MagnificationPreferenceFragment"

View File

@@ -0,0 +1,127 @@
/*
* 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.accessibility;
import android.app.settings.SettingsEnums;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceFragmentCompat;
import com.android.settings.R;
import com.android.settings.core.InstrumentedActivity;
import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
import com.android.settings.display.ScreenZoomPreferenceFragmentForSetupWizard;
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton;
import com.google.android.setupdesign.GlifLayout;
import com.google.android.setupdesign.util.ThemeHelper;
/** Settings font/display size activity for SUW. */
public class AccessibilityScreenSizeForSetupWizardActivity extends InstrumentedActivity {
private static final String TAG = "ScreenSizeForSetup";
// A parameter decides which fragment ({@link FontSizePreferenceFragmentForSetupWizard} or
// {@link ScreenZoomPreferenceFragmentForSetupWizard}) will be visioned.
static final String VISION_FRAGMENT_NO = "vision_fragment_no";
private int mFragmentNo;
private int mFontSizeFragmentNo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFontSizeFragmentNo = getResources().getInteger(R.integer.suw_font_size_fragment_no);
final int appliedTheme = ThemeHelper.trySetDynamicColor(this)
? R.style.SudDynamicColorThemeGlifV3_DayNight : R.style.SudThemeGlifV3_DayNight;
setTheme(appliedTheme);
setContentView(R.layout.accessibility_screen_size_setup_wizard);
mFragmentNo = getIntent().getExtras().getInt(VISION_FRAGMENT_NO);
Log.d(TAG, "onCreate: fragment no: " + mFragmentNo);
generateHeader(mFragmentNo);
scrollToBottom();
initFooterButton();
if (savedInstanceState == null) {
final PreferenceFragmentCompat fragment =
(mFragmentNo == mFontSizeFragmentNo)
? new FontSizePreferenceFragmentForSetupWizard()
: new ScreenZoomPreferenceFragmentForSetupWizard();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
}
}
@Override
public int getMetricsCategory() {
return mFragmentNo == mFontSizeFragmentNo ? SettingsEnums.SUW_ACCESSIBILITY_FONT_SIZE
: SettingsEnums.SUW_ACCESSIBILITY_DISPLAY_SIZE;
}
@VisibleForTesting
void generateHeader(int fragmentNo) {
((TextView) findViewById(R.id.suc_layout_title)).setText(
fragmentNo == mFontSizeFragmentNo ? R.string.title_font_size
: R.string.screen_zoom_title);
((TextView) findViewById(R.id.sud_layout_subtitle)).setText(
fragmentNo == mFontSizeFragmentNo ? R.string.short_summary_font_size
: R.string.screen_zoom_short_summary);
}
@VisibleForTesting
void initFooterButton() {
final GlifLayout layout = findViewById(R.id.setup_wizard_layout);
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
final View.OnClickListener nextButtonListener =
v -> {
onBackPressed();
};
final FooterButton primaryButton =
new FooterButton.Builder(this)
.setText(R.string.done)
.setListener(nextButtonListener)
.setButtonType(FooterButton.ButtonType.NEXT)
.setTheme(R.style.SudGlifButton_Primary)
.build();
mixin.setPrimaryButton(primaryButton);
}
/**
* Scrolls to bottom while {@link ScrollView} layout changed.
*/
private void scrollToBottom() {
final GlifLayout layout = findViewById(R.id.setup_wizard_layout);
final ScrollView scrollView = layout.getScrollView();
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
final int scrollViewHeight = scrollView.getHeight();
if (scrollViewHeight > 0) {
scrollView.post(() -> {
// Here is no need to show the scrolling animation. So disabled first and
// then enabled it after scrolling finished.
scrollView.setSmoothScrollingEnabled(false);
scrollView.fullScroll(View.FOCUS_DOWN);
scrollView.setSmoothScrollingEnabled(true);
});
}
});
}
}

View File

@@ -28,11 +28,11 @@ import android.content.pm.ServiceInfo;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.widget.LinearLayout;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@@ -42,7 +42,6 @@ import com.android.settings.SettingsPreferenceFragment;
import com.android.settingslib.RestrictedPreference; import com.android.settingslib.RestrictedPreference;
import com.google.android.setupdesign.GlifPreferenceLayout; import com.google.android.setupdesign.GlifPreferenceLayout;
import com.google.android.setupdesign.util.ThemeHelper;
import java.util.List; import java.util.List;
@@ -81,16 +80,11 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
layout.setDividerInsets(Integer.MAX_VALUE, 0); final String title = getContext().getString(R.string.vision_settings_title);
layout.setDescriptionText(R.string.vision_settings_description); final String description = getContext().getString(R.string.vision_settings_description);
layout.setHeaderText(R.string.vision_settings_title); final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
layout.setIcon(getPrefContext().getDrawable(R.drawable.ic_accessibility_visibility)); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
if (ThemeHelper.shouldApplyExtendedPartnerConfig(getActivity())) {
final LinearLayout headerLayout = layout.findManagedViewById(R.id.sud_layout_header);
headerLayout.setPadding(0, headerLayout.getPaddingTop(), 0,
headerLayout.getPaddingBottom());
}
} }
@Override @Override
@@ -143,6 +137,13 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
return super.onPreferenceTreeClick(preference); return super.onPreferenceTreeClick(preference);
} }
/**
* Returns accessibility service info by given package name and service name.
*
* @param packageName Package of accessibility service
* @param serviceName Class of accessibility service
* @return {@link AccessibilityServiceInfo} instance if available, null otherwise.
*/
private AccessibilityServiceInfo findService(String packageName, String serviceName) { private AccessibilityServiceInfo findService(String packageName, String serviceName) {
final AccessibilityManager manager = final AccessibilityManager manager =
getActivity().getSystemService(AccessibilityManager.class); getActivity().getSystemService(AccessibilityManager.class);
@@ -150,8 +151,8 @@ public class AccessibilitySettingsForSetupWizard extends SettingsPreferenceFragm
manager.getInstalledAccessibilityServiceList(); manager.getInstalledAccessibilityServiceList();
for (AccessibilityServiceInfo info : accessibilityServices) { for (AccessibilityServiceInfo info : accessibilityServices) {
ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo; ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
if (packageName.equals(serviceInfo.packageName) if (TextUtils.equals(packageName, serviceInfo.packageName)
&& serviceName.equals(serviceInfo.name)) { && TextUtils.equals(serviceName, serviceInfo.name)) {
return info; return info;
} }
} }

View File

@@ -16,7 +16,10 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import static com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity.VISION_FRAGMENT_NO;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.Menu; import android.view.Menu;
@@ -30,7 +33,6 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity; import com.android.settings.SettingsActivity;
import com.android.settings.SetupWizardUtils; import com.android.settings.SetupWizardUtils;
import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.SubSettingLauncher;
import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
import com.android.settings.search.actionbar.SearchMenuController; import com.android.settings.search.actionbar.SearchMenuController;
import com.android.settings.support.actionbar.HelpResourceProvider; import com.android.settings.support.actionbar.HelpResourceProvider;
import com.android.settingslib.core.instrumentation.Instrumentable; import com.android.settingslib.core.instrumentation.Instrumentable;
@@ -123,19 +125,12 @@ public class AccessibilitySettingsForSetupWizardActivity extends SettingsActivit
&& new ComponentName(getPackageName(), && new ComponentName(getPackageName(),
CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW).equals( CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW).equals(
getIntent().getComponent())) { getIntent().getComponent())) {
final Bundle args = new Bundle(); final Intent intent = new Intent(this,
args.putInt(HelpResourceProvider.HELP_URI_RESOURCE_KEY, 0); AccessibilityScreenSizeForSetupWizardActivity.class);
args.putBoolean(SearchMenuController.NEED_SEARCH_ICON_IN_ACTION_BAR, false); intent.putExtra(VISION_FRAGMENT_NO,
final SubSettingLauncher subSettingLauncher = new SubSettingLauncher(this) getResources().getInteger(R.integer.suw_font_size_fragment_no));
.setDestination(FontSizePreferenceFragmentForSetupWizard.class.getName()) startActivity(intent);
.setArguments(args)
.setSourceMetricsCategory(Instrumentable.METRICS_CATEGORY_UNKNOWN)
.setExtras(SetupWizardUtils.copyLifecycleExtra(getIntent().getExtras(),
new Bundle()))
.setTransitionType(SettingsTransitionHelper.TransitionType.TRANSITION_FADE);
Log.d(LOG_TAG, "Launch font size settings"); Log.d(LOG_TAG, "Launch font size settings");
subSettingLauncher.launch();
finish(); finish();
} }
} }

View File

@@ -0,0 +1,58 @@
/*
* 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.accessibility;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.LinearLayout;
import com.android.settings.R;
import com.google.android.setupdesign.GlifPreferenceLayout;
import com.google.android.setupdesign.util.ThemeHelper;
/** Provides utility methods to accessibility settings for Setup Wizard only. */
class AccessibilitySetupWizardUtils {
private AccessibilitySetupWizardUtils(){}
/**
* Update the {@link GlifPreferenceLayout} attributes if they have previously been initialized.
* When the SetupWizard supports the extended partner configs, it means the material layout
* would be applied. It should set a different padding/margin in views to align Settings style
* for accessibility feature pages.
*
* @param layout The layout instance
* @param title The text to be set as title
* @param description The text to be set as description
* @param icon The icon to be set
*/
public static void updateGlifPreferenceLayout(Context context, GlifPreferenceLayout layout,
CharSequence title, CharSequence description, Drawable icon) {
layout.setHeaderText(title);
layout.setDescriptionText(description);
layout.setIcon(icon);
layout.setDividerInsets(Integer.MAX_VALUE, 0);
if (ThemeHelper.shouldApplyExtendedPartnerConfig(context)) {
final LinearLayout headerLayout = layout.findManagedViewById(R.id.sud_layout_header);
if (headerLayout != null) {
headerLayout.setPadding(0, layout.getPaddingTop(), 0,
layout.getPaddingBottom());
}
}
}
}

View File

@@ -17,12 +17,44 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
import com.google.android.setupdesign.GlifPreferenceLayout;
public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard
extends ToggleScreenMagnificationPreferenceFragment { extends ToggleScreenMagnificationPreferenceFragment {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
final String title = getContext().getString(
R.string.accessibility_screen_magnification_title);
final String description = getContext().getString(R.string.accelerometer_title);
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
// Hide the setting from the vision settings.
mSettingsPreference.setVisible(false);
}
@Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION; return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION;
@@ -49,12 +81,4 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard
// Hides help center in action bar and footer bar in SuW // Hides help center in action bar and footer bar in SuW
return 0; return 0;
} }
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// Hide the setting from the vision settings.
mSettingsPreference.setVisible(false);
}
} }

View File

@@ -17,8 +17,17 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
import com.google.android.setupdesign.GlifPreferenceLayout;
public class ToggleScreenReaderPreferenceFragmentForSetupWizard public class ToggleScreenReaderPreferenceFragmentForSetupWizard
extends ToggleAccessibilityServicePreferenceFragment { extends ToggleAccessibilityServicePreferenceFragment {
@@ -28,9 +37,25 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE);
final String description = getContext().getString(
R.string.accessibility_screen_magnification_title);
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked(); mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked();
} }
@Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER; return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER;

View File

@@ -17,8 +17,17 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.graphics.drawable.Drawable;
import android.os.Bundle; import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import com.android.settings.R;
import com.google.android.setupdesign.GlifPreferenceLayout;
public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard
extends InvisibleToggleAccessibilityServicePreferenceFragment { extends InvisibleToggleAccessibilityServicePreferenceFragment {
@@ -28,9 +37,24 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard
@Override @Override
public void onViewCreated(View view, Bundle savedInstanceState) { public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
final GlifPreferenceLayout layout = (GlifPreferenceLayout) view;
final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE);
final String description = getContext().getString(R.string.select_to_speak_summary);
final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title,
description, icon);
mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked(); mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked();
} }
@Override
public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent,
Bundle savedInstanceState) {
final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent;
return layout.onCreateRecyclerView(inflater, parent, savedInstanceState);
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK; return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SELECT_TO_SPEAK;

View File

@@ -0,0 +1,75 @@
/*
* 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.activityembedding;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
/**
* A content provider for querying the state of activity embedding feature
*/
public class ActivityEmbeddingProvider extends ContentProvider {
private static final String METHOD_IS_EMBEDDING_ACTIVITY_ENABLED = "isEmbeddingActivityEnabled";
private static final String EXTRA_ENABLED_STATE = "enabled_state";
@Override
public boolean onCreate() {
return true;
}
@Override
public Bundle call(String method, String arg, Bundle extras) {
if (TextUtils.equals(method, METHOD_IS_EMBEDDING_ACTIVITY_ENABLED)) {
final Bundle bundle = new Bundle();
bundle.putBoolean(EXTRA_ENABLED_STATE,
ActivityEmbeddingUtils.isEmbeddingActivityEnabled(getContext()));
return bundle;
}
return null;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
throw new UnsupportedOperationException();
}
@Override
public String getType(Uri uri) {
throw new UnsupportedOperationException();
}
@Override
public Uri insert(Uri uri, ContentValues values) {
throw new UnsupportedOperationException();
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException();
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
throw new UnsupportedOperationException();
}
}

View File

@@ -18,9 +18,16 @@ package com.android.settings.display;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import com.android.settings.R;
public class FontSizePreferenceFragmentForSetupWizard public class FontSizePreferenceFragmentForSetupWizard
extends ToggleFontSizePreferenceFragment { extends ToggleFontSizePreferenceFragment {
@Override
protected int getActivityLayoutResId() {
return R.layout.suw_font_size_fragment;
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.SUW_ACCESSIBILITY_FONT_SIZE; return SettingsEnums.SUW_ACCESSIBILITY_FONT_SIZE;

View File

@@ -109,6 +109,10 @@ public class PreviewPagerAdapter extends PagerAdapter {
return (view == object); return (view == object);
} }
FrameLayout[] getPreviewFrames() {
return mPreviewFrames;
}
boolean isAnimating() { boolean isAnimating() {
return mAnimationCounter > 0; return mAnimationCounter > 0;
} }

View File

@@ -264,6 +264,12 @@ public abstract class PreviewSeekBarPreferenceFragment extends SettingsPreferenc
@Override @Override
public void onPageSelected(int position) { public void onPageSelected(int position) {
mPreviewPager.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT); mPreviewPager.sendAccessibilityEvent(AccessibilityEvent.TYPE_ANNOUNCEMENT);
// To avoid displaying previous page on the left side in SUW landscape mode for
// large size.
if (position > 0) {
mPreviewPagerAdapter.getPreviewFrames()[position - 1].setVisibility(View.INVISIBLE);
}
mPreviewPagerAdapter.getPreviewFrames()[position].setVisibility(View.VISIBLE);
} }
}; };

View File

@@ -18,8 +18,15 @@ package com.android.settings.display;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import com.android.settings.R;
public class ScreenZoomPreferenceFragmentForSetupWizard extends ScreenZoomSettings { public class ScreenZoomPreferenceFragmentForSetupWizard extends ScreenZoomSettings {
@Override
protected int getActivityLayoutResId() {
return R.layout.suw_screen_zoom_fragment;
}
@Override @Override
public int getMetricsCategory() { public int getMetricsCategory() {
return SettingsEnums.SUW_ACCESSIBILITY_DISPLAY_SIZE; return SettingsEnums.SUW_ACCESSIBILITY_DISPLAY_SIZE;

View File

@@ -31,6 +31,7 @@ import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.core.BasePreferenceController; import com.android.settings.core.BasePreferenceController;
import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.RestrictedLockUtilsInternal;
import com.android.settingslib.RestrictedTopLevelPreference; import com.android.settingslib.RestrictedTopLevelPreference;
@@ -97,7 +98,8 @@ public class TopLevelWallpaperPreferenceController extends BasePreferenceControl
if (getPreferenceKey().equals(preference.getKey())) { if (getPreferenceKey().equals(preference.getKey())) {
final Intent intent = new Intent().setComponent( final Intent intent = new Intent().setComponent(
getComponentName()).putExtra(mWallpaperLaunchExtra, LAUNCHED_SETTINGS); getComponentName()).putExtra(mWallpaperLaunchExtra, LAUNCHED_SETTINGS);
if (areStylesAvailable()) { if (areStylesAvailable() && !ActivityEmbeddingUtils.isEmbeddingActivityEnabled(
mContext)) {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
} }
preference.getContext().startActivity(intent); preference.getContext().startActivity(intent);

View File

@@ -350,7 +350,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll
private void addAllPreferences() { private void addAllPreferences() {
final List<BatteryDiffEntry> entries = final List<BatteryDiffEntry> entries =
mBatteryIndexedMap.get(Integer.valueOf(mTrapezoidIndex)); mBatteryIndexedMap.get(Integer.valueOf(mTrapezoidIndex));
addFooterPreferenceIfNeeded(!entries.isEmpty()); addFooterPreferenceIfNeeded(entries != null && !entries.isEmpty());
if (entries == null) { if (entries == null) {
Log.w(TAG, "cannot find BatteryDiffEntry for:" + mTrapezoidIndex); Log.w(TAG, "cannot find BatteryDiffEntry for:" + mTrapezoidIndex);
return; return;

View File

@@ -79,12 +79,14 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
private boolean mIsSlotsClickabled; private boolean mIsSlotsClickabled;
private String[] mPercentages = getPercentages(); private String[] mPercentages = getPercentages();
@VisibleForTesting int mSelectedIndex; @VisibleForTesting int mHoveredIndex = SELECTED_INDEX_INVALID;
@VisibleForTesting int mSelectedIndex = SELECTED_INDEX_INVALID;
@VisibleForTesting String[] mTimestamps; @VisibleForTesting String[] mTimestamps;
// Colors for drawing the trapezoid shape and dividers. // Colors for drawing the trapezoid shape and dividers.
private int mTrapezoidColor; private int mTrapezoidColor;
private int mTrapezoidSolidColor; private int mTrapezoidSolidColor;
private int mTrapezoidHoverColor;
// For drawing the percentage information. // For drawing the percentage information.
private int mTextPadding; private int mTextPadding;
private final Rect mIndent = new Rect(); private final Rect mIndent = new Rect();
@@ -108,7 +110,7 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
Paint mTrapezoidCurvePaint = null; Paint mTrapezoidCurvePaint = null;
private TrapezoidSlot[] mTrapezoidSlots; private TrapezoidSlot[] mTrapezoidSlots;
// Records the location to calculate selected index. // Records the location to calculate selected index.
private MotionEvent mTouchUpEvent; private float mTouchUpEventX = Float.MIN_VALUE;
private BatteryChartView.OnSelectListener mOnSelectListener; private BatteryChartView.OnSelectListener mOnSelectListener;
public BatteryChartView(Context context) { public BatteryChartView(Context context) {
@@ -254,21 +256,49 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
public boolean onTouchEvent(MotionEvent event) { public boolean onTouchEvent(MotionEvent event) {
// Caches the location to calculate selected trapezoid index. // Caches the location to calculate selected trapezoid index.
final int action = event.getAction(); final int action = event.getAction();
if (action == MotionEvent.ACTION_UP) { switch (action) {
mTouchUpEvent = MotionEvent.obtain(event); case MotionEvent.ACTION_UP:
} else if (action == MotionEvent.ACTION_CANCEL) { mTouchUpEventX = event.getX();
mTouchUpEvent = null; // reset break;
case MotionEvent.ACTION_CANCEL:
mTouchUpEventX = Float.MIN_VALUE; // reset
break;
} }
return super.onTouchEvent(event); return super.onTouchEvent(event);
} }
@Override
public boolean onHoverEvent(MotionEvent event) {
final int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_HOVER_ENTER:
case MotionEvent.ACTION_HOVER_MOVE:
final int trapezoidIndex = getTrapezoidIndex(event.getX());
if (mHoveredIndex != trapezoidIndex) {
mHoveredIndex = trapezoidIndex;
invalidate();
}
break;
}
return super.onHoverEvent(event);
}
@Override
public void onHoverChanged(boolean hovered) {
super.onHoverChanged(hovered);
if (!hovered) {
mHoveredIndex = SELECTED_INDEX_INVALID; // reset
invalidate();
}
}
@Override @Override
public void onClick(View view) { public void onClick(View view) {
if (mTouchUpEvent == null) { if (mTouchUpEventX == Float.MIN_VALUE) {
Log.w(TAG, "invalid motion event for onClick() callback"); Log.w(TAG, "invalid motion event for onClick() callback");
return; return;
} }
final int trapezoidIndex = getTrapezoidIndex(mTouchUpEvent.getX()); final int trapezoidIndex = getTrapezoidIndex(mTouchUpEventX);
// Ignores the click event if the level is zero. // Ignores the click event if the level is zero.
if (trapezoidIndex == SELECTED_INDEX_INVALID if (trapezoidIndex == SELECTED_INDEX_INVALID
|| !isValidToDraw(trapezoidIndex)) { || !isValidToDraw(trapezoidIndex)) {
@@ -347,6 +377,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
setBackgroundColor(Color.TRANSPARENT); setBackgroundColor(Color.TRANSPARENT);
mTrapezoidSolidColor = Utils.getColorAccentDefaultColor(context); mTrapezoidSolidColor = Utils.getColorAccentDefaultColor(context);
mTrapezoidColor = Utils.getDisabled(context, mTrapezoidSolidColor); mTrapezoidColor = Utils.getDisabled(context, mTrapezoidSolidColor);
mTrapezoidHoverColor = Utils.getColorAttrDefaultColor(context,
com.android.internal.R.attr.colorAccentSecondaryVariant);
// Initializes the divider line paint. // Initializes the divider line paint.
final Resources resources = getContext().getResources(); final Resources resources = getContext().getResources();
mDividerWidth = resources.getDimensionPixelSize(R.dimen.chartview_divider_width); mDividerWidth = resources.getDimensionPixelSize(R.dimen.chartview_divider_width);
@@ -494,7 +526,8 @@ public class BatteryChartView extends AppCompatImageView implements View.OnClick
? mTrapezoidColor ? mTrapezoidColor
: mSelectedIndex == index || mSelectedIndex == SELECTED_INDEX_ALL : mSelectedIndex == index || mSelectedIndex == SELECTED_INDEX_ALL
? mTrapezoidSolidColor : mTrapezoidColor; ? mTrapezoidSolidColor : mTrapezoidColor;
mTrapezoidPaint.setColor(trapezoidColor); final boolean isHover = mHoveredIndex == index && isValidToDraw(mHoveredIndex);
mTrapezoidPaint.setColor(isHover ? mTrapezoidHoverColor : trapezoidColor);
final float leftTop = round(trapezoidBottom - mLevels[index] * unitHeight); final float leftTop = round(trapezoidBottom - mLevels[index] * unitHeight);
final float rightTop = round(trapezoidBottom - mLevels[index + 1] * unitHeight); final float rightTop = round(trapezoidBottom - mLevels[index + 1] * unitHeight);

View File

@@ -139,6 +139,11 @@ public interface PowerUsageFeatureProvider {
*/ */
boolean isChartGraphSlotsEnabled(Context context); boolean isChartGraphSlotsEnabled(Context context);
/**
* Checks whether adaptive charging feature is supported in this device
*/
boolean isAdaptiveChargingSupported();
/** /**
* Gets a intent for one time bypass charge limited to resume charging. * Gets a intent for one time bypass charge limited to resume charging.
*/ */

View File

@@ -166,6 +166,11 @@ public class PowerUsageFeatureProviderImpl implements PowerUsageFeatureProvider
return false; return false;
} }
@Override
public boolean isAdaptiveChargingSupported() {
return false;
}
@Override @Override
public Intent getResumeChargeIntent() { public Intent getResumeChargeIntent() {
return null; return null;

View File

@@ -19,6 +19,8 @@ package com.android.settings.fuelgauge.batterysaver;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
import android.provider.SettingsSlicesContract; import android.provider.SettingsSlicesContract;
import android.widget.Switch; import android.widget.Switch;
@@ -42,10 +44,12 @@ import com.android.settingslib.widget.OnMainSwitchChangeListener;
public class BatterySaverButtonPreferenceController extends public class BatterySaverButtonPreferenceController extends
TogglePreferenceController implements OnMainSwitchChangeListener, LifecycleObserver, TogglePreferenceController implements OnMainSwitchChangeListener, LifecycleObserver,
OnStart, OnStop, BatterySaverReceiver.BatterySaverListener { OnStart, OnStop, BatterySaverReceiver.BatterySaverListener {
private static final long SWITCH_ANIMATION_DURATION = 350L;
private final BatterySaverReceiver mBatterySaverReceiver; private final BatterySaverReceiver mBatterySaverReceiver;
private final PowerManager mPowerManager; private final PowerManager mPowerManager;
private Handler mHandler;
private MainSwitchPreference mPreference; private MainSwitchPreference mPreference;
public BatterySaverButtonPreferenceController(Context context, String key) { public BatterySaverButtonPreferenceController(Context context, String key) {
@@ -53,6 +57,7 @@ public class BatterySaverButtonPreferenceController extends
mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mBatterySaverReceiver = new BatterySaverReceiver(context); mBatterySaverReceiver = new BatterySaverReceiver(context);
mBatterySaverReceiver.setBatterySaverListener(this); mBatterySaverReceiver.setBatterySaverListener(this);
mHandler = new Handler(Looper.getMainLooper());
} }
@Override @Override
@@ -83,6 +88,7 @@ public class BatterySaverButtonPreferenceController extends
@Override @Override
public void onStop() { public void onStop() {
mBatterySaverReceiver.setListening(false); mBatterySaverReceiver.setListening(false);
mHandler.removeCallbacksAndMessages(null /* token */);
} }
@Override @Override
@@ -114,6 +120,11 @@ public class BatterySaverButtonPreferenceController extends
@Override @Override
public void onPowerSaveModeChanged() { public void onPowerSaveModeChanged() {
mHandler.postDelayed(() -> onPowerSaveModeChangedInternal(),
SWITCH_ANIMATION_DURATION);
}
private void onPowerSaveModeChangedInternal() {
final boolean isChecked = isChecked(); final boolean isChecked = isChecked();
if (mPreference != null && mPreference.isChecked() != isChecked) { if (mPreference != null && mPreference.isChecked() != isChecked) {
mPreference.setChecked(isChecked); mPreference.setChecked(isChecked);

View File

@@ -64,7 +64,10 @@ public class BatteryManagerPreferenceController extends BasePreferenceController
preference.setSummary(mContext.getResources().getQuantityString( preference.setSummary(mContext.getResources().getQuantityString(
R.plurals.battery_manager_app_restricted, num, num)); R.plurals.battery_manager_app_restricted, num, num));
} else { } else {
preference.setSummary(R.string.battery_manager_summary); preference.setSummary(
mPowerUsageFeatureProvider.isAdaptiveChargingSupported()
? R.string.battery_manager_summary
: R.string.battery_manager_summary_unsupported);
} }
} }
} }

View File

@@ -0,0 +1,84 @@
/*
* 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.accessibility;
import static com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity.VISION_FRAGMENT_NO;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.content.Intent;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R;
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupdesign.GlifLayout;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link AccessibilityScreenSizeForSetupWizardActivity} */
@RunWith(RobolectricTestRunner.class)
public class AccessibilityScreenSizeForSetupWizardActivityTest {
private static final int DISPLAY_SIZE_FRAGMENT_NO = 1;
private Context mContext = ApplicationProvider.getApplicationContext();
private AccessibilityScreenSizeForSetupWizardActivity mActivity;
@Before
public void setup() {
final Intent intent = new Intent();
intent.putExtra(VISION_FRAGMENT_NO,
mContext.getResources().getInteger(R.integer.suw_font_size_fragment_no));
mActivity = Robolectric.buildActivity(AccessibilityScreenSizeForSetupWizardActivity.class,
intent).create().get();
}
@Test
public void generateHeader_setPageNoAsFontSize_returnFontSizeTitle() {
mActivity.generateHeader(
mActivity.getResources().getInteger(R.integer.suw_font_size_fragment_no));
final GlifLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
assertThat(layout.getHeaderText()).isEqualTo(mContext.getText(R.string.title_font_size));
}
@Test
public void generateHeader_setPageNoAsDisplaySize_returnDisplaySizeTitle() {
mActivity.generateHeader(DISPLAY_SIZE_FRAGMENT_NO);
final GlifLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
assertThat(layout.getHeaderText()).isEqualTo(mContext.getText(R.string.screen_zoom_title));
}
@Test
public void initFooterButton_generateDoneButton() {
mActivity.initFooterButton();
final GlifLayout layout = mActivity.findViewById(R.id.setup_wizard_layout);
final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class);
assertThat(mixin.getPrimaryButton().getText()).isEqualTo(mContext.getText(R.string.done));
}
}

View File

@@ -16,6 +16,7 @@
package com.android.settings.accessibility; package com.android.settings.accessibility;
import static com.android.settings.accessibility.AccessibilityScreenSizeForSetupWizardActivity.VISION_FRAGMENT_NO;
import static com.android.settings.accessibility.AccessibilitySettingsForSetupWizardActivity.CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW; import static com.android.settings.accessibility.AccessibilitySettingsForSetupWizardActivity.CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
@@ -26,8 +27,6 @@ import android.content.Intent;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.display.FontSizePreferenceFragmentForSetupWizard;
import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -46,7 +45,8 @@ public class AccessibilitySettingsForSetupWizardActivityTest {
public void createSetupAccessibilityActivity_shouldBeSUWTheme() { public void createSetupAccessibilityActivity_shouldBeSUWTheme() {
final Intent intent = new Intent(); final Intent intent = new Intent();
AccessibilitySettingsForSetupWizardActivity activity = AccessibilitySettingsForSetupWizardActivity activity =
Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class, intent).get(); Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
intent).get();
assertThat(activity.getThemeResId()).isEqualTo(R.style.GlifV3Theme_Light); assertThat(activity.getThemeResId()).isEqualTo(R.style.GlifV3Theme_Light);
} }
@@ -56,16 +56,17 @@ public class AccessibilitySettingsForSetupWizardActivityTest {
AccessibilitySettingsForSetupWizardActivity activity = AccessibilitySettingsForSetupWizardActivity activity =
Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class, Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName( new Intent(Intent.ACTION_MAIN).setComponent(new ComponentName(
RuntimeEnvironment.application, CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW)). RuntimeEnvironment.application,
putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true). CLASS_NAME_FONT_SIZE_SETTINGS_FOR_SUW))
putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get(); .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
activity.tryLaunchFontSizeSettings(); activity.tryLaunchFontSizeSettings();
final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity(); final Intent launchIntent = Shadows.shadowOf(activity).getNextStartedActivity();
assertThat(launchIntent).isNotNull(); assertThat(launchIntent).isNotNull();
assertThat(launchIntent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT)).isEqualTo( assertThat(launchIntent.getIntExtra(VISION_FRAGMENT_NO, -1)).isEqualTo(
FontSizePreferenceFragmentForSetupWizard.class.getName()); activity.getResources().getInteger(R.integer.suw_font_size_fragment_no));
assertThat(activity.isFinishing()).isTrue(); assertThat(activity.isFinishing()).isTrue();
} }
@@ -73,9 +74,9 @@ public class AccessibilitySettingsForSetupWizardActivityTest {
public void onCreate_noFontSizeComponent_shouldNotFinishCurrentActivity() { public void onCreate_noFontSizeComponent_shouldNotFinishCurrentActivity() {
AccessibilitySettingsForSetupWizardActivity activity = AccessibilitySettingsForSetupWizardActivity activity =
Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class, Robolectric.buildActivity(AccessibilitySettingsForSetupWizardActivity.class,
new Intent(Intent.ACTION_MAIN). new Intent(Intent.ACTION_MAIN)
putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true). .putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, true)
putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get(); .putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)).get();
activity.tryLaunchFontSizeSettings(); activity.tryLaunchFontSizeSettings();

View File

@@ -0,0 +1,53 @@
/*
* 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.accessibility;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import android.content.Context;
import android.graphics.drawable.Drawable;
import androidx.test.core.app.ApplicationProvider;
import com.google.android.setupdesign.GlifPreferenceLayout;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
/** Tests for {@link AccessibilitySetupWizardUtils} */
@RunWith(RobolectricTestRunner.class)
public class AccessibilitySetupWizardUtilsTest {
private final Context mContext = ApplicationProvider.getApplicationContext();
@Test
public void setupGlifPreferenceLayout_assignValueToVariable() {
final String title = "title";
final String description = "description";
final Drawable icon = mock(Drawable.class);
GlifPreferenceLayout layout = mock(GlifPreferenceLayout.class);
AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(mContext, layout, title,
description, icon);
verify(layout).setHeaderText(title);
verify(layout).setDescriptionText(description);
verify(layout).setIcon(icon);
verify(layout).setHeaderText(title);
}
}

View File

@@ -152,7 +152,8 @@ public class BrightnessLevelPreferenceControllerTest {
System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC); System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
when(mDisplay.getBrightnessInfo()).thenReturn( when(mDisplay.getBrightnessInfo()).thenReturn(
new BrightnessInfo(0.1f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF)); new BrightnessInfo(0.1f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
0.5f));
mController.updateState(mPreference); mController.updateState(mPreference);
@@ -166,7 +167,8 @@ public class BrightnessLevelPreferenceControllerTest {
System.SCREEN_BRIGHTNESS_MODE_MANUAL); System.SCREEN_BRIGHTNESS_MODE_MANUAL);
when(mDisplay.getBrightnessInfo()).thenReturn( when(mDisplay.getBrightnessInfo()).thenReturn(
new BrightnessInfo(0.5f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF)); new BrightnessInfo(0.5f, 0.0f, 1.0f, BrightnessInfo.HIGH_BRIGHTNESS_MODE_OFF,
0.5f));
mController.updateState(mPreference); mController.updateState(mPreference);

View File

@@ -29,6 +29,7 @@ import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResources;
import com.android.settings.testutils.shadow.ShadowActivityEmbeddingUtils;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -43,7 +44,7 @@ import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.shadows.ShadowPackageManager;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@Config(shadows = {SettingsShadowResources.class}) @Config(shadows = {SettingsShadowResources.class, ShadowActivityEmbeddingUtils.class})
public class TopLevelWallpaperPreferenceControllerTest { public class TopLevelWallpaperPreferenceControllerTest {
private static final String TEST_KEY = "test_key"; private static final String TEST_KEY = "test_key";
@@ -204,18 +205,32 @@ public class TopLevelWallpaperPreferenceControllerTest {
} }
@Test @Test
public void handlePreferenceTreeClick_launchClearTask() { public void handlePreferenceTreeClick_embeddingActivityDisabled_launchWithTaskFlag() {
mShadowPackageManager.setResolveInfosForIntent( ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(false);
mWallpaperIntent, Lists.newArrayList());
mShadowPackageManager.setResolveInfosForIntent( mShadowPackageManager.setResolveInfosForIntent(
mStylesAndWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class))); mStylesAndWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
Preference preference = new Preference(mContext); Preference preference = new Preference(mContext);
preference.setKey(TEST_KEY); preference.setKey(TEST_KEY);
mController.handlePreferenceTreeClick(preference); mController.handlePreferenceTreeClick(preference);
assertThat((Shadows.shadowOf(mContext).getNextStartedActivityForResult() int flags = Shadows.shadowOf(mContext).getNextStartedActivityForResult().intent.getFlags();
.intent.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TASK) != 0).isTrue(); assertThat((flags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0).isTrue();
assertThat((flags & Intent.FLAG_ACTIVITY_CLEAR_TASK) != 0).isTrue();
}
@Test
public void handlePreferenceTreeClick_embeddingActivityEnabled_launchWithoutTaskFlag() {
ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true);
mShadowPackageManager.setResolveInfosForIntent(
mStylesAndWallpaperIntent, Lists.newArrayList(mock(ResolveInfo.class)));
Preference preference = new Preference(mContext);
preference.setKey(TEST_KEY);
mController.handlePreferenceTreeClick(preference);
int flags = Shadows.shadowOf(mContext).getNextStartedActivityForResult().intent.getFlags();
assertThat((flags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0).isFalse();
assertThat((flags & Intent.FLAG_ACTIVITY_CLEAR_TASK) != 0).isFalse();
} }
} }

View File

@@ -156,6 +156,11 @@ public class PowerUsageFeatureProviderImplTest {
assertThat(mPowerFeatureProvider.isSmartBatterySupported()).isFalse(); assertThat(mPowerFeatureProvider.isSmartBatterySupported()).isFalse();
} }
@Test
public void testIsAdaptiveChargingSupported_returnFalse() {
assertThat(mPowerFeatureProvider.isAdaptiveChargingSupported()).isFalse();
}
@Test @Test
public void testGetResumeChargeIntent_returnNull() { public void testGetResumeChargeIntent_returnNull() {
assertThat(mPowerFeatureProvider.getResumeChargeIntent()).isNull(); assertThat(mPowerFeatureProvider.getResumeChargeIntent()).isNull();

View File

@@ -0,0 +1,41 @@
/*
* 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.testutils.shadow;
import android.content.Context;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
/**
* Shadow class for {@link ActivityEmbeddingUtils} to test embedding activity features.
*/
@Implements(ActivityEmbeddingUtils.class)
public class ShadowActivityEmbeddingUtils {
private static boolean sIsEmbeddingActivityEnabled;
@Implementation
public static boolean isEmbeddingActivityEnabled(Context context) {
return sIsEmbeddingActivityEnabled;
}
public static void setIsEmbeddingActivityEnabled(boolean isEmbeddingActivityEnabled) {
sIsEmbeddingActivityEnabled = isEmbeddingActivityEnabled;
}
}